인프런 커뮤니티 질문&답변

이용조님의 프로필 이미지
이용조

작성한 질문수

스프링 핵심 원리 - 기본편

스코프와 Provider

request 스코프 문의드립니다..

작성

·

163

1

안녕하세요! 첫 질문글 이네요.. 

우선 항상 좋은강의 정말 잘 듣고 있어서, 정말 감사드립니다.

강의덕에 개발이 더 재밌고, 예전보다는 발전하고 있다는 생각이 드네요.. 감격~ ㅎㅎ

강의를 듣다가.. 궁금한 부분이 생겨서 문의드려요..원래 보통 찾아보는데, 검색하기가 좀 애매한것 같아서요

제가 궁금한 것은, ObjectProvider의 동작 원리입니다. 

우선 제가 이해한 것은 스프링이 시작되고, 컨테이너가 만들어지고 어노테이션을 읽어들이며...

@Component에 @Scope(value = "request")가 붙어 있으면 객체를 바로 싱글턴으로 생성하지는 않지만, 스프링이 관리하는 대상 클래스 타입 리스트?에 올려놓는것 이라 생각하겠습니다.

이후에, ObjectProvider<MyLogger> 객체의 getObject같은 함수가 실행되면 내부적으로는 정확하진 않지만 컨테이너에서 getBean을 요청하는 것이라 생각하겠습니다.;

이때, 객체가 없으면 새로 만들어서 주는것이고 있으면 있는것을 그대로 리턴해준다고 생각하겠습니다.

여기서 좀 햇갈리게 된게.. 싱글턴 객체면 상관이 없는데.. request는 각기 다른 요청 갯수만큼 만들어지는 것이잖아요? 요청이 끝나면 파괴된다고 하지만..

예를들어 서비스로직이 10초가 걸리는데(thread.sleep(10000)) 이때 동시에 요청이 2개 발생하고 프로바이더.getObject()를 하면 10초동안은 스프링 컨테이너에는 2개의 빈이 존재하는것이라고 배웠습니다...

여기서 햇갈리는게, 첫번째 요청이 들어오면 컨트롤러에서 myLoggerProvider.getObject(); 하는순간 빈이 만들어 질테고,

이 빈이 소멸되지 않은 상태에서 바로 두번째 요청이 들어오면.. 컨테이너에는 빈이 있지만, 자신요청에 해당하지 않는 빈이란것을 알고 새로 만드는 것과...

그다음에 서비스 로직에서 또 myLoggerProvider.getObject();하면 같은 타입의 빈이 컨테이너에 2개 잇는 상태에서 자신이 진짜 사용할 빈을 자동으로 반환 받는 과정이.. 궁금하더라구요.

이게 코드에는 힌트가 없이 내부적으로 그냥 이런식으로 동작해주는것 같은데.. 그냥 추측만 할뿐이네요;

getObject의 구현체가 내부적으로 요청하는 함수(정확히는 쓰레드가 맞겟네욤)에 맞는 객체를 분류해서 리턴해주는 기능처럼.. 구현되어 있는것이 맞을까요?

원리는 잘 모르겠지만, 강의 내용중 쓰레드로컬 말씀하신걸 보면.. 이름에서 주는 느낌처럼 getObect를 요청할때 요청하는 쓰레드 종류까지 기억하고 있다가 해당하는 쓰레드에 맞는 빈을 반환하는.. 뭐이런식이지 않을까 생각들긴 하는데 확실치 않아서요..

이부분 관련해서 검색해보고 싶은데, 찾아보기가 좀 어렵네요... 

(디버그해보면서 구현체 까보고 싶은데, 이클립스만 써봐서 인텔리제이가 익숙치 않아서 힘듭니다 ㅠㅠ)

다른 강의 들으면 혹시 더 알 수 있는 내용일까요? 예전에 빈 싱글턴 들으면서 싱글턴 객체에 멤버변수 있으면 어쩌지? 한참 고민하다가 그냥 다음강의 들으면서 알게 됐었는데...

이건 이제 곧 완강이라 문의드려욤ㅎㅎ

앞으로 들으면서 좀 감이 안오는 부분은 정리해서 질문 많이 드릴게요 ㅎㅎ;

다시한번 말씀드리지만 정말 많이 배우고 있습니다 ㅎㅎ

곧 스프링 부트랑 JPA강의 수강할껀데.. 그때도 궁금한거 있으면 많이 여쭤볼게요 ^^;

그럼 감사드립니다.~~

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 용조님 좋은 질문입니다.

먼저 생각하신 내용이 다 맞습니다^^

이 부분을 명확하게 이해하려면 쓰레드 마다 각각 다른 저장소를 사용하는 멀티쓰레드 디자인 패턴 중에 하나인 ThreadLocal 이라는 개념을 학습하셔야 합니다.

관련해서 ThreadLocal로 검색해보시면 원하는 답을 찾으실 수 있을거에요^^

화이팅!

이용조님의 프로필 이미지
이용조

작성한 질문수

질문하기