인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

형짱님의 프로필 이미지
형짱

작성한 질문수

스프링 핵심 원리 - 기본편

컴포넌트 스캔과 의존관계 자동 주입 시작하기

Spring의 Bean주입 관련 질문입니다

해결된 질문

작성

·

389

3

안녕하세요 영한님 이번 강의를 듣고 궁금증이 생겨 이렇게 질문드립니다.

1. 첫번째 질문입니다.

 

평소에 의존성 주입을 할때

의존성을 주입할 객체를 private final로 선언한후에

Lombok의 @RequiredArgsConstructor를 사용하거나 final로 선언된 객체를 생성자를 통하여 받아 주입을 하였습니다.

근데 강의를 듣다보니 영한님같은 경우는 @Autowired를 생성자에 사용하고 계신데

로그상으로 봣을때는 @Autowired가 있고 없고가 차이가 없어 보입니다.

혹시 @Autowired의 사용 유무에 따라서 내부적으로 차이점이 있는건가요?

2. 두번째 질문은 14:40 구간에 스프링 빈저장소 그림을 보다가 문득 생각났는데요

Bean객체가 빈 저장소에 등록되는 순서가 존재하는 걸까요?

MemberService의 경우는 MemberRepository의 의존성을 주입 받아야하는데

MemberService가 먼저 빈저장소에 등록되고 이후에 MemberRepository에 등록되는 경우는 MemberService가 생성될때 MemberRepository의 빈정보는 빈 저장소에 없는 상태인데

이럴경우는 어떻게 해당 객체를 생성자를 통하여 주입후 MemberService가 생성되는지 궁금해졌습니다.

그래서 제가 스스로 생각해본 내용은 

전체의 빈을 먼저 스캔한후 주입받을 내용이없는 빈을 먼저 빈저장소에 등록후 이후에 주입받을 빈이 있는 객체를 생성하여 빈저장소에 저장한다.

라고 생각도 해보았는데 로그상으로 보면 

Creating shared instance of singleton bean 'AClass'

Creating shared instance of singleton bean 'BClass'

Autowiring by type from bean name 'AClass' via constructor to bean named 'BClass'

이 순서대로 빈이 생성되어 주입되는듯하네요

그래서 또 다른 생각은

SpringMVC같은 경우는 컨트롤러에서 요청된 내용을 reflection을 통하여 해당하는 요청의 메소드를 invoke시키는 것으로 배웠는데

그렇다면 빈들을 먼저 빈 저장소에 저장후에 

그 이후에 저장된 빈에서 주입이 안된 객체를 찾아 꺼내고

reflection을 통하여 생성자의 파라미터에 주어진 객체를 저장해줄까 라는 생각도 해보았습니다.

스프링에서는 내부적으로 빈이 어떻게 주입이 되는지가 궁금합니다. ㅎㅎ!

답변 3

6

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

안녕하세요. 항상 열심히 하는 형짱님^^

1. 첫번째 질문은 강의를 조금 더 들으시면 궁금증이 풀리실꺼에요^^ (좀 더 뒤에 나옵니다 ㅎㅎ)

2. 사실 스프링 빈 저장소는 스프링 빈이 등록되기 전에 본인이 필요한 의존관계 그래프를 내부에서 다 만듭니다. 그래서 MemberService를 빈으로 등록하려고 하는데 MemberRepository가 없으면 먼저 MemberRepository를 빈으로 등록합니다. 그런데 이것을 사실 이렇게 설명하면 처음 배우는 분들은 너무 어려울 수 있습니다.

그런점 때문에 스프링 컨테이너와 스프링 빈 -> 스프링 컨테이너 생성 부분에서는 설명을 할 때 먼저 빈이 다 등록되고, 그 다음에 의존관계가 설정된다고 간단하게 풀어서 설명을 드렸습니다.

감사합니다.

0

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

네 형짱님 생각하신 내용이 맞습니다^^

좋은 하루 되세요.

0

형짱님의 프로필 이미지
형짱
질문자

안녕하세요

영한님 질문에 대한 답변달아주셔서 정말 감사드립니다 ^^

그럼 2번 질문에 대한 답변주신 내용을 볼때

1. AClass를 빈을 생성한다

Creating shared instance of singleton bean 'AClass'

2-1. 하지만 AClass는 BClass를 주입받아야한다.

2-2. 그래서 BClass를 찾아보고 없다면 BClass를 빈을 생성하여 빈저장소에 저장한다.

Creating shared instance of singleton bean 'BClass'

3. 빈 저장소에서 BClass를 꺼내서 생성자를 통하여 주입하여 AClass 빈을 생성을 마무리 한다.

Autowiring by type from bean name 'AClass' via constructor to bean named 'BClass'

이런식으로 이해를 하면되는건가요?

요즘 Spring을 차근차근 공부 중인데 재미는 내용들이 많네요 ㅎㅎ

형짱님의 프로필 이미지
형짱

작성한 질문수

질문하기