
@Autowired 어노테이션은 주로 필드 주입 방식에서 사용되며, 이는 여러 단점들이 존재한다.
우선, 불변성 확보가 어렵다. 이는, 필드에 @Autowired를 붙이게 되면, final을 선언할 수 없게 되므로, 불변성을 확보하지 못한다.
그 다음으로, 순환참조 감지가 어렵다. 필드 주입 시 빈 생성과 의존성 조립을 별도로 수행하기 때문에 컴파일 시점에 이를 확인할 수 없어 런타임 시점에 확인이 가능하게 되고, 이로 인해 StackOverflow 오류가 발생하게 된다.
또한, 스프링 프레임워크에 의존성이 높아지게 된다. @Autowired 어노테이션은 스프링 프레임워크 내부에서 사용되므로, 의존도가 높아지게 된다.
마지막으로, 테스트 용이성이 떨어지게 됩니다. @Autowired를 통해 의존 주입을 받기 위해서는 Spring 컨테이너가 필요하게 되고, 순수 자바 코드로 테스트 코드 실행이 어려워져, 독립적이지 못하게 된다.
이러한 이유에서 필드 주입 방식의 @Autowired 사용보다는 생성자 주입을 통해 DI를 하는 것이 좋다.