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

Jason Yoo님의 프로필 이미지
Jason Yoo

작성한 질문수

스프링 핵심 원리 - 기본편

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

PrototypeProviderTest 클래스 내부 코드 질문입니다

작성

·

292

1

클래스 PrototypeProviderTest의 메서드인 providerTest()에서

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

를 통해 만든 컨테이너 ac를

클래스 ClientBean의 필드에서

@Autowired private ApplicationContext ac;

와 같은 형태로

outer class에 선언한 컨테이너 ac를 끌어와 쓰고 있는데,

질문1) 컨테이너가 초기화 될 때, 자기 자신도 bean으로 등록하기 때문에, 위와 같이 컨테이너 자체를 auto wiring할 수 있는 건가요?

질문2) 컨테이너가 '@Component' annotation에 대해 scan하는 default 범위가 같은 패키지 내부인 것과 마찬가지로

@Autowired를 적용하는 범위도 같은 패키지 내부이기 때문에, 위와 같이 클래스 ClientBean이 outer class로부터 컨테이너를 auto wiring을 할 수 있는 것인가요?

질문3) "스프링"에서 '컨테이너'라는 것은 하나의 프로젝트 안에서 단 1개로 global하게 존재하는 객체가 아닌, 이곳저곳에 여러 개로 존재할 수 있는 독립적인 객체인가요?

질문4) 메서드 providerTest()의 첫번째 줄인

AnnotationConfigApplicationContext ac = new

AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

라는 "코드1"과

클래스 ClientBean의 필드인

@Autowired private ApplicationContext ac;

라는 "코드2"

이 두 코드는 서로 상호 의존적인 것 같습니다.

왜냐하면

코드1이 수행되려면 (ClientBean.class를 사용하므로) 코드2를 포함하고 있는 클래스 ClientBean의 초기화가 선행되어야 하고

코드2가 수행되려면 코드1의 컨테이너 ac의 초기화가 선행되어야 하기 때문입니다.

서로가 서로를 선행해야 하는 상황인데

어떻게 문제 없이 잘 동작하는지가 의문입니다.

답변 1

2

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

안녕하세요. Jason Yoo님

질문1) 컨테이너가 초기화 될 때, 자기 자신도 bean으로 등록하기 때문에, 위와 같이 컨테이너 자체를 auto wiring할 수 있는 건가요?

-> 컨테이너는 자신을 Bean으로 등록한다기 보다는 편의상 특별히 조회하는 기능을 제공하는 것으로 이해하시면 됩니다.

질문2) 컨테이너가 '@Component' annotation에 대해 scan하는 default 범위가 같은 패키지 내부인 것과 마찬가지로 @Autowired를 적용하는 범위도 같은 패키지 내부이기 때문에, 위와 같이 클래스 ClientBean이 outer class로부터 컨테이너를 auto wiring을 할 수 있는 것인가요?

-> 

다음 코드를 통해서 스프링 컨테이너가 생성되는데요.

이 시점에 스프링은 생성자의 파라미터로 넘긴 ClientBean.class, PrototypeBean.class 두 클래스는 스프링 빈으로 등록됩니다.

AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

스프링 빈으로 둘이 등록되어 있기 때문에 @Autowired가 가능합니다.

질문3) "스프링"에서 '컨테이너'라는 것은 하나의 프로젝트 안에서 단 1개로 global하게 존재하는 객체가 아닌, 이곳저곳에 여러 개로 존재할 수 있는 독립적인 객체인가요?

-> 다음 코드가 바로 스프링 컨테이너 1개를 뜻합니다.

new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

이것을 여러개 생성한다면 독립적으로 존재할 수 있습니다.

그런데 보통 1개만 사용합니다.

질문4)

네 문제없이 잘 동작합니다. 강의 초반에 설명드린 내용 처럼 빈을 생성하는 단계와, 빈을 주입하는 단계를 나누어서 생각해보시면 이해가 되실거에요.

감사합니다.

Jason Yoo님의 프로필 이미지
Jason Yoo
질문자

감사합니다!

Jason Yoo님의 프로필 이미지
Jason Yoo

작성한 질문수

질문하기