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

gusdn85554님의 프로필 이미지
gusdn85554

작성한 질문수

스프링 핵심 원리 - 기본편

다양한 의존관계 주입 방법

생성자, setter 주입 시 빈 생성

작성

·

200

0

안녕하십니까 선생님 

해당 '다양한 의존관계 주입 방법' 강의에서 강사님이 

setter주입은 단계가 나눠져있고, 생성자 의존관계 주입은 빈을 등록하면서 의존관계 주입이 동시에 일어난다고 말씀해주셨습니다.

단계로 나눈다는 말씀은 빈을 등록하고, 의존관계 주입을 할 때, 컨테이너에서 빈을 조회하여 주입시킨다. 이 부분은 이해가 됩니다.

그런데 제가 이걸 강의를 두 번째 들으면서 너무 깊이 생각한건지 만약에 OrderServiceImpl을 빈으로 등록할 때, 자동으로 의존관계 주입이 일어난다고 하시지 않으셨습니까? 그러면 MemberRepository와 DiscountPolicy가 아직 빈에 등록이 안될 경우가 있나요??

이럴 경우에 어떻게 실행과정이 이뤄지는지 궁금하여  QnA를 찾아보았습니다.

https://www.inflearn.com/questions/89770

위의 답변을 보고 제가 이해한 내용은 빈 등록과 의존관계 주입이 동시에 일어나게 될 때, 

1. MemberRepository가 아직 빈에 등록되지 않으면 스프링은 위의 빈을 찾아 등록하고 OrderServiceImpl의 의존관계 주입에 사용

2. DiscountPolicy도 1번과 같이 실행이 된다.

라고 생각하면 될까요??

결국에는 setter 주입은 단계가 나눠지고, 생성자 의존관계 주입은 동시에 일어난다 이렇게 구분지어 말씀하신게 이해를 쉽게 하기 위해서 강의하신건지,, 아니면 setter주입과 생성자 주입에 상관없이 1,2번 처럼 되는지 궁금합니다.

------------------------------------------------

14:33에 말씀하시는 생성자에서 의존관계 주입할 때

생성자 파라미터를 가리키시면서 가급적 필수값이라고 말씀하셨는데 인자가 필수라는 말씀이신건지, 객체가 무조건 있다는 말씀이신지 궁금합니다!

-------------------------------------------------

setter주입은 선택, 변경

생성자 주입은 불변, 필수 라고 말씀하셨습니다.

setter주입은 setXXX 메서드를 통하여 변경할 수 있고, 파라미터마다 setXXX를 만들면 선택적으로 주입할 수 있다.라고 생각이 들어 선택, 변경은 이해가 됐습니다.

생성자 주입은 생성자가 1번 호출 되는 것이 보장되기 때문에 불변도 이해가 됐습니다. 그러나 필수 이 부분은 어느 부분때문에 필수라고 말할 수 있는지 궁금합니다!!

긴 글 읽어주셔서 감사합니다.

답변 2

2

gusdn85554님의 프로필 이미지
gusdn85554
질문자

생성자 주입에서 필수는 생성자의 특징을 말하는 것이 아니라 인자가 필수적으로 들어와야함을 말하는 것이군요 

setter주입은 해당 set 메서드를 사용하지 않으면 상관이 없지만

생성자는 클래스를 생성할 때 당연하게 실행이 되니까 생성자의 파라미터가 빈으로 존재하지 않으면, 클래스의 객체를 생성하지 못하니까요

확실하게 이해가 됐습니다

긴 글 읽어주셔서 감사하고 답변도 너무너무 감사합니다!

0

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

.
1. 빈이 생성되기 이전에, 미리 의존관계를 파악해 두고, 빈을 생성할때 의존관계에 있는 빈들을 모두 생성하여 주입한다는 뜻이므로 이해하고 계신 내용이 맞습니다. setter주입을 이용할 경우에는 어떤 빈을 생성할때 의존관계에 있는 빈들을 주입하지 않고 나중에 별도로 수정자(setter)를 이용하여 주입해야 한다는 것입니다. 이렇듯 의존관계 주입이 빈 등록 단계와 분리됩니다.

2. 4:33에 말씀하시는 생성자에서 의존관계 주입할 때...

파라미터로 인자가 반드시 들어온다는 뜻입니다. 그러기 위해선 인자로 들어오는 객체가 스프링 빈이어야 한다는 전제조건이 자연스럽게 추가됩니다.

3. 생성자 주입은 불변, 필수 라고 말씀하셨습니다 ...

말씀하신 것처럼 생성자로 설정한 객체는 별도의 수정자가 없으면 변경이 불가하므로 불변이라고 합니다. 또 생성자가 어떤 파라미터를 필요로 하면, 사용자는 이 객체를 생성할떄 '반드시' 이 파라미터에 해당하는 객체를 전달해야 합니다. (그렇지 않으면 객체 생성이 안되니까요) 그런면에서 필수 입니다. 2번 질문에 대한 답에도 해당합니다.


감사합니다.

gusdn85554님의 프로필 이미지
gusdn85554

작성한 질문수

질문하기