spring boot/spring boot 제대로 활용하기

그대는 springboot 를 제대로 활용하고 있는가

Hello World Study 2024. 11. 23. 16:49

아래 강의의 요약 자료입니다.

 

inflearn: 

https://inf.run/p6yzJ

 

[지금 무료]그대는 springboot 를 제대로 활용하고 있는가? 강의 | Hello World - 인프런

Hello World | springboot 자동설정으로 해결되는 문제들을 확인해보고, 특별한 이유가 없으면 springboot 자동설정과 연동되도록 개발해야 겠구나! 라고 깨닫게 됩니다., spring boot 자동설정 제대로 활용

www.inflearn.com

 

youtube:

https://youtu.be/LyoHndU_iac

 

 

git: https://github.com/ChunGeun-Yu/springboot-usingwell

 

GitHub - ChunGeun-Yu/springboot-usingwell

Contribute to ChunGeun-Yu/springboot-usingwell development by creating an account on GitHub.

github.com

 

ObjectMapper

LocalDateTime 직렬화 문제있는 설정:

@Bean
public ObjectMapper objectMapper() {
	return new ObjectMapper();
}

 

 

 

LocalDateTime 을 설정한 bean을 등록하는 예제:

@Bean
public ObjectMapper objectMapper() {
	ObjectMapper objectMapper = new ObjectMapper();

	JavaTimeModule javaTimeModule = new JavaTimeModule();

	LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyyMMdd hhmmss.SSS"));
	javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer);
	objectMapper.registerModule(javaTimeModule);

	return  objectMapper;
}

 

 

Jackson2ObjectMapperBuilderCustomizer 을 통해 LocalDateTime 직렬화부분만 설정하는 예제:

@Bean
public Jackson2ObjectMapperBuilderCustomizer objectMapperBuilderCustomizer() {
	return new Jackson2ObjectMapperBuilderCustomizer() {
		@Override
		public void customize(Jackson2ObjectMapperBuilder builder) {
			LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyyMMdd hhmmss.SSS"));

			builder.serializerByType(LocalDateTime.class, localDateTimeSerializer);
		}
	};
}

 

 

Jackson2ObjectMapperBuilder 에 LocalDateTime 직렬화부분만 설정하는 예제:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
	LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyyMMdd hhmmss.SSS"));

	return builder
			.serializerByType(LocalDateTime.class, localDateTimeSerializer)
			.build();
}

 

 

RestTemplate

traceId 전파안되는 RestTemplate 설정:

@Bean
public RestTemplate restTemplate() {
	RestTemplate restTemplate = new RestTemplate();
	return restTemplate;
}

 

 

RestTemplateBuilder 를 이용해서 bean 등록하는 설정:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
	return builder.build();
}

 

 

RestClient

 

traceId 전파 안되는 설정:

@Bean
public RestClient restClient() {
	return RestClient.create();
}

 

 

 

RestClient.Builder 을 이용해서 bean 등록하는 예제:

@Bean
public RestClient restClient(RestClient.Builder builder) {
	return builder.build();
}

 

 

ThreadPoolTaskExecutor

 

threadlocal 복사하는 TaskDecorator:

public class ThreadLocalCopyTaskDecorator implements TaskDecorator {
    @Override
    public Runnable decorate(Runnable runnable) {

        Map<String, String> map = MDC.getCopyOfContextMap();

        return new Runnable() {
            @Override
            public void run() {
                if (map != null)
                    MDC.setContextMap(map);
                try {
                    runnable.run();
                } finally {
                    MDC.clear();
                }

            }
        };
    }
}

 

 

TaskDecorator 직접 지정하는 예제:

@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolTaskExecutorBuilder builder) {
	
	ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
	executor.setThreadNamePrefix("myThread-");
	executor.setTaskDecorator(new ThreadLocalCopyTaskDecorator());
	executor.initialize();
	return executor;
}

 

TaskDecorator 만 직접 등록하고, 나머지는 springboot 에 위임하는 예제:

@Bean
public TaskDecorator myTaskDecorator() {
	return new ThreadLocalCopyTaskDecorator();
}

 

yml 을 통해 ThreadPoolTaskExecutor 설정하는 예제:

spring:
  task:
    execution:
      thread-name-prefix: myTask-