CDI와 EJB는 어떻게 비교됩니까? 상호 작용?


106

나는 두 사람이 어떻게 상호 작용하는지 그리고 그들 사이의 경계가 어디에 있는지 이해하는 데 어려움을 겪고 있습니다. 중복됩니까? 그들 사이에 중복이 있습니까?

둘 다 관련된 주석이 있다는 것을 알고 있지만 간략한 설명이 포함 된 전체 목록을 찾을 수 없었습니다. 이것이 어떻게 다른지 또는 겹치는지를 명확히하는 데 도움이 될지 확실하지 않습니다.

정말 혼란 스러워요. 나는 EJB를 합리적으로 잘 이해하고 있다고 생각합니다. CDI가 테이블에 제공하는 것과 EJB가 이미 제공하는 것을 대체하거나 향상시키는 방법을 정확히 이해하는 데 어려움을 겪고 있다고 생각합니다.


3
이 질문에 구글의 "EJB CDI 차이"검색에 상단 정렬,하지만 난에 대한 답을 찾을 stackoverflow.com/questions/13487987/... 명확
매트는 freake

답변:


50

CDI : 의존성 주입에 관한 것입니다. 이는 어디에서나 인터페이스 구현을 삽입 할 수 있음을 의미합니다. 이 객체는 무엇이든 될 수 있으며 EJB와 관련이 없을 수 있습니다. 다음 은 CDI를 사용하여 랜덤 생성기를 주입하는 방법의 예입니다. EJB에는 아무것도 없습니다. 비 EJB 서비스, 다른 구현 또는 알고리즘을 삽입하려는 경우 CDI를 사용합니다 (따라서 EJB가 전혀 필요하지 않음).
EJB : 당신은 이해하고 아마도 @EJB어노테이션에 의해 혼란 스러울 것입니다. 그것은 당신의 서비스 또는 무엇이든 구현을 주입 할 수있게합니다. 주된 아이디어는 주입하는 클래스가 EJB 컨테이너에 의해 관리되어야한다는 것입니다. CDI가 EJB가 무엇인지 이해하는 것 같으므로 Java EE 6 호환 서버에서 서블릿에서 둘 다 작성할 수 있습니다.

@EJB EJBService ejbService;

@Inject EJBService ejbService;

그것이 당신을 혼란스럽게 만들 수 있지만, 그것은 아마도 EJB와 CDI를 연결하는 유일한 다리 일 것입니다.

CDI에 대해 이야기 할 때 다른 개체를 CDI 관리 클래스에 삽입 할 수 있습니다 (CDI 인식 프레임 워크에 의해 생성되어야 함).

CDI가 제공하는 다른 것 ... 예를 들어, Struts 2를 MVC 프레임 워크로 사용하고 (예를 들어) EJB 3.1을 사용하더라도 여기에 제한이 있습니다. @EJBStruts 작업에서 주석을 사용할 수 없으며 컨테이너에서 관리하지 않습니다. 그러나 Struts2-CDI 플러그인을 추가 할 때 @Inject동일한 것에 대한 주석을 작성할 수 있습니다 (따라서 더 이상 JNDI 조회가 필요하지 않음). 이렇게하면 EJB 파워가 향상되지만 앞서 언급했듯이 CDI로 주입하는 것은 EJB와 관련이 있는지 여부는 중요하지 않습니다. 그것이 바로 파워입니다.

추신. 예제에 대한 업데이트 된 링크


@EJB와 @Inject는 실제로 기능적으로 동일합니까? 나는 CDI와 Java EE 약어 수프의 일부 사이의 주입 방법이 겹친다 고 생각합니다. 더 많은 독서는 주석을 정렬 할 희망이 있음을 나타내는 것 같습니다.
Tim

@Maxym @ Inject를 사용할 때 @ Stateless 또는 EJB의 다른 서버 측 구성 요소가 컨테이너에서 제공하는 풀링 또는 동시성과 같은 기능을 계속 사용하는지 어떻게 확인할 수 있습니까? 이것이 CDI에서 제공하지 않기를 바랍니다.
Bala

1
@Bala : CDI는 풀링을 제공하지 않습니다 ... EJB3.1의 유무에 관계없이 CDI를 살펴 보십시오. 질문에 대한 답변이
되었으면합니다

@KorayTugay : CDI는 Java EE 기능이므로 모든 Java EE 6 호환 서버에이 기능이 있습니다 (Glassfish 3.0.1+는 실수가 아닙니다, JBoss 6+ 등). 참조 CDI 구현 인 JBoss Weld를 살펴볼 수 있습니다. 예를 들어에서 사용할 수있는 톰캣 ...
Maxym

191

현재 Java EE에는 여러 구성 요소 모델이 있으므로 실제로는 약간 혼란 스럽습니다. 그들은이다 CDI , EJB3JSF 관리 콩 .

CDI 는 블록의 새로운 아이입니다. CDI 콩 기능 dependency injection, scoping그리고 event bus. CDI 빈은 주입 및 범위 지정과 관련하여 가장 유연합니다. 이벤트 버스는 매우 가볍고 가장 단순한 웹 애플리케이션에도 매우 적합합니다. 이 외에도 CDI는 portable extensions모든 구현 (Glassfish, JBoss AS, Websphere 등)에서 사용할 수있는 Java EE에 추가 ​​기능을 제공하는 일종의 플러그인 메커니즘 인 이라는 매우 고급 기능도 제공합니다. .

EJB3 Bean은 이전 레거시 EJB2 구성 요소 모델 * 에서 개조되었으며 주석을 통해 관리되는 Java EE의 첫 번째 Bean이었습니다. EJB3 콩 기능 dependency injection, declarative transactions, declarative security, pooling, concurrency control, asynchronous executionremoting.

EJB3 빈의 의존성 주입은 CDI 빈 에서처럼 유연하지 않으며 EJB3 빈에는 범위 지정 개념이 없습니다. 그러나 EJB3 빈은 트랜잭션이며 기본적으로 풀링됩니다 ** , CDI가 EJB3 도메인에 남겨두기로 선택한 매우 유용한 두 가지입니다. 언급 된 다른 항목도 CDI에서 사용할 수 없습니다. EJB3에는 자체 이벤트 버스가 없지만 메시지를 수신하기위한 특별한 유형의 빈이 있습니다. 메시지 구동 빈. 이는 Java Messaging System 또는 JCA 자원 어댑터가있는 다른 시스템에서 메시지를 수신하는 데 사용할 수 있습니다. 단순 이벤트에 대해 완전한 메시지를 사용하는 것은 CDI 이벤트 버스보다 훨씬 무겁고 EJB3는 생산자 API가 아닌 리스너 만 정의합니다.

JSF Managed Bean 은 JSF가 포함 된 이후로 Java EE에 존재했습니다. 그들도 기능 dependency injectionscoping. JSF Managed Beans는 선언적 범위 지정 개념을 도입했습니다. 원래 범위는 다소 제한되어 있었고 EJB3 빈이 이미 주석을 통해 선언 될 수있는 동일한 버전의 Java EE에서 JSF 관리 빈은 여전히 ​​XML로 선언되어야했습니다. JSF Managed Bean의 현재 버전도 최종적으로 주석을 통해 선언되고 범위는보기 범위와 사용자 정의 범위를 생성하는 기능으로 확장됩니다. 동일한 페이지에 대한 요청 사이의 데이터를 기억하는보기 범위 는 JSF Managed Bean의 고유 한 기능입니다.

보기 범위를 제외하고는 Java EE 6에서 JSF Managed Beans에 대한 것이 거의 없습니다. CDI에 누락 된보기 범위가 있습니다. 업데이트 : Java EE 7 / JSF 2.2에는 CDI 호환 @ViewScoped 가 추가되어 CDI가 실제로 완벽한 수퍼 세트가되었습니다. 업데이트 2 : JSF2.3에서 JSF 관리 빈은 CDI 관리 빈을 위해 더 이상 사용되지 않습니다.

EJB3와 CDI의 상황은 그렇게 분명하지 않습니다. EJB3 컴포넌트 모델 및 API는 CDI가 제공하지 않는 많은 서비스를 제공하므로 일반적으로 EJB3를 CDI로 대체 할 수 없습니다. 반면에 CDI는 EJB3와 함께 사용할 수 있습니다 (예 : EJB에 범위 지원 추가).

전문가 그룹 멤버이자 CanDI라는 CDI 구현의 구현자인 Reza Rahman은 EJB3 구성 요소 모델과 관련된 서비스를 CDI 주석 집합으로 개조 할 수 있음을 자주 암시했습니다. 그런 경우 Java EE의 모든 관리 Bean이 CDI Bean이 될 수 있습니다. 이것은 EJB3가 사라지거나 더 이상 사용되지 않음을 의미하는 것이 아니라 그 기능이 @Stateless 및 @EJB와 같은 EJB의 고유 한 주석 대신 CDI를 통해 노출된다는 것을 의미합니다.

최신 정보

TomEE 및 OpenEJB 명성의 David Blevins는 그의 블로그에서 CDI와 EJB의 차이점과 유사점을 잘 설명합니다. CDI, EJB를 깨뜨릴 때

* 버전 번호의 증가 일 뿐이지 만 EJB3 빈은 대부분 완전히 다른 종류의 빈이었습니다. 단순한 단일 어노테이션을 적용하여 "관리되는 빈"이되는 단순한 포조 (pojo)와 헤비급 및 매우 무거운 다양한 구성 요소 인터페이스를 구현하는 데 필요한 빈 외에도 모든 빈에 대해 지나치게 장황한 XML 배포 설명자가 필요했습니다.

** Stateless 세션 Bean은 일반적으로 풀링되고 Stateful 세션 Bean은 일반적으로 풀링되지 않지만 가능합니다. 따라서 두 유형 모두에 대해 풀링은 선택 사항이며 EJB 사양은 어느 쪽이든 강제하지 않습니다.


3
"EJB3 bean에는 범위 지정 개념이 없습니다"와 "EJB3에는 자체 이벤트 버스가 없습니다"라는 귀하의 진술에 약간 혼란스러워합니다. 이것이 "EJB CDI 빈이므로 CDI의 모든 이점을 가지고있다 " 는 David Blevin의 주장 과 어떻게 일치 합니까? 이 점에서 답변을 작성한 시점과 David가 블로그 항목을 작성한 시점 사이에 변경된 사항이 있습니까?
크리스

5
실제로 "CDI 빈"은 아니지만 관리 빈에 적용되는 서비스 가 있다는 다소 혼란스러운 개념 때문입니다 . 토론을 위해 사람들 (그리고 나 자신)은 어쨌든 그들을 "CDI bean '이라고 부릅니다. CDI 이전에는 EJB bean에는 명시적인 범위 지정이 없었습니다. David가 설명했듯이 Stateful은 암시 적으로 모든 범위이므로 특히 범위가 없습니다. CDI를 사용할 수있는 경우 EJB bean은 CDI 제공 범위를 활용할 수 있습니다. CDI 사양이 없으면 EJB 사양 만 볼 때 명시적인 범위가 없습니다.
Arjan Tijms

1
"관리 Bean에 적용되는 서비스가 있습니다"라는 의미에 대해 자세히 설명해 주시겠습니까? 실제로 CDI 빈과 같은 것이 없다는 것을 의미합니까? POJO-EJB-또는 JSF Managed Bean에서 추가 기능을 제공하는 일부일 뿐입니 까? JSF Managed Bean에서 주석 주입을 사용할 수 있습니까?
Koray Tugay 2013 년

3
@Chris는 EJB 사양 관점에서 더 명확히하기 위해 CDI 시작부터 EJB 구현이 EJB에 대한 CDI 기능 세트의 100 %를 지원하도록 요구하는 신중한 결정을 내 렸습니다. CDI의 모든 측면은 Stateful Bean으로 만 제한해야하는 범위를 제외하고 EJB에서 작동합니다.
David Blevins 2014 년

1
JSF 2.2는 기본적으로 CDI에 대한 JSF보기 범위의 포트 인 CDI 확장 인 javax.faces.view.ViewScoped를 제공합니다. 이를 통해 CDI는 JSF Managed Beans에 대한 완전한 드롭 인 대체품입니다.
jdessey 2014

-1

알버트 아인슈타인 : If you can't explain it simply, you don't understand it well enough

Ejbs와 CDI는 이해하기 매우 간단합니다.

Ejbs :

  1. 항상 @Stateless, @Stateful, @Request 등과 같은 범위 한정자에 의해 주석이 추가됩니다.
  2. Ejbs의 인스턴스는 Java EE 프레임 워크에 의해 제어되고 풀링됩니다. 소비자에게 인스턴스를 제공하는 것은 EE 프레임 워크의 의무입니다.

@Stateless

 public class CarMaker(){
    public void createCar(Specification specs){
        Car car = new Car(specs);
    }
}

CarMaker는 특정 Ejbs 범위로 주석이 달려 있으므로 Ejb입니다.

CDI :

  1. EE 프레임 워크에 의해 완전히 관리되지 않으므로 인스턴스를 직접 만들어야합니다.
  2. 항상 의존적입니다. 예를 들어 "종속"을 설명하겠습니다.

    class Specification { private String color; private String model; //- Getter and Setter }

Specification이 EJB 범위로 주석되지 않고이가 코드하지 EE 프레임 워크에 의해 초기화 이후 클래스는 CDI입니다. 여기서 주목해야 할 점은 Specification클래스에 주석을 달지 않았으므로 기본적으로 주석으로 주석 처리된다는 것 @Dependent입니다.

@Dependent  <- By default added 
class Specification { ... }

Further reading: Ejbs 범위 주석과 CDI 범위 주석 사이에 더 많은 것을 연구해야합니다.


아인슈타인은 또한 "모든 것은 가능한 한 단순해야하지만 더 단순 해서는 안된다 "라고 말했습니다 . 여기서 '만든'을 '설명 된'으로 바꿀 수 있습니다.
Kukeltje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.