[Spring] 옵션 처리

728x90

가끔 빈이 없어도 동작해야할 때가 있다
이 때는 여러가지 방법이 있겠지만 @Autowired 의 옵션 처리를 통해서 처리하는 방법이 있다. 

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

이 required 속성의 default 값이 true이기 때문에 만약 자동으로 주입되어야할 빈이 없으면 오류가 발생한다. 

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

  1. @Autowired의 required 속성을 false로 바꾼다  ex. @Autowired(required = false) 
  2. org.springframework.lang.@Nullable 자동으로
  3. Optioanl<> 자동 주입할 대상이 없으면 Optional.empty가 된다.

1번의 케이스는 알고있었는데 새롭게 안 사실은 만약 이 옵션에 의해 빈이 주입되지 않았다면 그냥 null이라고 생각했는데, 추가적으로 해당 빈의 메서드를 호출하지 않는다고한다.

2번은 정말로 해당 빈이 null이 된다. ->  메서드 호출이 될테니 NPE가 발생할 확률이 있어 보인다. 🤔

3번의 경우에는 Optional로 결과를 감싼 것이니 사실 뭐 놀랄 것도 없다.

2번, 3번의 경우에 대해서는 null에 대한 예외처리가 필요하고 1번의 경우에는 null 처리 없이도 커버가 된다? 정도의 차이가 있을 듯하다. 
(그런데 메서드 호출을 아예 안해버리면 의미가있나....? 🙄👀)


'에잇... 테스트 클래스도 아니고 요즘 누가 촌스럽게 @Autowired를 써!!' 라고 할 수 있지만 @NullableOptional은 스프링 전반에 걸쳐서 지원된다. 즉 생성자 주입 방식에서도 특정 필드만 사용할 수 있다.

728x90

'Spring Framework Module > SpringBoot' 카테고리의 다른 글

Spring Rest Docs 소개 및 사용법  (0) 2020.12.18