[Spring] CDI(Contexts and Dependency Injection)
‘Jakarta Contexts and Dependency Injection’은 ‘Java EE(Enterprise Edition)’ 환경에서 의존성 주입과 관련된 서비스를 제공하는 애플리케이션 서버의 기능이다. CDI는 애플리케이션 컴포넌트 간의 결합도를 낮추고
, 느슨한 결합
을 통해 유연성과 재사용성을 향상시키는 것을 목표로 한다.
💡 CDI를 왜 사용하는가?
스프링도 의존성 주입, AOP(Aspect-Oriented Programming), 선언적 트랜잭션 관리등 다양한 기능의 애노테이션을 제공한다. 그럼에도 CDI를 사용하는 이유는 무엇인가?
- Java EE 표준 준수
CDI는 자바 EE의 공식 표준이다. 표준을 준수하는 것은 기술의 호환성과 장기적인 지원을 보장하는 측면에서 중요하다.
- 결합도 감소
CDI는 애플리케이션 컴포넌트 간의 결합도를 줄이는 데 초점을 맞추고 있다. 이를 통해 더 유영하고 확장 가능한 애플리케이션을 구축할 수 있다.
CDI 의존성 추가
1
2
3
4
5
<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
<version>2.0.1</version>
</dependency>
CDI 사용
- 의존성 주입 설정
의존성 주입을 위해
@Inject
애너테이션을 사용한다. 이를 통해 필요한 객체를 자동으로 주입받을 수 있다. - Bean 정의
CDI에서 관리할 객체를 빈으로 정의한다. 일반적으로 빈은
@Named
또는@ApplicationScoped
,@SessionScoped
등의 애너테이션으로 범위를 정의할 수 있다. - Producer 메소드
특정 타입의 객체를 프로그래밍 방식으로 생성하고 싶을 때,
@Produces
애너테이션을 사용한 프로듀스 메소드를 정의할 수 있다. - 이벤트 처리
@Onserves
애너테이션을 사용하여 이벤트를 처리할 수 있다. 이벤트는@Inject
와 함께 사용되는 ‘Event’타입을 통해 발행할 수 있다. - 인터셉터와 데코레이터 사용
비즈니스 로직의 분리와 재사용을 위해 인터셉터(
@Interceptor
)와 데코레이터(@Decorator
)을 사용할 수 있다.
CDI 활용 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Named
class BusinessService {
private DataService dataService;
public DataService getDataService() {
return dataService;
}
@Inject
public void setDataService(DataService dataService) {
System.out.println("Setter Inject");
this.dataService = dataService;
}
}
@Named
class DataService { }
@Configuration
@ComponentScan
public class CdiContextLauncherApplication {
public static void main(String[] args) {
try (var context = new AnnotationConfigApplicationContext
(CdiContextLauncherApplication.class)) {
System.out.println(context.getBean(BusinessService.class).getDataService());
} catch (BeansException e) {
e.printStackTrace();
}
}
}