의존관계 자동 주입 방법
2022. 10. 26. 15:37ㆍSpring
의존관계가 무엇인지에 대해서는 IOC와 DI에서!
@AutoWired란?
스프링이 의존관계를 주입(DI)할 때 사용되는 애노테이션이다. 의존주입에 필요한 객체의 타입에 맞는 빈을 스프링 컨테이너에서 찾아와 의존관계를 주입해준다. 때문에 자동 의존 관계 주입은 스프링 컨테이서에서 관리되는 스프링 빈이여야만 동작한다.
1) 생성자 주입
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- 생성시점에 딱 한번이 호출되며, 불변하게 설계 가능하다.
- 생성자를 통해서 의존 관계를 주입받는다.
- 생성자가 한개인 경우에는 @Autowired 생략 가능하다.
- 롬복을 적용하고 @RequiredArgsConstructor를 클래스 레벨에 붙여주면 final이 붙은 필드를 모아서 자동으로 생성자를 만들어준다.
2) setter주입
@Component
public class MemberServiceImpl implements MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- 필드값을 변경하는 수정자 메서드를 통해 의존 관계를 주입받는다.
- 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
- 변경 가능성이 있는 의존 관계에 사용된다.
3) 필드 주입
@Component
public class MemberServiceImpl implements MemberService {
@Autowiredprivate MemberRepository memberRepository;
}
- 필드에 바로 주입받는 방식이다.
- 코드가 간결하다.
- DI 프레임워크에 의존이 강하고 외부에서 변경이 불가능해서 테스트가 힘들다.
- 필요한 객체 생성부터 연결, 기능 수행까지 하므로 단일 책임 원칙(SRP)에 위배되기도 한다.
- 인텔리제이에서도 필드 주입을 추천하지 않음
- 결론적으로는 추천하지않음!!
결론은
생성자를 사용하여 자동주입을 하는것이 가장 베스트!!
- 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 가장 잘 살리는 방법
@Autowired 옵션
- required
@Autowired(required=false)- 주입할 스프링 빈 없이도 동작해야할 때
- 기본값은 true
- 자동 주입할 대상이 없으면 메서드 자체가 호출이 안된다.
- @Nullable
- 주입할 대상이 없어도 호출은 되지만 null이 입력된다.
-
@Autowired public void setNoBean(@Nullable Member member) { System.out.println("setNoBean2 = " + member); }
참고 생성자 주입에만 final을 쓸 수 있다. 그 외의 방식들은 모두 생성자 이후에 호출되므로.
'Spring' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2022.10.28 |
---|---|
의존 주입할 빈이 두개 이상 조회 될 때 (0) | 2022.10.26 |
컴포넌트 스캔과 자동 의존관계 주입 (0) | 2022.10.26 |
Configuration과 싱글톤 (0) | 2022.10.26 |
BeanDefinition - 스프링 빈 설정 메타 정보 (0) | 2022.10.26 |