개발/자바
Jakarta CDI (Contexts and Dependency Injection)
피터JK
2025. 2. 12. 15:09
728x90
**Jakarta CDI (Contexts and Dependency Injection)**는 Jakarta EE에서 의존성 주입(Dependency Injection)과 스코프(Context)를 관리하는 표준 사양입니다.
이는 Java EE 시절의 **JSR 299 (CDI 1.0)**과 **JSR 346 (CDI 1.1/1.2)**을 계승한 기술로, Jakarta EE의 핵심적인 DI 프레임워크 역할을 합니다.
1. CDI의 주요 기능
- 의존성 주입 (Dependency Injection)
- @Inject를 사용하여 객체 간의 의존성을 선언적으로 관리할 수 있습니다.
- 컨텍스트 관리 (Context Management)
- @RequestScoped, @SessionScoped, @ApplicationScoped 등으로 객체의 라이프사이클을 관리합니다.
- 인터셉터와 데코레이터 (Interceptors & Decorators)
- @Interceptor와 @Decorator를 이용해 실행 로직을 동적으로 변경할 수 있습니다.
- 이벤트 기반 개발 (Event-driven Programming)
- @Observes 및 @Produces를 사용하여 이벤트를 생성 및 감지할 수 있습니다.
- 대체 가능성 (Alternatives & Specialization)
- @Alternative를 통해 특정 구현을 런타임 시 변경할 수 있습니다.
2. CDI 기본 사용 예제
(1) 의존성 주입
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
@ApplicationScoped
@Named
public class MyService {
@Inject
private MyRepository repository;
public void process() {
repository.saveData();
}
}
(2) 프로듀서 메서드 (@Produces)
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Produces;
import java.util.Random;
@ApplicationScoped
public class RandomProducer {
@Produces
public int produceRandomNumber() {
return new Random().nextInt(100);
}
}
(3) 이벤트 기반 개발
import jakarta.enterprise.event.Event;
import jakarta.inject.Inject;
public class EventProducer {
@Inject
private Event<String> event;
public void fireEvent() {
event.fire("CDI Event Triggered!");
}
}
3. CDI vs. Spring DI 비교
| 기능 | Jakarta CDI | Spring DI |
| 표준 사양 여부 | Jakarta EE 표준 (JSR 365) | Spring 프레임워크 자체 기능 |
| 스코프 관리 | @RequestScoped, @SessionScoped 등 | @Scope("prototype"), @Scope("singleton") |
| 이벤트 시스템 | @Observes, Event<T> 지원 | ApplicationEventPublisher 사용 |
| 프로듀서 개념 | @Produces 지원 | @Bean 사용 |
| 외부 프레임워크 연계 | Java EE 환경에서 최적화됨 | 다양한 환경에서 사용 가능 |
4. CDI를 언제 사용할까?
CDI는 Jakarta EE 기반 애플리케이션을 개발할 때 자연스럽게 적용됩니다.
특히, Spring 없이 Java EE 표준을 따르는 기업 시스템이나, Eclipse MicroProfile 기반의 경량 애플리케이션 개발 시 유용합니다.
CDI는 Jakarta EE의 핵심 요소이며, 개발자가 객체 간의 의존성을 효율적으로 관리하고 애플리케이션을 보다 유연하게 설계할 수 있도록 도와줍니다. 💡
728x90