TIL

218일차(모험 127일차) - 옵션 처리

haedal-uni 2022. 4. 20. 23:25
728x90

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

그런데 @Autowired 만 사용하면 required 옵션의 기본값이 true 로 되어 있어서

자동 주입 대상이 없으면 오류가 발생한다.

 

 

 

 

먼저, 기존에 작성했던 모든 test를 실행시키면 특정 test 코드에서 오류가 뜬다.

 

 

 

 

AutoAppConfig에서 아래 코드를 주석처리하고 실행시키면 정상적으로 test가 실행된다.

@Configuration
@ComponentScan(excludeFilters = @ComponentScan.Filter (type= FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {

//    // 중복 등록과 충돌
//    @Bean(name = "memoryMemberRepository")
//    MemberRepository memberRepository() {
//        return new MemoryMemberRepository();
//    }
}

그 이유는 스프링 빈이 컴포넌트 스캔으로 등록이 되어있는데
수동으로 또 등록이 되어서 스프링부트는 오류를 내버린다. 
(스프링 부트 test 였기 때문에 오류생김)

 


 

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

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

▪ Optional<> : 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.

  * java 8 의 Optional : 값이 있을 수도 있고 null 일 수도 있는 상태를 감싼 것

 


 

ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);

TestBean.class 가 스프링 빈으로 등록을 한다. 컴포넌트 스캔 하는 것처럼

 

 

 

Member는 스프링 빈이 아니다. (스프링 컨테이너에 관리되는 게 아니다.)

@Autowired(required=true) or @Autowired 로 실행하면 예외가 터진다.

Member가 스프링 빈으로 등록된 것이 아니기 때문에

 

 

 

 

출력 결과

 

 

setNoBean1() 은 @Autowired(required=false) 이므로 호출 자체가 안된다.

의존관계가 없으므로 ⬇️이 메소드 자체가 호출이 아예 안된다.

@Autowired(required = false)
public void setNoBean1(Member noBean1) {
    System.out.println("noBean1 = " + noBean1);
}

 

 

Nullable은 호출은 되는데 null로 들어온다.

Optional은 들어오면 Optional.empty로 넣어준다. 값이 있으면 Optional 안에 값이 감싸져 있을 것이다.

 

 

* @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다.

예를 들어서 생성자 자동 주입에서 특정 필드에만 사용해도 된다.

 

 

728x90