본문 내용은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문(최범균)을 참고하고 있습니다.
앞의 DI 내용에서 DI 방식을 잠깐 다뤘었다. 생성자나 메소드를 이용한 주입 방법이였는데 의존 대상을 설정 코드에서 직접 주입하는 코드를 보겠다.
@Configureation
public class AppCtx {
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public ChangePasswordService changePwdSvc() {
ChangePasswordService pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao()); // 의존 주입(직접 주입)
return pwdSvc;
}
}
이렇게 의존 대상을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입해주는 기능도 있다. 이를 자동 주입이라고 한다.
의존 자동 주입 설정
- 스프링에서 의존 자동 주입을 설정하려면 @Autowired 애노테이션이나 @Resource 애노테이션을 사용하면 된다. 참고하는 책에서는 @Autowired 사용법을 살펴본다.
@Autowired 의존 자동 주입
- @Autowired 애노테이션을 붙이면 설정 클래스에서 의존을 주입하지 않아도 된다.
- 필드에 @Autowired 애노테이션이 붙어 있으면 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
- @Autowired 어노테이션을 필드나 세터 메소드에 붙이면 스프링은 타입이 일치하는 빈 객체를 찾아 주입한다.
- @Autowired 어노테이션을 설정한 필드에 알맞은 빈 객체가 주입되지 않으면 Exception이 발생한다.
- 자동 주입을 하려면 해당 타입을 가진 빈이 어떤 빈인지 정확하게 한정할 수 있어야한다.
- 따라서 같은 타입의 빈이 두 개 이상이라면 Exception이 발생한다.
@Qualifier 의존 객체 선택
- 자동 주입 가능한 빈이 두 개 이상일 경우 자동 주입할 빈을 지정(한정)할 수 있는 방법이다.
- 상위/하위(상속관계)의 클래스의 경우 하위 클래스는 상위 클래스의 타입에 해당할 수 있기 때문에 Exception이 발생한다.(따라서 한정할 필요가 있다.)
@Autowired, @Qualifier 모두 필드와 메소드에 적용 가능하다.
@Autowired의 필수 여부
기본적으로 @Autowired 애노테이션을 붙인 타입에 해당하는 빈이 존재하지 않으면 Exception이 발생한다. 하지만 자동 주입할 빈이 존재하지 않을 때 익셉션이 발생하기 보다 null을 발생시키거나 특정 처리를 하고 싶은 경우가 있을 것이다. 이에 대한 방법 3가지를 알아보겠다.
1. required 속성
- @Autowired 애노테이션의 required 속성을 false로 지정한다.
- 자동 주입할 빈이 없다면 Exception을 발생시키지 않으며 자동 주입을 수행하지 않는다.
2. Optional
- 자동 주입 대상 타입을 Optional로 설정하는 경우 ex) public void method(Optional<Type> type) {}
- 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 인자로 전달한다.
- 일치하는 빈이 존재하면 해당 빈을 값으로 갖는 Optional을 인자로 전달한다.
3. @Nullable
- ex) public void method(@Nullable Type type) {}
- 스프링 컨테이너는 메소드를 호출할 때 자동 주입할 빈이 존재하면 해당 빈을 인자로 전달한다.
- 자동 주입할 빈이 존재하지 않다면 인자를 null로 전달한다.
의존 주입 및 자동 주입에 대한 실습 코드를 github에 등록하였다. 참고하고 있는 책의 예제 코드와 동일하나 예제 코드보다는 클래스 수가 적다. 쉬운 이해를 위해 간단히 작성하였다. (sp5-chap03)
'Back-end > Spring' 카테고리의 다른 글
빈 라이프 사이클과 범위 (0) | 2021.10.01 |
---|---|
컴포넌트 스캔(@Component, @ComponentScan) - 학습필요 (0) | 2021.10.01 |
스프링 DI (0) | 2021.10.01 |
싱글톤(Singleton) 객체 (0) | 2021.10.01 |
스프링 컨테이너 (0) | 2021.10.01 |