4장. 의존 자동주입

2021. 8. 11. 15:22Spring

728x90

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 사용 이유.

해결법

  1. @Qualifier 사용.
  2. 다운캐스팅은 자동으로 하지 않으므로, 주입 받을때 자식 클래스 타입으로 지정.

4. @Autowired 어노테이션의 필수 여부.

자동 주입할 대상이 필수가 아닌 경우가 있음.

스프링은 주입할 대상이 없으면 예외 발생시키는데

이때 필수 여부를 3가지 방법으로 조절 가능.

1. @Autowired 어노테이션의 required 속성을 false로 지정하면 됨. (defualt : true)ex) 세터메서드 호출x

    ⇒ 자동 주입할 빈이 존재하지 않으면 메서드를 호출하지 않음.

2. 자동 주입 대상 타입을 Optional로 지정.

    ⇒ 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 자동으로 전달.

3. @Nullable 어노테이션 사용.

    ⇒ Optional을 구현한 어노테이션으로, 자동 주입할 빈이 존재하면 해당 빈을 전달, 존재하지 않으면 null을 전달.

        → @Autowiredrequired 속성과 다른점은 자동 주입할 빈이 존재하지 않아도 메서드가 호출됨.

        → 만약 생성자에서 따로 초기화를 했는데 자동주입 대상이었다면, 무시되고 null이 다시 주입됨. 유의할것.

 

5. 자동주입 vs 명시주입

자동주입이 더 우선순위를 가짐.

    ⇒ 명시 주입한 빈이 있어도, 자동 주입한 빈으로 덮어쓰기 됨.

 

출처 : 최범균,『스프링5 프로그래밍 입문』, 가메출판사

728x90

'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