의존성 주입(Dependency Injection) - @Autowired, @Resource, @Inject의 차이

2022. 9. 16. 16:46Spring

@Autowired, @Resource, @Inject

위 3가지의 공통점은 모두 의존성을 주입하는데 사용한다는 것입니다.

 

그렇다면 차이점은 어떤 것이 있을까요?

@Autowired

제 기준에서 가장 많이 사용되는(아마 다른 분들도 비슷할 것이라 생각합니다) @Autowired부터 확인해보겠습니다.

  • Spring Framework에서 제공해주는 어노테이션
  • 의존성 주입을 위한 객체 탐색 순서 : Type → name → @Qualifier → Fail
  • 사용 가능 위치 : 멤버 변수, Setter, 생성자, 일반 메소드

@Resource

  • JSR-250(Java Specification Requests)에서 지원하는 어노테이션
  • 의존성 주입을 위한 객체 탐색 순서 : name → Type → @Qualifier → Fail
  • 사용 가능 위치 : 멤버 변수, Setter

@Inject

  • JSR-330에서 지원하는 어노테이션
  • 의존성 주입을 위한 객체 탐색 순서 : Type → @Qualifier → name → Fail
  • 사용 가능 위치 : 멤버 변수, Setter, 생성자, 일반 메소드

 

 

그렇다면 @Qualifier는 뭘까요?

@Qualifier

의존성을 주입하는 과정에서 Type이 일치하는 객체가 여러 개 있어서 선택할 수 없을 때 Exception이 발생합니다.

이 때 @Qualifier를 사용하여 name을 이용해 이를 해결할 수 있습니다.

 

이 외에는 어떤 것들이 있을까요?

@Named

@Named는 @Inject와 함께 쓰이면서Spring의 @Component 어노테이션과 대조됩니다.

@Primary

@Primary는 같은 우선 순위로 있는 클래스가 여러 개 있을 때 그 중 가장 높은 우선순위를 부여하는 어노테이션입니다.

 

 

JSR에서 끊임없이 새로운 어노테이션이 나오고 있지만 Spring에서는 Spring의 어노테이션을 사용하는 것이 가장 편한 것 같습니다.

그럼 여기까지 Java와 Spring에서 의존성을 주입하는 어노테이션에 대해 알아봤습니다.

감사합니다.