@Autowired 를 사용하는 경우
- 기본적으로 필수적인 의존성을 가진다. ( 기본값 : required=true )
- 해당 클래스를 주입할 수 있는 빈(Bean) 이 존재 하지 않으면 애플리케이션 컨텍스트 초기화 과정 중에 예외가 발생한다.
@Autowired(required = false)
- 해당 의존성을 주입할 수 있는 빈이 없어도 예외를 발생시키지도 않고 무시됨
- 해당 필드 또는 메서드 인젝션 포인트는 null 값으로 남음
- 특정 상황에서 의존성이 없이도 애플리케이션이 잘 동작하도록 도와줌
@Autowired (requird = false) 를 사용하는 것과
@Autowired 어노테이션 자체를 사용하지 않는 것의 차이?
[ 상황 ]
Member 클래스는 스프링 빈으로 등록되어있지 않다.
그런 경우 @Autowired 로 의존성을 주입하려 할 때 빈을 찾지 못해 예외가 발생할 수 있다.
아래에서는 스프링 빈으로 등록되지 않은 메서드에 의존성 주입을 시도하는 경우의 예시를 보여준다.
public class autowiredTest {
@Test
void AutoWiredOption(){
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean{
@Autowired(required = false)
public void setNoBean1(Member member) { System.out.println("TestBean.setNoBean1 = " + member); }
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("TestBean.setNoBean2 = " + member);
}
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("TestBean.setNoBean3 = " + member);
}
}
}
[ 이해가 안된 부분 ]
다음 테스트 코드를 출력하면 setNoBean1 은 출력되지 않고 다음과 같이 출력된다.
@Autowired(required=false) 의 역할과 강의를 제대로 이해하지 못해서 다음과 같은 궁금증이 생겼다
" 어자피 출력못하는데 왜 쓰는거지 ..............? "
다시 강의를 듣고 찾다 보니 다음과 같이 정리가 되었다.
[ 요약 정리 ]
@Autowired(required=false)
주입할 스프링 빈이 없어도 동작해야할 때가 있다.
하지만 스프링 빈이 있는지 없는지 모르는 상태에서 @Autowired 로만 의존성을 주입하려하는 경우 오류가 발생한다.
required=false 옵션을 줌으로써 주입할 스프링 빈이 없는 경우 오류를 방지하고 있는 경우에는 주입해주는 역할을 하는 것이다.
추가적으로 주입할 대상이 없을 경우 @Nullable 이나 Optional<> 을 사용할 수 있다.
( 내가 궁금했던 부분 - '값이 출력안되는데 굳이 왜 쓰냐?' 가 아니라 있는지 없는지 모르니까 방지용으로 사용한거고, 없어서 출력안됬던 것 !! ㅎ 😓)
@Autowired(required=false) : 자동주입할 빈이 있는경우 주입하고, 없는 경우에는 호출하지 않는다.
아예 사용하지않는 것 : 그냥 아무것도 실행되지않는다.
해당 포스트는 아래 강의를 수강하며 개념을 익히기 위해 정리한 글이다.
[ 참고 자료 ] 아래 강의 중 - "옵션 처리" 를 수강하며
'Spring' 카테고리의 다른 글
Spring | Spring Framework , Spring , Spring Boot 간단 정리 (0) | 2023.11.28 |
---|---|
의존성 주입이란? + @Autowired , IoC (0) | 2023.11.02 |
springframework 템플릿 엔진 - thymeleaf, mustache (0) | 2023.05.11 |
org.springframework.transaction.annotation.Transactional; (0) | 2023.04.25 |
Spring | 단위 테스트 vs 통합 테스트 (0) | 2023.04.25 |