본문 바로가기
Spring/Spring core basic

[Spring core basic] 33 - 의존관계 자동 주입 옵션

by Kloong 2022. 5. 3.

참고

더보기

Spring core basic 시리즈는 김영한 님의 "스프링 핵심 원리 - 기본편" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다. 마크다운을 잘 쓰지 못해서 가독성이 조금 떨어지는 점 양해 바랍니다.

 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

의존관계 자동 주입 옵션

@Autowired 로 스프링에게 의존관계 주입을 맡겨 놓았는데, 대응하는 스프링 빈이 존재하지 않는다면?

주입할 스프링 빈이 없어도 프로그램이 동작해야 하는 경우가 있다. 예를 들어 주입된 빈이 존재하면 어떤 로직을 실행시키고, 없다면 다른 로직을 실행시킨다던가 하는 경우가 있을 수 있다.

그런데 다른 설정 없이 @Autowired annotation만 사용하면, annotation의 required 옵션의 default 값이 true 로 되어 있다. 따라서 주입할 빈이 존재하지 않으면 오류가 발생한다.

자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다.

  • @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨
  • org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
  • Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력된다

AutowiredOptionTest.java

//package, import 생략

import org.springframework.lang.Nullable;
import java.util.Optional;

public class AutowiredOptionTest {

    @Test
    void autowiredOption() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestAppConfig.class);
    }

    @Configuration
    static class TestAppConfig {
        @Autowired(required = false)
        public void setNoBean1(Member member) {
            System.out.println("setNoBean1 = " + member);
        }

        @Autowired
        public void setNoBean2(@Nullable Member member) {
            System.out.println("setNoBean2 = " + member);
        }

        @Autowired
        public void setNoBean3(Optional<Member> member) {
            System.out.println("setNoBean3 = " + member);
        }
    }
}

TestAppConfig.class가 스프링 컨테이너로 넘겨지면서 스프링 빈으로 등록된다. 그리고 스프링 컨테이너가 DI를 할 때 TestAppConfig의 3개의 메서드가 실행된다.

테스트를 실행하면 다음과 같은 출력이 나온다.

setNoBean2 = null
setNoBean3 = Optional.empty

Member 타입의 스프링 빈이 존재하지 않으므로 자동 주입할 대상이 존재하지 않는다. 따라서,

  • setNoBean1은 호출되지 않는다.
  • setNoBean2은 호출되지만, null이 주입된다.
  • setNoBean3은 호출되지만, Optional.empty가 주입된다.

참고: @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다. 예를 들어서 생성자 자동 주입에서 특정 필드에만 사용해도 된다.

댓글