• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

싱글톤 빈과 request scope 빈

24.03.23 19:12 작성 24.03.23 19:14 수정 조회수 127

0

컨트롤러 빈은 싱글톤이고, 여기에 Provider로 매 클라이언트의 요청시마다 새로운 request scope빈을 생성해 주입해준다는 것 까지는 이해했습니다.

 

그런데 강의 7:40처럼 메서드 logDemo를 호출하는 메인 쓰레드를 sleep()하고 그 사이 여러번 요청을 했을때, 쓰레드가 깨어나면서 각 요청마다 새로운 request scope빈이 생성되고 다시 여러번 종료되는 것이 이해가 되지 않습니다.

 

컨트롤러 빈은 싱글톤이라, 다음번 새로운 request빈이 들어올 때까지는 전의 request빈의 주소값을 갖고 있을텐데 어떤 과정으로 싱글톤빈의 log-Demo실행 중 내부 주입되는 request빈이 교체될 수 있을까요?

 

컨텍스트 스위칭처럼 logDemo의 실행간 내부 주입되는 빈이 교체되는 건가요?

 

 

답변 2

·

답변을 작성해보세요.

1

David님의 프로필

David

2024.03.24

안녕하세요. 조현진님, 공식 서포터즈 David입니다.

스프링 부트에서 사용되는 톰캣은 멀티스레드로 요청을 처리합니다.

5분 38초쯤을 보시면, 동시에 요청이 4개가 오면 스레드도 4개가 기다릴 것이다 라는 말이 핵심입니다.

4개가 모두 각각 스택 프레임을 갖고, 서로 다른 요청 스코프 빈을 가지게 됩니다.

감사합니다.

조현진님의 프로필

조현진

질문자

2024.03.25

이해되었습니다 감사합니다!!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.23

안녕하세요, 인프런 AI 인턴입니다.

조현진님께서 질문하신 내용은 싱글톤 빈과 request scope 빈의 관계, 특히 여러 HTTP 요청에 대해 싱글톤 컨트롤러 내에서 어떻게 각각의 요청에 맞는 새로운 request scope 빈이 주입되며 관리되는지에 대한 궁금증으로 이해됩니다.

이와 관련하여, 제공된 질문들 중 하나는 싱글톤 빈과 request scope 빈이 어떻게 함께 동작하는지에 대한 명확한 설명을 포함하고 있습니다. 싱글톤 빈의 경우 애플리케이션의 생명주기와 같이 존재하며, request scope 빈은 각각의 HTTP 요청에 생성되어 해당 요청이 종료될 때까지만 생존합니다. 여기서 핵심은 request scope 빈의 생명주기가 HTTP 요청과 직접 연결되어 있다는 점입니다.

질문하신 내용을 바탕으로 request 스코프와 ObjectProvider 관련하여 설명할 수 있는 내용도 포함됩니다. ObjectProvider를 사용하면 HTTP 요청이 들어올 때까지 request scope 빈의 생성을 지연할 수 있습니다. 즉, 싱글톤 빈 내에서 ObjectProvider의 getObject() 메소드를 호출하는 그 순간에 실제로 request scope 빈이 생성되어 반환됩니다. 이것이 여러 HTTP 요청에 걸쳐 서로 다른 request scope 빈이 싱글톤 컨트롤러에 주입될 수 있는 메커니즘입니다.

관련 질문으로, request 스코프와 ObjectProvider 이해 에서 유사한 궁금증에 대한 답변을 찾을 수 있습니다. 이 답변은 ObjectProvider를 사용하여 request 스코프 빈의 생성 시기를 제어하는 방법을 설명하고 있으며, 이 과정이 어떻게 여러 HTTP 요청에 걸쳐 동작하는지를 잘 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

조현진님의 프로필

조현진

질문자

2024.03.23

제가 궁금했던 내용은 스택 프레임에 쌓인 logDemo에서 1번째 요청에 해당하는 request scope bean이 생성되어 주입되고, 해당 logDemo가 스택에서 사라지기 전에 다시 logDemo가 호출되어 2번째 요청에 대한 request scope bean이 싱글톤 빈 내에 저장되는 과정입니다.

Thread.sleep으로 메인쓰레드가 1초동안 쉰다고 해도 새로운 쓰레드를 호출하는 코드가 있는건 아니라서 싱글톤 빈인 컨트롤러 내부에는 그대로 1번째 요청에 대한 request scope bean이 남아있고, 이후 실행 흐름에 따라 1번째 요청에 대한 logDemo메서드가 종료되어야 하는게 아닌가요?? 이 부분이 이해가 안됩니다.

혹은 http 요청마다 새로운 쓰레드가 실행되나요? 그래서 각 쓰레드마다 그때그때 싱글톤 빈에 요청에 맞는 request scope빈을 주입하나요?