Intellij IDE 를 통해 Spring Application 을 개발하신 분들이면 한번쯤은 보셨을텐데요,
Intellij 에서 @Autowired Annotation 을 사용하게 되면 'Field injection is not recommended' 라는 타이틀로 경고 내용을 보여줍니다.
왜 이런 경고 문구가 나오는지 그 이유에 대해 설명하고 있는 아티클이 있어 공유드립니다.
Spring 에서는 @Autowired Annotation 을 통해 DI(Dependency Injection) 기능을 사용할 수 있도록 지원하는데요,
Constructor(생성자), Setter(Method), Field(Annotation) Injection 이란 이름으로 3가지 방식을 지원하고 있습니다.
또한 @Resource Annotation 을 통해서도 DI(Dependency Injection) 기능을 사용할 수 있는데요 @Autowired Annotation 과는 다르게 IDE 에서 @Resource Annotation 을 쓸 경우 'Field injection is not recommended' 경고를 보여주지 않습니다.
@Autowired 와 @Resource 의 차이가 뭘까요? 다음과 같은 3가지 차이가 있습니다.
✔️ 종속성 식별: @Autowired 는 유형별로 Bean 을 주입하는 반면에 @Resource 는 이름별로 먼저 주입하고 이름별로 주입되지 못할 경우 유형별로 주입합니다.
✔️ Annotation 적용 대상: @Autowired 는 생성자, 메소드, 매개변수 및 필드에서 사용할 수 있는 반면, @Resource 는 메소드 및 필드에만 적용할 수 있습니다.
✔️ Provider: @Autowired 는 Spring 에서 제공하는 Annotation 이고, @Resource 는 자바 표준인 JSR-250 에서 제공합니다.
IDE 에서 경고 문구를 보여주는 이유는 위의 차이점 중 Provider 와 관련된 차이로 경고 문구를 보여주는 건데요,
@Autowired 는 Spring 에서 제공하는 Spring IoC 를 사용하면 문제없이 쓸 수 있지만, 다른 IOC 컨테이너를 사용할 경우 지원되지 않을 수 있습니다.
반면 @Resource 는 JSR-250 에서 제공하는 것이기 때문에 다른 IoC 컨테이너에서도 Java 표준과 호환되기 위해 @Resource 어노테이션을 지원하게 됩니다.
추가로 이 아티클의 내용과는 별개로 위에서 언급드렸던 @Autowired Annotation 을 쓰는 3가지 방식(Constructor, Setter, Field) 중 Spring 에서 추천하는 방식은 Constructor 로그 이유는 단일 책임의 원칙, IoC Container 와의 낮은 의존성, 필드의 불변성 및 순환 의존 방지 때문인데요 이와 관련된 내용은 기회가 되면 다른 게시글에서 다뤄보도록 하겠습니다.