EJB 대 CDI
의존성 주입을 위해 무거운 EJB를 경량 CDI 빈으로 대체합니다.
코드 비교
✕ Java EE
@Stateless
public class OrderEJB {
@EJB
private InventoryEJB inventory;
public void placeOrder(Order order) {
// container-managed transaction
inventory.reserve(order.getItem());
}
}
✓ Jakarta EE 8+
@ApplicationScoped
public class OrderService {
@Inject
private InventoryService inventory;
@Transactional
public void placeOrder(Order order) {
inventory.reserve(order.getItem());
}
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
경량
CDI 빈은 EJB 특정 인터페이스나 디스크립터가 없는 일반 Java 클래스입니다.
통일된 주입
@Inject는 모든 관리 빈, JAX-RS 리소스, Jakarta EE 컴포넌트에서 작동합니다.
쉬운 단위 테스트
EJB 프록시 오버헤드 없는 일반 클래스는 인스턴스화하고 목으로 대체하기 간단합니다.
이전 방식
EJB
모던 방식
CDI 빈
JDK 버전
11
난이도
중급
JDK 지원
EJB 대 CDI
사용 가능
Jakarta EE 8 / Java 11 이후 널리 사용 가능
동작 원리
CDI(컨텍스트와 의존성 주입)는 EJB와 동일한 의존성 주입을 제공하지만 EJB 특정 인터페이스나 디스크립터가 있는 무거운 컨테이너 없이 작동합니다.
관련 문서