이번 시간에는 옵션처리에 대해서 알아보았다.
주입할 스프링 빈이 없어도 동작해야 하는 상황이 주어졌다고 가정하자.
예를 들자면, 스프링 빈을 optional로 해서 등록을 안하고 기본 로직으로 동작하게 했다고 하자.
하지만 @Autowired 만 사용하면 required 옵션의 기본값이 true로 되어있기 때문에,
자동 주입 대상이 없으면 오류가 발생한다.
스프링 컨테이너에 빈이 등록되어있지 않더라도, 문제없이 동작하게 하려면 몇가지가 있다.
테스트를 위해 패키지와 클래스를 생성한다.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'autowiredTest.TestBean': Unsatisfied dependency expressed through method 'setNoBean1' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.Member' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
먼저 오류가 발생하는 것을 보여주기 위해서 @Autowired 애노테이션을 달면 기본값이 required = true이다.
그렇기 때문에 무조건 있어야 하는데, 스프링 빈이 관리하지 않는 클래스인 Member 클래스로 파라미터를
넣어주었기 때문에 오류가 발생한다!
스프링 컨테이너에 빈이 등록되어있지 않더라도 문제없이 동작하게 하려면,
첫번째로, @Autowired(required=false) 자동 주입할 대상이 없으면 수정자 메소드 자체가 호출이 안된다.
두번째는, org.springframework.lang.@Nullable. 자동 주입할 대상이 없으면 null이 입력된다.
세번째는, Optional<>. 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.
첫번째 메소드부터 보면, 의존관계가 없을 때 required = false를 해놓으면, setNoBean1 메소드는 호출이 아예 되지 않는다.
두번째는, 예를 들어 호출을 하고 null이면 디폴트 객체를 넣겠다라고 한다면, Nullable을 넣으면 noBean2 처럼 호출이 되고 null로 출력이 된다.
세번째는, 자바 8에서 제공하는 Optional 문법인데 Optional.empty 값을 넣어준다.
추가적으로, @Nullable, Optional은 스프링 전반에 걸쳐서 지원이 된다. 예를 들면, 생성자 자동 주입에서 특정 필드에만 사용해도 된다.
댓글