[서버] 스프링 Controller와 request, thread에 대한 정보
스프링에서 프레임워크에 의해 관리되는 Bean들은 기본적으로 Singleton 으로 생성되고 관리됩니다.
Controller도 마찬가지 입니다. 다수의 HTTP request를 받으면 Controller가 어떻게 처리할까 궁금했는데 아래의 자료에서 간단한 실험을 통해 잘 정리해놨습니다.(영어)
programmer.group/spring-controller-singletons-and-thread-safe-things.html
하나의 singleton Controller가 어떻게 수많은 request를 처리할 수 있을까? 라고 생각할 수 있지만, 이렇게 접근하면 안되는 것 같습니다.
Spring framework는 request를 받으면 tomcat에 의해 Thread를 전달받습니다.
여러 request가 발생하면 여러 Thread가 생성될 것입니다. 이 각각의 Thread가 singleton으로 생성된 Bean(Controller 포함)들을 참고하여 일을 하는 것이죠.
다시 정리하면, 하나의 Singleton Controller가 수많은 request를 처리한다기 보다 각각의 Thread가 singleton으로 생성된 Controller를 참고하여 실행한다고 보면 되겠습니다.
좀 더 자세히보면, JVM 구조에서 Runtime data area의 Method area(함수와 클래스 정보가 있는)를 참고 할 것 같습니다. 여기는 여러 쓰레드들이 모두 접근 가능한 영역이니까요.
각 쓰레드 간에 공유되어야 하는 값이 있으면 클래스 레벨의 변수로 혹은 static 변수로 선언하면 될 것 같습니다.
보통은 @RequestMapping으로 호출되는 함수가 불리고 로컬 변수로써 Stack에 생성되므로 쓰레드 간에 공유가 되지 않아 문제가 없습니다.
@RestController
@RequestMapping(value="v1/auth")
public class AuthServiceController {
private static final Logger logger = LoggerFactory.getLogger(AuthServiceController.class);
@RequestMapping(value="/{accountType}/{accessToken}/{userId}",method = RequestMethod.GET)
public AuthResult getAuthStatus(@PathVariable("accountType") String accountType, @PathVariable("accessToken") String accessToken, @PathVariable("userId") String userId) {
logger.debug("Entering the getAuthStatus() method for the userId: {}",userId);
AuthResult authResult = isValidAccessToken(accountType, accessToken, userId, false);
return authResult;
}
}
참고
gmlwjd9405.github.io/2018/11/10/spring-beans.html
www.linkedin.com/pulse/static-variables-methods-java-where-jvm-stores-them-kotlin-malisciuc/
댓글 영역