Spring

@Autowired 를 가급적 쓰지 말라는 이유

LeeJerry 2022. 3. 1. 23:38

@Autowired 는 생성자 주입 방식 시에도, 필드 주입 방식 시에도 사용할 수 있음. 따라서 @Autowired 를 가급적 쓰지 말라는 이유는 두 가지로 분류할 수 있음.

  1. (생성자 주입, 필드 주입 둘 다 포함)@Autowired 자체의 어떠한 단점으로 인해 사용을 지양하는 것이 좋으며, 그 단점이 무엇인지?
  2. @Autowired 를 적용한 필드 주입 방식보다는 생성자 주입 방식을 왜 선택해야 하는지

 


1. @Autowired 자체의 어떠한 단점으로 인해 사용을 지양하는 것이 좋으며, 그 단점이 무엇인지?

순환 참조가 발생할 수 있음. 순환 참조가 발생할 경우, 컴파일 타임 시 에러가 잡히지 않다가 로직이 실행되는 런타임 시에 에러가 잡힘. 컴파일 때 에러가 잡히지 않으니, 애플리케이션이 정상적으로 작동하는 것 보임. setter 주입이나 생성자 주입의 경우에는 컴파일 타임 때 에러가 잡히므로, 문제가 되는 부분을 즉각적으로 파악할 수 있음.

 

2. @Autowired 를 적용한 필드 주입 방식보다는 생성자 주입 방식을 왜 선택해야 하는지

세 가지 이유가 있음.

  1. 불변
    • 생성자 주입은 객체를 생성할 시 딱 한번만 호출되므로, 이후 의존관계를 변경할 일이 없으며 변경의 여지를 만들지 않음.
  2. 누락 
    • 순수 자바 테스트에서 의존 관계를 누락한 경우, 생성자 주입은 컴파일 오류가 발생. setter 주입의 경우 런타임 시 에러. 필드 주입의 경우에는 아예 불가능(외부 라이브러리에 테스트를 의존해야 함)
  3. final 키워드 사용 유무
    • 생성자 주입의 경우 final 키워드 사용 가능. 그래서, 혹시라도 값이 설정되지 않는 경우 즉각적으로 컴파일 오류를 뱉어냄.

 

참고) https://velog.io/@walker/Spring-%EC%99%9C-%EC%83%9D%EC%84%B1%EC%9E%90-%EC%A3%BC%EC%9E%85%EC%9D%B4-%EA%B6%8C%EC%9E%A5%EB%90%98%EB%A9%B0-%EC%88%9C%ED%99%98%EC%B0%B8%EC%A1%B0%EB%9E%80-%EB%AD%98%EA%B9%8C