inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

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

자동빈등록 질문드립니다

252

오리쉐리

작성한 질문수 108

0

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

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

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

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

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

spring oop

답변 1

0

OMG

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

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

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

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

.
감사합니다.

0

오리쉐리

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

0

OMG

이 부분은 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가 붙은 클래스들을 자동 컴포넌트의 스캔이 대상이되는 자동 빈등록이 진행되는 것은 아니지만 그것과 같은 것 처럼 동작한다고 보시면 될 것 같습니다.

 

0

오리쉐리

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

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

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

이렇게 이해하면 될까요?

0

OMG

네 맞습니다

섹션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