목록BE (354)
오봉이와 함께하는 개발 블로그
쓰레드 로컬 - 주의사항 쓰레드 로컬 값을 사용 후 제거하지 않고 그냥 두면 WAS(톰캣)처럼 쓰레드 풀을 사용하는 경우 심각한 문제가 발생할 수 있다. 사용자A 저장 요청 사용자A가 저장 HTTP를 요청했다. WAS는 쓰레드 풀에서 쓰레드를 하나 조회한다. 쓰레드 thread-A 가 할당되었다. thread-A 는 사용자A 의 데이터를 쓰레드 로컬에 저장한다. 쓰레드 로컬의 thread-A 전용 보관소에 사용자A 데이터를 보관한다. 사용자A 저장 요청 종료 사용자A의 HTTP 응답이 끝난다. WAS는 사용이 끝난 thread-A 를 쓰레드 풀에 반환한다. 쓰레드를 생성하는 비용은 비싸기 때문에 쓰레드를 제거하지 않고, 보통 쓰레드 풀을 통해서 쓰레드를 재사용한다. thread-A 는 쓰레드풀에 아직 살..
쓰레드 로컬 동기화 - 개발 기존 FieldLogTrace에서 발생한 동시성 문제를 ThreadLocal을 통해 해결하자 TraceId traceIdHolder 필드를 쓰레드 로컬을 사용하도록 ThreadLocal traceIdHolder 로 변경하면 된다. ThreadLocalLogTrace @Slf4j public class ThreadLocalLogTrace implements LogTrace { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "
ThreadLocal - 소개 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소다. 일반적인 변수 필드 thread-A가 userA라는 값을 저장하고 thread-B가 userB라는 값을 저장하면 userA는 사라진다. 쓰레드 로컬 간단하게 그림으로 표현하면 아래와 같다. 자바는 언어차원에서 쓰레드 로컬을 지원하기 위한 java.lang.ThreadLocal 클래스를 제공한다. ThreadLocal - 에제 코드 ThreadLocalService package com.example.advanced.trace.threadlocal.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class ThreadLocalService { private Threa..
동시성 문제 - 예제 코드 테스트에서도 lombok을 사용하기 위해 다음 코드를 추가하자. build.gradle dependencies { ... //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } 이렇게 해야 테스트 코드에서 @Slfj4 같은 애노테이션이 작동한다. FieldService(테스트 코드) package com.example.advanced.trace.threadlocal.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class FieldService { private String name..
필드 동기화 - 적용 LogTrace 스프링 빈 등록 컴포넌트 스캔을 사용하지 않고 수동으로 빈을 등록하면 향후 구현체를 편하게 변경할 수 있는 장점이 있다. 이후 V2 -> V3로 복사하자. LogTraceConfig @Configuration public class LogTraceConfig { @Bean public LogTrace logTrace() { return new FiledLogTrace(); } } V2 -> V3 코드 @RestController @RequiredArgsConstructor public class OrderControllerV3 { private final OrderServiceV3 orderService; private final LogTrace trace; @Get..