개발/자바

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