본문 바로가기

Back-end/Spring

의존 자동 주입

본문 내용은 초보 웹 개발자를 위한 스프링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)

https://github.com/yyh7750/Spring_Study

'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