[서버] 스프링 Controller와 request, thread에 대한 정보

프로그래밍/서버2021. 2. 23. 21:08

스프링에서 프레임워크에 의해 관리되는 Bean들은 기본적으로 Singleton 으로 생성되고 관리됩니다.

Controller도 마찬가지 입니다. 다수의 HTTP request를 받으면 Controller가 어떻게 처리할까 궁금했는데 아래의 자료에서 간단한 실험을 통해 잘 정리해놨습니다.(영어)

 

programmer.group/spring-controller-singletons-and-thread-safe-things.html

 

Spring Controller singletons and thread-safe things

Keywords: Java Spring REST Session Catalog singleton scope Each controller that adds @RestController or @Controller defaults to singleton, which is also the default scope for Spring Bean. The following code example references Building a RESTful Web Service

programmer.group

하나의 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

 

[Spring] Spring Bean의 개념과 Bean Scope 종류 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

www.linkedin.com/pulse/static-variables-methods-java-where-jvm-stores-them-kotlin-malisciuc/

 

Static variables and methods in Java. Where JVM stores them. Static in Kotlin. | by Maxim M. | LinkedIn

Published: December 5, 2018. Java memory model. Static variables and where they are stored + use-cases.

www.linkedin.com

 

작성자

Posted by 드리머즈

관련 글

댓글 영역