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

hyewon981019님의 프로필 이미지
hyewon981019

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

자바 코드로 직접 스프링 빈 등록하기

DI 방식

작성

·

324

0

안녕하세요, 자바 코드로 스프링 빈 등록하기 강좌에서 질문이 있는데요!
세 가지 질문이 있습니다.
 
1.
@Bean
public MemberService memberService()
{
return new MemberService(MemberRepository());
}
 
이 뜻은 MemberService와 MemberRepository형의 객체가
의존 관계를 맺고 있다는 뜻이고,
따라서 당연히 MemberService에 가면 MemberRepository형의 멤버변수가 선언되어 있는 걸 볼 수 있는데,
스프링 설정 클래스에서 위와같이 의존관계를 넣어줬으니 MemberService에서는 더이상 @Autowired 어노테이션이 생성자에 필요가 없는 거라고 이해하면 될까요?
 
조금 더 종합적으로 살펴봤을 때,
컴포넌트 스캔 방식일때는 해당 클래스에서 @Autowired 로 주입받는 객체와의 의존관계를 명시하고 주입해줘야 하는 방법 밖에 없고,
 
이와 같이 직접 자바 코드로 설정파일 이용해 빈을 등록하는 방식에서는
 
방법 1 :
수업과 같이 설정클래스에서 위에 작성된 코드로 의존주입한다, 단 저런 방식으로 주입할 경우 MemberService에는 생성자에 @Autowired가 필요없어짐
 
방법 2 :
@Bean
public MemberService memberService()
{
return new MemberService();
}
로 작성하고 MemberService 클래스에서 필드나 생성자에 @Autowired로 MemberRespository 빈 객체 주입 명시
 
이렇게 두 가지 방법이 있는 것으로 이해하면 될까요?
 
2. 잠깐 지나가는 말씀으로 세터 메서드에 @Autowired가 붙는 방법을 알려 주셨는데, 세터 메서드는 개발자가 직접 호출하지 않아도 스프링이 알아서 호출해주나요? @Autowired가 붙은 생성자를 저희가 직접 호출해준적은 없는 거 같은데, 세터도 동일한지 궁금합니다. 즉 @Autowired를 멤버변수 필드나 세터나 생성자에 붙이면 개발자가 호출할 필요 없이 알아서 스프링이 자동호출도 해주고 의존객체도 연결해주는 것으로 이해해도 되는지요?
 
3. 의존 주입을 하는 객체(A)와, 주입을 받는 객체(B)는 모두 빈으로 등록되어야 하는지 궁금합니다. 주입되는 인자(A)는 꼭 빈으로 등록된 객체여야 오류가 안 난다는 것은 수업에서도 알려주셔서 명확히 기억이 나는데, 주입을 받는 객체(B)도 항상 빈으로 등록된 객체여야 하나요?
 
질문이 많고 긴데 읽어주셔서 감사합니다!
 

답변 1

0

안녕하세요, hyewon981019 님. 공식 서포터즈 codesweaver 입니다.
.
1. 네 이해하고 계신 내용이 맞습니다. 스프링 컨테이너가 직접 의존 관계를 처리해야 한다면 @Autowired를 명시해야 하며 이떄 두 객체(의존성을 주입받는 객체와 주입할 객체) 모두 스프링 빈 이어야 합니다. 

3. @Autowired 로 의존성을 주입하려 할 때는 둘 다 스프링 빈이어야 하나 사용자가 집적 의존관계를 주입해준다면 주입할 객체는 빈이 아니어도 괜찮습니다.

2. 네, 맞습니다. 생성자, 필드, 수정자에 @Autowired 를 명시하면 스프링 빈이 의존성을 주입하는 것은 동일합니다. 다만 차이라면 타이밍의 차이입니다. 가령 생성자에서 의존성을 주입받는 경우, 생성자를 호출하려면 의존성 주입할 객체가 먼저 생성되어 있어야 겠지요? 그러나 수정자로 주입을 하는 경우라면 스프링 빈 등록 작업을 종료한 이후 나중에 의존성 주입을 하여도 괜찮습니다. 그래서 스프링이 빈을 등록하고 의존성 주입을 하는 타이밍의 차이가 있다고 보시면 됩니다.


감사합니다.

hyewon981019님의 프로필 이미지
hyewon981019

작성한 질문수

질문하기