노션으로 다시 돌아갔습니다 😅

의존관계 주입 시 옵션 처리

by mignon25

주입할 스프링 빈이 없어도 동작해야 할 경우가 있다.

스프링 빈을 옵셔널하게 설정해두고, 등록이 되어 있지 않으면 해당 로직 대신 디폴트 로직이 동작하도록 한다거나 할 수도 있을 것이다.

그러나 @Autowired 만 사용할 경우 required 옵션의 기본값이 true 로 설정되어 있어서 자동 주입 대상이 없으면 오류가 발생한다. 

그런 경우 자동 주입 대상을 옵셔널하게 처리할 수 있다. 

 

자동 주입 대상을 옵션으로 처리하는 방법

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

 

예제

public class AutowiredTest {

    @Test
    @DisplayName("옵션처리 테스트")
    void AutowiredOption() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
    }


    static class TestBean {
        /**
         * 스프링 컨테이너가 올라올 때(생성될 때?) @Autowired 는 모두 호출된다.
         * required 의 기본값은 true
         * 만약 @Autowired(required = true) 로 하고 테스트 실행하면 Member 는 스프링 컨테이너에 없기 때문에 에러가 발생한다. 
         */
        @Autowired(required = false)  
        public void setNoBean1(Member noBean1) {
            // Member 는 현재 이 테스트에서 스프링이 관리하는 빈이 아니다.
            // 스프링 컨테이너에 없는 객체를 아무거나 Autowired 한 것.
            System.out.println("noBean1 = " + noBean1);
        }
        
        @Autowired
        public void setNoBean2(@Nullable Member noBean2) {
            System.out.println("noBean2 = " + noBean2);
        }

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

    }
}

실행결과는 다음과 같다.

noBean1 의 경우 대상이 없어서 아예 수정자 메서드 자체가 호출되지 않은 것. 

 

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

 

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기