Q) 스프링의 @Autowired 를 가급적 쓰지 말라는 이야기가 종종 들리는데 원인이 뭘까요?
@Autowired는 field, setter, 생성자 주입 3가지 방식으로 주입이 가능한데,
field나 setter 주입의 경우에는 DI되지 않은 채 빈이 생성되고, 필요할 때 의존관계가 있는 빈들이 DI된다. 따라서 의존관계가 다 맺어지지 않은 채 (DI가 다 되지 않은 채) 객체를 사용하게 된다. DI되지 않은 빈을 사용하는 경우에는 NPE같은 게 생길 수 있을 것 같다.
또 빈 생성 이후에 DI를 임의로 할 수 있기 때문에 mutable하다. 멀티스레드 환경에서 보통 스프링의 빈들은 싱글톤인데 thread safe하지 않을 수 있다.
내 생각에는 생성자 주입방식으로 @Autowired를 쓴다면 빈 생성과 동시에 DI도 무조건 같이 이뤄진다. final도 생성자에 사용한다면 mutable도 막을 수 있기 때문에 생성자 주입의 @Autowired는 괜찮다고 생각한다.
추가적으로 생성자 주입의 @Autowired는 순환참조시에도 에러를 캐치하기 때문에 괜찮을 거라고 본다.