자동빈등록 질문드립니다
252
작성한 질문수 108
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
11분 48초를 보면,
스프링컨테이너를 생성할때 생성자 파라미터를 넘겨주는건 컴포넌트 스캔을 해주는것이고, 자동빈등록이 된다고 말씀하시는데
지금까지 설명해주신거를 바탕으로 되돌아보면 스프링컨테이너를 생성할때 생성자 파라미터로 넘겨주는건 직접 스프링빈으로 등록하는것이라고 알고있었는데,
왜 @Component가 없는데 왜 이게 컴포넌트 스캔을 해주는것이고 ,직접빈등록이 아닌 자동빈등록인건지 질문드립니다
답변 1
0
안녕하세요. gomdole03님, 공식 서포터즈 OMG입니다.
.
프로토타입 스코프(링크)
위 링크 9분부터 참고해보시겠어요?
영한님께서도 질문남기신 내용에 대해 @Component가 없어도, 컴포넌트 스캔(=자동빈등록) 처럼 동작한다고 말씀하시는데요. 제가 생각했을 때 "처럼" 이라는 말씀이 키워드가 될 것 같습니다.
강의에서 배웠던 자동 빈등록은 아니지만 내부적으로 그와 유사하게 동작하여 결국 스프링 빈으로 등록을 해준다 라고 이해하시면 될 것 같아요.
.
감사합니다.
0
이 부분은 AnnotationConfigApplicationContext 클래스 코드를 확인해 보면 감이 잡히실텐데요,
코드 안에 영한님이 하신 말씀과 왜 제가 "처럼"을 키워드라고 한지 알 수있습니다.
AnnotationConfigApplicationContext는 총 4개의 생성자를 가집니다.

기본 생성자를 제외한 3개 중 가운데인 Class<?>... componentClasses 로 스프링 컨테이너를 생성하는 건 이해하시리라 생각합니다.
생성자 코드를 보면,
1- 기본생성자를 호출하고
2- 인자로 받은 컴포넌트클래스를 등록하고 (ClientBean, ProtoTypeBean)
3- 리프레시
총 3라인의 코드가 실행됩니다.
빈 등록이 관심사이므로 3 리프레시를 제외하고 1,2 단계만 설명드리겠습니다.
(refresh의 동작이 궁금하실 경우 직접 분석해보시는 거도 실력 성장에 도움이 될거라 생각하오니 한번 보시길 권장드려요^^)

기본생성자에서 보셔야 할 것은 scanner를 생성하는 코드인데요,
registry로 스프링컨테이너 자신을 인자로하여 ClassPathBeanDefinitionScanner를 생성합니다.

인자로 받은 빈팩토리나, 스프링컨테이너를 클래스패스에서 빈으로 등록될 클래스를 감지합니다.
-
여기까지의 과정을 한줄로 정리하면 "인자로 받은 컴포넌트 클래스를 스캔 한다" 라고 할 수 있을 것 같은데요.
여기까지 각 클래스와 메서드의 역할만 보더라도 감이 오실거라 생각하고, 빈을 등록하는 코드는 간략히 설명드리겠습니다.
register()를 보면, 빈을 등록하는 코드들이 실행되는데요, 인자로 받은 componentClasses는
register에서는 @Configuration과 같은 자동 스캔의 대상이 되는 클래스로 인지하고 진행이 됩니다.
(밑의 javadoc 참고)

직접 빈으로 등록할 컴포넌트 클래스(ClientBean, ProtoTypeBean)들을 반복문을 돌며 등록을 하고,
등록하는 내부 코드는 registerBean() 의 doRegisterBean()에서 진행되므로 이 부분도 한번 직접 코드를 보시면 좋을 것 같습니다.
--
정리하면, 스프링 컨테이너에 직접 빈으로 등록하는 과정은 영한님이 말씀하신 것처럼
컴포넌트 스캔으로 @Component가 붙은 클래스들을 자동 컴포넌트의 스캔이 대상이되는 자동 빈등록이 진행되는 것은 아니지만 그것과 같은 것 처럼 동작한다고 보시면 될 것 같습니다.
0
상세한 설명 감사드립니다..
제가 이해한바가 맞는지 확인 부탁드립니다.
@Component가 없어도 스프링컨테이너를 생성할때 생성자의 파라미터로 넘겨주면 컴포넌트스캔(=자동빈등록) 처럼 동작해서 스프링빈으로 등록이된다.
이렇게 이해하면 될까요?
섹션3. 11 회원객체 다이어그램
0
22
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
24
1
코드 자료
0
56
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
63
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
83
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
95
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
81
1
테스트 속도가 나중에 영향이 있을까요?
0
81
1
gradle 설정 안떠서 질문 남깁니다!
0
125
2
build.gradle로 프로젝트를 여는 이유
0
89
1
provider 사용하는 이유
0
93
1
다음 강의 뭘 들어야 할까요
0
130
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
66
1
beanB
0
82
2
퀴즈다시풀기
0
69
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
92
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
106
2
도메인의 정의?
0
59
1
ApplicationContext 질문입니다.
0
63
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
93
2
ai api 선정하기 관련 질문
0
122
2
생성자 자동주입 관련해서
0
67
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
98
2





