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

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

스프링 핵심 원리 - 기본편

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

자동빈등록 질문드립니다

작성

·

196

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
11분 48초를 보면,

스프링컨테이너를 생성할때 생성자 파라미터를 넘겨주는건 컴포넌트 스캔을 해주는것이고, 자동빈등록이 된다고 말씀하시는데

지금까지 설명해주신거를 바탕으로 되돌아보면 스프링컨테이너를 생성할때 생성자 파라미터로 넘겨주는건 직접 스프링빈으로 등록하는것이라고 알고있었는데,

왜 @Component가 없는데 왜 이게 컴포넌트 스캔을 해주는것이고 ,직접빈등록이 아닌 자동빈등록인건지 질문드립니다

답변 1

0

안녕하세요. gomdole03님, 공식 서포터즈 OMG입니다.
.

프로토타입 스코프(링크)
위 링크 9분부터 참고해보시겠어요?

영한님께서도 질문남기신 내용에 대해 @Component가 없어도, 컴포넌트 스캔(=자동빈등록) 처럼 동작한다고 말씀하시는데요. 제가 생각했을 때 "처럼" 이라는 말씀이 키워드가 될 것 같습니다.

강의에서 배웠던 자동 빈등록은 아니지만 내부적으로 그와 유사하게 동작하여 결국 스프링 빈으로 등록을 해준다 라고 이해하시면 될 것 같아요.

.
감사합니다.

오리쉐리님의 프로필 이미지
오리쉐리
질문자

그럼 스프링컨테이너를 생성할때 생성자 파라미터를 넘겨주는건 자동빈등록처럼 스프링빈으로 등록되긴하지만 엄연히 말하면 자동등록하는게 아닌 직접등록(수동등록)하는건가요?

이 부분은 AnnotationConfigApplicationContext 클래스 코드를 확인해 보면 감이 잡히실텐데요,

코드 안에 영한님이 하신 말씀과 왜 제가 "처럼"을 키워드라고 한지 알 수있습니다.

AnnotationConfigApplicationContext는 총 4개의 생성자를 가집니다.

image

기본 생성자를 제외한 3개 중 가운데인 Class<?>... componentClasses 로 스프링 컨테이너를 생성하는 건 이해하시리라 생각합니다.

image생성자 코드를 보면,

1- 기본생성자를 호출하고

2- 인자로 받은 컴포넌트클래스를 등록하고 (ClientBean, ProtoTypeBean)

3- 리프레시

총 3라인의 코드가 실행됩니다.

 

빈 등록이 관심사이므로 3 리프레시를 제외하고 1,2 단계만 설명드리겠습니다.

(refresh의 동작이 궁금하실 경우 직접 분석해보시는 거도 실력 성장에 도움이 될거라 생각하오니 한번 보시길 권장드려요^^)

 

image

기본생성자에서 보셔야 할 것은 scanner를 생성하는 코드인데요,

registry로 스프링컨테이너 자신을 인자로하여 ClassPathBeanDefinitionScanner를 생성합니다.

image

인자로 받은 빈팩토리나, 스프링컨테이너를 클래스패스에서 빈으로 등록될 클래스를 감지합니다.

-

여기까지의 과정을 한줄로 정리하면 "인자로 받은 컴포넌트 클래스를 스캔 한다" 라고 할 수 있을 것 같은데요.

여기까지 각 클래스와 메서드의 역할만 보더라도 감이 오실거라 생각하고, 빈을 등록하는 코드는 간략히 설명드리겠습니다.

 

register()를 보면, 빈을 등록하는 코드들이 실행되는데요, 인자로 받은 componentClasses는

register에서는 @Configuration과 같은 자동 스캔의 대상이 되는 클래스로 인지하고 진행이 됩니다.

(밑의 javadoc 참고)

image

 

직접 빈으로 등록할 컴포넌트 클래스(ClientBean, ProtoTypeBean)들을 반복문을 돌며 등록을 하고,

image등록하는 내부 코드는 registerBean() 의 doRegisterBean()에서 진행되므로 이 부분도 한번 직접 코드를 보시면 좋을 것 같습니다.

 

--

정리하면, 스프링 컨테이너에 직접 빈으로 등록하는 과정은 영한님이 말씀하신 것처럼

컴포넌트 스캔으로 @Component가 붙은 클래스들을 자동 컴포넌트의 스캔이 대상이되는 자동 빈등록이 진행되는 것은 아니지만 그것과 같은 것 처럼 동작한다고 보시면 될 것 같습니다.

 

오리쉐리님의 프로필 이미지
오리쉐리
질문자

상세한 설명 감사드립니다..

제가 이해한바가 맞는지 확인 부탁드립니다.

  • @Component가 없어도 스프링컨테이너를 생성할때 생성자의 파라미터로 넘겨주면 컴포넌트스캔(=자동빈등록) 처럼 동작해서 스프링빈으로 등록이된다.

이렇게 이해하면 될까요?

네 맞습니다

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기