@Autowired vs @Inject

겔로그·2023년 8월 15일
0

Spring을 사용하는 개발자일 경우 @Autowired라는 어노테이션을 많이들 보셨을겁니다.

Spring DI(Dependency Injection) 종류글을 작성하면서 @Autowired에는 다음과 같은 단점이 존재한다고 이야기하였습니다.

  • Spring IOC 컨테이너와의 강한 결합 발생
    • @Autowired 어노테이션을 통해 스프링 컨테이너에 등록된 빈을 찾아 해당 객체에 주입을 해주는 방식이기 때문에 생성, 변경에 어려움이 있습니다.
    • 이는 곧 Spring 컨테이너 밖에서 작동할 수 없는 코드임을 암시하기 때문에 Spring 컨테이너와의 강한 결합이 있음을 의미합니다.

그렇다면 @Autowired의 표준은 과연 어떤 것인지 이번 글을 통해 이야기해보고자 합니다.

JSR-330

표준을 이야기하기 위해서는 JSR-330에 대해 알아야 합니다. JSR(Java Specification Request)은 Java의 표준이 되는 기술 명세 요청이며 그중 JSR-330은 의존성 주입에 관한 명세가 담겨있는 요청입니다.

Dependency Injection for Java (JSR 330)
Dependency Injection for Java defines a standard set of annotations (and one interface) for use on injectable classes.
In the Java EE platform, CDI provides support for Dependency Injection. Specifically, you can use DI injection points only in a CDI-enabled application.
Dependency Injection for Java is new to the Java EE 6 platform.

Spring Annotation vs JSR-330 Annotation

Spring 3.0 이전에는 JSR-330을 지원하지 않아 Spring Annotation을 별도로 정의하여 의존성 주입을 하였으나, 3.0부터는 JSR-330의 표준 어노테이션을 지원하게 되었습니다.

아래 목록은 동일한 기능을 하는 Spring Annotation과 JSR-330 표준 어노테이션의 목록입니다.

사용 방법

의존성 관리 도구에 javax.inject 의존성을 추가해야 합니다. 아래는 maven pom.xml에 추가하여 사용하는 예시입니다.

<dependency>
  <groupId>javax.inject</groupId>
  <artifactId>javax.inject</artifactId>
  <version>1</version>
</dependency>

위의 의존성을 추가한 뒤, 기존에 사용했던 Annotation들을 JSR-330으로 변경하면 사용이 가능합니다.

주의사항

Spring Annotation에서만 지원하는 기능들이 있어 migration시 오류가 발생할 수 있습니다.

Limitations of JSR-330 Standard Annotations 문서를 통해 제약사항을 확인해보신 뒤 적용하시면 좋을 것 같습니다.

장단점

JSR-330 이용시 장점은 다음과 같습니다.

장점

  • Java 표준을 따릅니다.
  • 다른 프레임워크 사용시 문제없이 전환이 가능합니다.

단점

  • Spring Annotation을 사용하는 기존 레거시 코드에서 JSR-330 annotation에서 지원하지 않는 제약사항을 사용하고 있을 경우 전환간 에로사항이 발생합니다.
  • 바꿔서 얻는 이점이 없습니다.

결론

  • Spring 3.0 이전에는 Spring Annotation밖에 없었으나 3.0부터 Java 표준인 JSR-330 어노테이션을 지원합니다.
  • JSR-330 어노테이션 사용시 의존성 추가가 필요하며, 기존 어노테이션 전환간 제약사항 확인이 필요합니다.
  • 변경을 하면 표준을 따라가 다른 프레임워크 전환간 사이드 이펙트가 줄어듭니다.
  • Spring을 계속 사용할 경우 굳이 바꿀 필요가 있을까 싶은 의문이 듭니다.

Reference

Difference between @Autowired and @Inject annotations in Spring Framework?
Using JSR 330 Standard Annotations

profile
Gelog 나쁜 것만 드려요~

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기