Spring을 사용하는 개발자일 경우 @Autowired
라는 어노테이션을 많이들 보셨을겁니다.
Spring DI(Dependency Injection) 종류글을 작성하면서 @Autowired
에는 다음과 같은 단점이 존재한다고 이야기하였습니다.
- Spring IOC 컨테이너와의 강한 결합 발생
- @Autowired 어노테이션을 통해 스프링 컨테이너에 등록된 빈을 찾아 해당 객체에 주입을 해주는 방식이기 때문에 생성, 변경에 어려움이 있습니다.
- 이는 곧 Spring 컨테이너 밖에서 작동할 수 없는 코드임을 암시하기 때문에 Spring 컨테이너와의 강한 결합이 있음을 의미합니다.
그렇다면 @Autowired
의 표준은 과연 어떤 것인지 이번 글을 통해 이야기해보고자 합니다.
표준을 이야기하기 위해서는 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 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 이용시 장점은 다음과 같습니다.
Difference between @Autowired and @Inject annotations in Spring Framework?
Using JSR 330 Standard Annotations
잘 읽었습니다. 좋은 정보 감사드립니다.