728x90

ThreadLocal 3

threadContextInheritable

사내 레거시 프로젝트 마이그레이션을 위해 분석하던 중 아래와 같은 설정이 보였다. @Configuration public class WebConfig { @Bean public ServletRegistrationBean servletRegistration(ServletRegistrationBean registration) { registration.setLoadOnStartup(1); registration.addInitParameter("threadContextInheritable", "true"); return registration; } } Dispatchservlet의 threadContextInheritable 값을 true로 바꾸는 것인데 threadContextInheritable는 Requ..

Backend/Spring+Boot 2021.04.23

RequestContextHolder

RequestContextHolder 는 Spring 컨텍스트에서 HttpServletRequest 에 직접 접근할 수 있도록 도와주는 역할을 한다. Spring 2.x 부터 제공되던 기능으로 이를 활용하면 HttpServletRequest 사용하기 위해 이를 메소드 파라미터로 연이어 넘겨받을 필요가 없다. 예를 들어 RequestContextHolder 를 사용하지 않고 Service 단에서 HttpServletRequest 를 참조해야 한다고 하면 아래와 같이 해야 한다. @RestController @RequiredArgsConstructor @Log4j2 public class TestController { private final TestService testService; @GetMapping..

Backend/Spring+Boot 2021.04.23

ThreadLocal

Java에서 Thread의 로컬 컨텍스트 변수로 Thread 가 존재하는 한 계속해서 남아 있는 변수이다. ThreadPool 에서 Thread를 관리하며 request당 하나의 Thread 를 사용하는 웹서버 특성상 하나의 request에서 공유되는 변수라고 생각하면 된다. 이걸 어디에 활용할 수 있나? 예를 들어 클래스끼리 전역으로 참조하고 싶은 데이터가 있다고 생각해보자. java에서 가장 먼저 떠오르는 것은 static 변수이다. 하지만 static 변수는 모든 Thread 에서 공유되고 웹서버는 기본적으로 Multi Thread 방식이기 때문에 Thread Safe 하지 않다. 이때 Thread Local 을 사용할 경우 클래스끼리 전역적으로 참조할 수 있지만 다른 Thread에서는 참조할 수 ..

Backend/Java 2021.03.16
728x90