inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

스코프와 Provider

싱글톤 빈과 request scope 빈

해결된 질문

378

조현진

작성한 질문수 1

0

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

 

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

 

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

 

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

 

 

spring 객체지향

답변 2

1

David

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

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

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

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

감사합니다.

0

조현진

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

0

인프런 AI 인턴

안녕하세요, 인프런 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 요청에 걸쳐 동작하는지를 잘 설명하고 있습니다.

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

0

조현진

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

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

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

 

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

47

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

72

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

87

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

79

1

테스트 속도가 나중에 영향이 있을까요?

0

75

1

gradle 설정 안떠서 질문 남깁니다!

0

116

2

build.gradle로 프로젝트를 여는 이유

0

81

1

provider 사용하는 이유

0

85

1

다음 강의 뭘 들어야 할까요

0

123

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

62

1

beanB

0

79

2

퀴즈다시풀기

0

63

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

90

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

63

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

102

2

도메인의 정의?

0

57

1

ApplicationContext 질문입니다.

0

60

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

86

2

ai api 선정하기 관련 질문

0

115

2

생성자 자동주입 관련해서

0

60

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

93

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

63

1

12:25

0

74

2

appConfig.xml 오류

0

124

1