당니의 개발자 스토리
옵션 처리 본문
옵션 처리
이번 시간에는 옵션 처리에 대해서 알아보겠습니다.

주입할 Spring Bean이 없어도 동작해야 될 때가 있습니다. 예를 들어서, 스프링 빈을 옵션으로 해놓고, 이걸 등록을 안 해도 기본 로직으로 동작한다거나, 디폴트 로직이 동작한다거나 이런 식으로 동작해야 될 때도 있겠죠.
그런데 만약에 @Autowired 애노테이션을 사용하면 여기 내부에 required 라는 기본 옵션이 있는데, 기본값이 True예요. 값이 필수라는 의미겠죠. 그래서 자동 주입 대상이 없으면 무조건 오류가 발생합니다.

그래서 자동 주입 대상으로 스프링 컨테이너에 빈이 등록이 안 돼 있어도 문제 없이 되도록 할 수 있는 방법들이 있는데, 예제로 쭉 설명을 드릴게요.
test의 hello.core에다가 패키지 autowired를 만들겠습니다.

그리고 AutowiredTest를 만들겠습니다.

이렇게 해놓고 임의의 테스트 클래스를 만들게요.

TestBean 클래스를 만들고, 이 클래스를 넣어주면 TestBean이 스프링 빈으로 등록이 됩니다.

이제 이걸 차례로 테스트하면 됩니다.
자동 주입할 대상이 없으면, 수정자 메서드 자체가 호출이 안되는 거랑 자동 주입할 대상이 없으면 null이 입력되는 거랑 마지막으로 Java 8의 Optional은 값이 있을 수도 있고, Null일 수도 있다라는 상태를 감싼 거거든요. 이러한 상태로 원래의 데이터를 감싸서 제공하는 거라서, 자동 주입할 대상이 없으면 Optional.empty가 입력됩니다. 이건 Java 8을 공부해야 이해할 수 있어요.

이 Member는 스프링과 관련된 빈이 아니죠. 그러니까 지금 스프링 컨테이너에 관리되는 게 없는 거에요. 스프링 컨테이너에 없는 애를 집어넣은 거에요. 그 다음 출력을

이렇게 해놓고, 두 번째는 그냥 @Autowired만 호출하는데,

@Nullable을 넣을 거예요.
세 번째는 Java 8의 Optional을 해서 Member를 넣어보겠습니다.

이제 출력을 해봅시다. 스프링 컨테이너가 올라올 때, @Autowired도 다 호출이 되니까 출력물이 보일 겁니다.

이렇습니다. 만약에 setNoBean1에서

이렇게 하면 Autowire의 기본값이 true기 때문에,

Member가 스프링 빈으로 등록되는 게 아니라서 예외가 터집니다. 다시 원상복구 하면,

noBean1 자체가 호출이 안됐어요. 자동 주입할 대상이 없기 때문에 setter 메서드 자체를 호출 안한거죠.

이렇게 false로 해두면, 의존관계가 없으니까 setNoBean1 메서드 자체가 호출이 아예 안됩니다.
그래서 false로 해두면, 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됩니다.
그런데 없어도 호출을 하고 싶을 수도 있잖아요. Null이면 default 객체를 넣어주고 싶을 수 있죠.

그래서 noBean2를 보면 null로 나옵니다. 호출은 되죠. @Nullable 때문에 호출은 되지만, null로 들어옵니다.
세 번째 Optional은 Java 8에서 제공하는 문법인데요.

얘는 스프링 빈이 없으면, Optional.empty 라는 걸로 값을 넣어줍니다. 값이 있으면, Optional 안에 값이 감싸져 있겠죠.
그래서 정리해보면,

Member는 스프링 빈이 아니고요.
이럴 때 @Autowired(required=false) 라고 하면, 메서드 호출 자체가 안 돼요. 그래서 출력 결과가 이렇게 나온 거고요.

참고로 이 @Nullable이나 Optional은 스프링 전반에 걸쳐서 다 지원이 돼요.
예를 들어서, 생성자 자동 주입할 때 생성자에서도 @Nullable 넣으면, '파라미터 3개가 있는데 마지막 건 스프링에 없어도 생성자 호출하고 싶어!' 하면 할 수 있어요. 생성자 주입에서 특정 필드에서만 @Nullable 해서 사용해도 됩니다.
여기까지 해서 옵션 처리에 대해서 알아봤습니다.
다음 시간에는 왜 생성자 주입을 선택해야 되는지 말씀드리겠습니다.
'스프링 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 롬복과 최신 트랜드 (0) | 2024.01.24 |
|---|---|
| 생성자 주입을 선택해라! (0) | 2024.01.24 |
| 다양한 의존관계 주입 방법 (0) | 2024.01.24 |
| 중복 등록과 충돌 (0) | 2024.01.24 |
| 필터 (0) | 2024.01.24 |