2021. 8. 11. 15:22ㆍSpring
3장에서 살펴본 DI를 설정코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입해주는 기능을 의존자동주입 이라고 한다.
1. @Autowired
어노테이션을 이용한 의존 자동 주입.
자동 주입 기능을 사용하면 스프링이 알아서 의존 객체를 찾아서 주입한다.
자동 주입 기능을 사용하는 법은 의존을 주입할 대상에 @Autowired
어노테이션을 붙이기만 하면 된다.
1-1. setter 방식의 의존 자동주입
@Autowired
어노테이션을 필드에 붙이면 해당 필드의 타입에 해당하는 빈을, 메서드에 붙이면(보통 setter 메서드) 메서드의 매개변수의 타입에 해당하는 빈 객체를 자동으로 의존 주입을 한다.
⇒ 필드에 적용하면 생성자와 setter 모두 적용됨.
1-2. 생성자 방식의 의존 자동 주입
생성자 방식으로 의존 자동 주입을 할때는 기본 생성자를 명시해 주어야 함.
⇒ 생성자 방식으로 의존주입 받을필요도 없긴함. 생성자에서 의존주입하는부분 지우고 필드에 @Autowired
해주면 알아서 들어감. 단 기본 생성자를 명시해 주어야함.
2. @Qualifier
어노테이션을 이용한 의존 객체 선택
자동 주입 가능한 빈이 두 개 이상이면 자동 주입할 빈을 지정할 수 있는 방법이 필요하다.
⇒ 주로 상속한 클래스의 빈이 있을때 업캐스팅에 의해 오류 발생. 이를 막기위해 사용.
이때 사용하는것이 @Qualifier
어노테이션.
사용법.
@Qualifier
어노테이션은 두 위치에서 사용 해야한다.
1. @Bean 어노테이션을 붙인 빈 설정 메서드.
⇒ 빈 설정에 @Qualifier
어노테이션이 없으면 빈의 이름을 한정자로 지정한다.
2. @Autowired
어노테이션에서 자동 주입할 빈을 한정할때 사용.
⇒ @Autowired
어노테이션에서 한정자가 없으면 필드나 파라미터 이름을 한정자로 사용.
이렇게 두 위치에 설정을 해놓으면 1, 2의 식별자가 같은것들 끼리 의존 자동 주입이 됨.
3. 상위/하위 타입 관계와 자동주입.
어떤 클래스를 상속한 클래스타입의 빈과, 상위 타입의 빈이 같이 있으면 오류 발생 가능
⇒ 업캐스팅이 가능해 스프링이 어떤것을 주입해야 할지 모르기 때문.
→ @Qualifer
사용 이유.
해결법
@Qualifier
사용.- 다운캐스팅은 자동으로 하지 않으므로, 주입 받을때 자식 클래스 타입으로 지정.
4. @Autowired
어노테이션의 필수 여부.
자동 주입할 대상이 필수가 아닌 경우가 있음.
스프링은 주입할 대상이 없으면 예외 발생시키는데
이때 필수 여부를 3가지 방법으로 조절 가능.
1. @Autowired
어노테이션의 required
속성을 false로 지정하면 됨. (defualt : true)ex) 세터메서드 호출x
⇒ 자동 주입할 빈이 존재하지 않으면 메서드를 호출하지 않음.
2. 자동 주입 대상 타입을 Optional로 지정.
⇒ 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 자동으로 전달.
3. @Nullable
어노테이션 사용.
⇒ Optional을 구현한 어노테이션으로, 자동 주입할 빈이 존재하면 해당 빈을 전달, 존재하지 않으면 null을 전달.
→ @Autowired
의 required
속성과 다른점은 자동 주입할 빈이 존재하지 않아도 메서드가 호출됨.
→ 만약 생성자에서 따로 초기화를 했는데 자동주입 대상이었다면, 무시되고 null이 다시 주입됨. 유의할것.
5. 자동주입 vs 명시주입
자동주입이 더 우선순위를 가짐.
⇒ 명시 주입한 빈이 있어도, 자동 주입한 빈으로 덮어쓰기 됨.
출처 : 최범균,『스프링5 프로그래밍 입문』, 가메출판사
'Spring' 카테고리의 다른 글
6장. 빈 라이프사이클과 범위 (0) | 2021.10.06 |
---|---|
5장 컴포넌트 스캔 (자동 빈 등록) (0) | 2021.09.20 |
3장. 스프링 DI (0) | 2021.08.11 |
2장. 컨테이너 생성 (0) | 2021.08.11 |
1장. 메이븐 프로젝트 (0) | 2021.08.11 |