Анзор Кармов
레벨 31
Санкт-Петербург

EJB 소개

Random-KO 그룹에 게시되었습니다
이번 글에서는 EJB(Enterprise JavaBeans)에 대해 살펴보겠습니다. 이 기술은 Java EE 사양의 일부입니다. 우리는 다음과 같은 문제를 다룰 것입니다:
  • EJB는 무엇입니까?
  • EJB의 역사는 무엇입니까?
  • EJB에는 어떤 유형이 있나요?
또한 EJB와 서블릿을 사용하여 작은 HelloWorld 애플리케이션을 작성해 보겠습니다. EJB 소개 - 1이 기사는 Java SE에 익숙해지고 Java EE를 배우기 시작한 독자에게 유용할 것입니다. 이 기사의 실제적인 부분을 완전히 이해하려면 먼저 " 로컬 환경 설정 " 기사를 읽는 것이 좋습니다 .

EJB의 간략한 역사

1996년, 이 글의 저자가 5살이었을 때, Java는 이미 개발자들 사이에서 인기가 있었습니다. 그 이유는 친숙한 API, 자동 가비지 수집 등이었습니다. Java는 백엔드를 담당하는 시스템에서 널리 사용되었습니다. 그러나 언어의 모든 장점에도 불구하고 당시 프로그래머에게는 아직 JDK에 구현되지 않은 특정 기능이 필요했습니다. 이러한 요구 사항은 다음과 같습니다.
  • 데이터 지속성을 보장합니다.
  • 거래 무결성
  • 데이터에 대한 경쟁력 있는 액세스(멀티스레딩 제어)
  • 그리고 아마도 다른 것일 것입니다.
이 모든 것이 자체적으로 작성하고 폐쇄된 도서관 인구의 자연스러운 증가로 이어졌습니다. 즉, 모든 사람은 최선을 다해 자신의 필요를 충족했습니다. IBM은 “모든 사람은 자신의 요구 사항을 동일한 방식으로 충족해야 한다”는 슬로건을 내세우고 1997년 EJB(Enterprise Java Bean) 사양을 출시했습니다. 이것이 바로 개발 프로세스를 통합하고 일반적인 문제(위에서 필요에 따라 설명됨)에 대한 솔루션을 프레임워크에 적용하는 것을 가능하게 했습니다. Sun은 2년 동안 IBM의 아이디어를 채택해 왔으며 1999년에 EJB 1.0 사양을 출시했습니다. 이것이 바로 기술이 탄생한 방식이며, 이에 대해서는 보다 적용되는 맥락에서 더 자세히 논의할 것입니다.

EJB란?

어떤 의미에서 EJB는 상황에 따라 일반적으로 Enterprise JavaBeans 기술 자체를 의미하거나 EJB 기술의 일부인 일부 특정 Enterprise JavaBean 소프트웨어 구성 요소(bean)를 의미할 수 있는 집합적인 용어입니다. 기술로서의 EJB에 대한 정의는 Wikipedia에 나와 있습니다. Enterprise JavaBeans(종종 약어 EJB로도 사용됨)는 비즈니스 로직이 포함된 서버 구성 요소를 작성하고 지원하기 위한 기술 사양입니다. 이는 Java EE의 일부입니다. 이 기술은 일반적으로 비즈니스 논리에 다음 서비스 중 하나 이상이 필요할 때 사용되며, 대개는 모두 서비스가 필요합니다.
  • 데이터 지속성 지원: 프로그램을 종료한 후에도 데이터는 안전해야 합니다. 대부분 데이터베이스를 사용하여 달성됩니다.
  • 분산 트랜잭션 지원;
  • 병렬 데이터 수정 및 멀티스레딩 지원;
  • 이벤트 지원;
  • 이름 지정 및 디렉토리 지원(JNDI)
  • 데이터에 대한 보안 및 접근 제한;
  • 애플리케이션 서버에서의 자동 설치 지원;
  • 원격 액세스.
위에 나열된 서비스는 EJB 기술의 확실한 이점입니다. 또 다른 장점은 위에 나열된 모든 것이 즉시 작동한다는 것입니다. 저것들. 프로그래머는 분산 트랜잭션 지원에 대해 생각할 필요가 없습니다. 프로그래머는 현재 구현하려는 비즈니스 로직에 대해서만 생각하면 됩니다. 특정 소프트웨어 구성요소인 EJB는 애플리케이션의 일부 비즈니스 로직을 포함하는 EJB 사양의 하나 이상의 주석이 포함된 Java 클래스입니다. EJB 사양의 주석은 태그가 지정된 클래스에 특정 권한, 권한 및 초능력을 제공합니다. 이에 대해 아래에서 자세히 알아보세요.

EJB 유형

요약해보자. EJB는 특수 주석 중 하나로 표시된 일반 Java 클래스입니다. 이러한 클래스를 빈(Bean)이라고 합니다. 클래스에 어떤 주석이 표시되어 있는지에 따라 이는 하나 또는 다른 유형의 EJB(빈)를 대표하게 됩니다. 콩에는 세 가지 주요 유형이 있습니다.
  • 메시지 구동 빈(Message Driven Bean);
  • Entity Bean - JPA(Java Persistence API) 사양에 정의되어 있으며 데이터를 저장하는 데 사용됩니다.
  • 세션 빈.
후자(세션 빈)는 여러 하위 유형으로 나뉩니다.
  • 무국적(상태 없음);
  • 상태 저장(현재 세션 상태 지원)
  • 싱글톤(전체 애플리케이션에 대한 하나의 객체, EJB 3.1부터 시작)
EJB 소개 - 2아래에서는 각 유형의 콩에 대해 자세히 살펴보겠습니다.

세션 빈

세션 빈(Session Bean) 또는 세션 빈은 특정 유형의 빈입니다. 이는 클라이언트가 Bean의 메소드를 호출하여 프로그래밍 방식으로 호출할 수 있는 비즈니스 로직을 캡슐화합니다. 메소드 호출은 다음을 수행할 수 있습니다.
  • 세션 빈과 동일한 JVM의 다른 클래스에 의해 로컬로;
  • 원격으로, 네트워크를 통해, Java RMI(Remote Method Invocation) 기술을 사용하여 다른 JVM에서.
"세션"이라는 단어는 서버가 특정 작업을 수행하는 동안에만 Bean을 사용할 수 있으며 서버 장애 또는 종료 시 복구할 수 없게 파기된다는 의미입니다. Session Bean 인스턴스의 라이프사이클은 EJB 컨테이너에 의해 제어됩니다(EJB 컨테이너에 대한 자세한 내용은 시리즈의 첫 번째 강의 에서 읽을 수 있습니다 ). Stateless Session Bean은 상태에 대한 정보를 저장하지 않습니다. 이러한 유형의 구성 요소는 다양한 클라이언트에서 사용할 수 있습니다. Stateless Bean은 한 번의 작업으로 완료할 수 있는 비즈니스 프로세스를 구현하는 데 사용됩니다. 예를 들어, 고객의 신용 기록을 확인합니다. 단일 Bean 인스턴스를 여러 클라이언트에서 사용할 수 있으므로 개발자는 Bean 데이터에 대한 스레드로부터 안전한 액세스를 제공해야 합니다. 이 유형의 Bean(다른 모든 세션 Bean 포함)을 작성하는 것은 매우 간단합니다. 이것은 주석이 있는 일반 Java 클래스입니다 @Stateless. 아래에 예를 들어 보겠습니다.
import javax.ejb.Stateless;

@Stateless
public class StatelessEjbExample {
    public String sayHi() {
        return "Hi, I'm Stateless EJB!";
    }
}
현재 세션 상태(Stateful)를 지원하는 세션 Bean은 동일한 클라이언트에서 호출하는 사이에 상태에 대한 정보를 유지하고 클라이언트의 명시적인 요청 시 세션 Bean의 존재를 종료합니다. 이는 Stateful Bean이 각 클라이언트마다 고유하다는 사실로 인해 달성됩니다. 이러한 유형의 Bean이 담당할 수 있는 작업의 예로는 온라인 상점의 장바구니를 각 사용자에 대해 최신 상태로 유지하는 것입니다. 이러한 Bean의 라이프사이클은 EJB 컨테이너에 의해 관리됩니다. 이러한 Bean은 클라이언트가 종료될 때에도 삭제됩니다. 이러한 콩은 만들기도 매우 쉽습니다. 이는 주석으로 표시된 Java 클래스입니다 Stateful. 아래 예:
import javax.ejb.Stateful;

@Stateful
public class StatefulEjbExample {
    public String sayHi() {
        return "Hi, I,m Stateful EJB";
    }
}
싱글톤 세션 Bean은 애플리케이션 수명 동안 한 번 시작되며 애플리케이션의 전체 수명 동안 존재합니다. 이러한 Bean은 모든 클라이언트가 하나의 상태를 공유해야 하는 상황을 위해 설계되었습니다. Stateless Bean과 마찬가지로 독립형 Bean에서도 개발자는 Bean이 스레드로부터 안전한 환경을 갖고 있는지 확인해야 합니다. 위에서 논의한 상대편만큼 생성하기 쉬운 싱글톤 빈의 예를 들어보겠습니다. 이것이 주석이 있는 Java 클래스라고 추측하기 쉽습니다 @Singleton. 하지만 이 경우에는 주의가 필요합니다. 구문은 동일하지만 목적이 다르고 다른 패키지에 있는 두 개의 주석이 있습니다.
  • javax.ejb.싱글턴
  • javax.inject.싱글턴
EJB를 생성하려면 javax.ejb. 아래 예:
import javax.ejb.Singleton;

@Singleton
public class SingletonEjbExample {
    public String sayHi() {
        return "Hi, I'm Singleton EJB!";
    }
}

메시지 기반 빈

메시지 구동 Bean(MDB) 또는 메시지 구동 Bean은 세션 Bean과 같은 일부 비즈니스 로직을 구현합니다. 그러나 MDB는 친척과 달리 한 가지 중요한 차이점이 있습니다. 클라이언트는 MDB 메서드를 직접 호출하지 않습니다. 이러한 Bean은 대부분 JMS(Java Message Service) 메시지의 리스너 역할을 하며 시스템 부분 간의 비동기 메시지 교환을 구성하는 데 사용됩니다. 이러한 메시지의 예로는 자동화된 소매 시스템에서 공급 관리 시스템으로의 재고 배송 요청이 있습니다. 다음은 MDB Bean의 예입니다. 세션 빈과 달리 생성은 좀 더 흥미롭습니다.
import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/TestQueue")
public class MessageDrivenEjbExample implements MessageListener {

    @Resource
    private MessageDrivenContext messageDrivenContext;

    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage msg = (TextMessage) message;
                msg.getText();
            }
        } catch (JMSException e) {
            messageDrivenContext.setRollbackOnly();
        }
    }

}
주석은 MessageDrivenMDB 클래스를 빈으로 만듭니다. 주석 내에서 JNDI(JNDI에 대한 내용은 여기 참조 )를 사용하여 클래스가 리스너가 되는 JMS 배포판의 이름을 결정합니다. 또한 우리 클래스는 인터페이스 MessageListener와 해당 메서드를 구현합니다 onMessage. 이 메소드는 주석 내부에 정의된 이름을 사용하여 큐/배포에서 일부 메시지가 도착할 때 호출됩니다 MessageDriven.

엔터티 빈

EJB 기술의 일부는 JPA 사양입니다. JPA(Java Persistence API)는 Java 개체(Entity Bean)의 ORM(Object-Relational Mapping)을 제공하고 이러한 개체를 저장, 검색 및 관리하기 위한 API를 제공하는 사양입니다. JPA를 사용하면 데이터베이스의 데이터를 Java 개체로 나타낼 수 있을 뿐만 아니라 Java 개체를 데이터베이스의 레코드로 저장할 수도 있습니다. 모든 클래스가 그러한 객체로 작동할 수는 없지만 Entity Bean이 작동할 수 있습니다. Entity Bean은 데이터베이스의 테이블을 나타내는 Java 클래스입니다. 표시(매핑)는 특수 주석을 사용하여 수행됩니다. 도움을 받아 Java 클래스를 데이터베이스의 테이블과 비교하고 Java 클래스의 필드를 데이터베이스 테이블의 필드와 비교합니다. 다음은 코드에 주석이 포함된 Entity Bean의 예입니다.
@Entity // Делает данный класс Entity бином
@Table(name = "employee") // "Связывает" данный класс с таблицей employee в БД
public class Employee implements Serializable {

    @Id // Говорит о том, что поле ниже является первичным ключом
    @GeneratedValue(strategy = GenerationType.AUTO) // Определяет тип генерации значений первичного ключа
    private int id;

    @Column(name="name") // "Связывает" поле ниже с полем name в таблице employee в БД
    private String name;

    @Column (name="age") // "Связывает" поле ниже с полем age в таблице employee в БД
    private int age;

    // getters and setters...
}
이러한 유형의 Bean은 JPA 사양을 연구하는 맥락에서만 연구하는 것이 의미가 있다는 점은 주목할 가치가 있습니다.

애플리케이션 작성: EJB HelloWorld

이 섹션에서는 GlassFish 서버에 배포할 작은 Java EE HelloWorld 애플리케이션을 작성합니다. 이 기사를 읽기 전에 로컬 환경 설정에 대한 기사를 읽어 보는 것이 좋습니다 .
  1. IntelliJ IDEA에서 새 Maven 프로젝트를 만듭니다.

    파일 -> 새로 만들기 -> 프로젝트...

    EJB 소개 - 3
  2. 다음 을 클릭합니다 .

  3. Maven 프로젝트 매개변수를 입력합니다.

    EJB 소개 - 4
  4. 마침을 클릭하세요

  5. 프로젝트가 생성되었으며 다음과 같은 구조를 갖습니다.

    EJB 소개 - 5
pom.xml 파일은 다음과 같습니다. EJB 소개 - 6먼저 Java EE API에 대한 종속성을 추가하고 웹 애플리케이션 아카이브(war) 형식으로 프로젝트 패키징을 지정해야 합니다. 이렇게 하려면 pom.xml 코드를 다음 형식으로 변경해야 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javarush.lectures</groupId>
    <artifactId>ejb_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
    </dependencies>

</project>
다음으로 Java 코드로 넘어갈 수 있습니다. 우리의 응용 프로그램은 가장 간단합니다. 우리는 1개의 서블릿과 1개의 EJB를 갖게 될 것입니다. 이는 상태 비저장 세션 Bean이 됩니다. EJB 내에서는 "Hello World" 문자열을 반환하는 메서드 하나만 정의합니다. 우선 패키지를 만들어 보겠습니다 com.javarush.lectures. 그런 다음 패키지 내에서 com.javarush.lecturesDemoEJB라는 Bean을 생성합니다. Bean 코드는 다음과 같습니다.
import javax.ejb.Stateless;

@Stateless
public class DemoEJB {
    public String helloWorld() {
        return "Hello world!";
    }
}
앞서 말했듯이 모든 것이 매우 간단합니다. 다음 단계는 HTTP 요청에 대한 응답으로 EJB의 값을 전달하는 서블릿을 만드는 것입니다. 서블릿이 이 기사의 주제는 아니지만 EJB를 시연하려면 서블릿을 사용해야 한다는 점은 주목할 가치가 있습니다. 이를 위해 DemoServletEJB와 동일한 패키지에 새 서블릿을 생성해 보겠습니다. 해당 코드는 다음과 같습니다.
@WebServlet("/helloWorld")
public class DemoServlet extends HttpServlet {

    @EJB
    private DemoEJB ejb;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write(ejb.helloWorld());
    }
}
다음은 코드에 대한 간단한 설명입니다. Abstract @WebServlet("/helloWorld")- 엔드포인트에 대한 HTTP 요청을 처리하는 서블릿으로 클래스를 정의합니다 /helloWorld. 우리 수업에는 하나의 필드가 있습니다 DemoEJB ejb. 이것은 앞서 정의한 Bean입니다. 클래스 필드에 대한 주석 - @EJBDI(종속성 주입)를 수행합니다. 저것들. ejb 변수는 필요할 때 새 인스턴스로 자동으로 초기화됩니다. 우리 클래스는 HttpServlet의 자손이며 슈퍼클래스 메서드 중 하나인 를 재정의합니다 doGet. 이 메소드는 HTTP GET 요청을 처리하고 두 개의 매개변수( HttpServletRequest및 ) 를 사용합니다 HttpServletResponse. HttpServletRequest들어오는 HTTP 요청에 대한 정보를 얻는 역할을 합니다. HttpServletResponse요청에 대한 응답을 생성하는 데 필요합니다. 메서드 내 PrintWriter에서 HttpServletResponse. getWriter()다음으로 write. 실제로 이는 PrintWriter우리가 정의한 EJB에서 얻은 값(값은 "Hello World!" 문자열임)을 -a 객체에 작성하여 사용하는 것입니다. HTTP 요청을 보낸 클라이언트는 요청에 대한 응답으로 이 값을 받습니다. 다음 단계는 GlassFish Java EE 서버에서 애플리케이션을 시작하는 것입니다. 이를 위해 로컬 환경 설정 문서 에 설명된 대로 새 구성을 생성합니다 . 아래는 현재 프로젝트의 완성된 구성 스크린샷입니다. 시작하기 전에 GlassFish 서버가 설치되어 있는지 확인하십시오. 시작 구성을 생성한 후 Run -> Run 'ejb_demo' 메뉴를 사용 하거나 Shift+F10EJB 소개 - 7 단축키를 사용하여 애플리케이션을 시작하십시오 . 실행 후 해당 로그를 볼 수 있습니다. 또한 열리는 브라우저도 다음과 같습니다. 이 모든 것은 애플리케이션이 의도한 대로 작동함을 나타냅니다. EJB 소개 - 8EJB 소개 - 9

결론

이 기사에서 우리는 EJB(Enterprise JavaBeans)에 대해 알아봤습니다. 우리는 다음과 같은 질문을 고려했습니다.
  • EJB란 무엇입니까?
  • EJB 역사
  • 다양한 유형의 EJB
EJB는 다음과 같은 유형으로 제공됩니다.
  • 메시지 구동 빈(Message Driven Bean);
  • Entity Bean - JPA(Java Persistence API) 엔터티 사양에 정의되어 있으며 데이터를 저장하는 데 사용됩니다.
  • 세션 빈:
    • 무국적(상태 없음)
    • 상태 저장(현재 세션 상태 지원)
    • 싱글톤(전체 애플리케이션에 대한 하나의 객체, EJB 3.1부터 시작)
또한 EJB를 사용하여 작은 HelloWorld 애플리케이션을 작성했습니다. PD로서 이 기사의 실제적인 부분을 직접 반복할 수 있습니다. 그런 다음 Stateful Bean과 싱글톤 Bean을 사용하여 값을 수신하는 두 개의 서블릿을 애플리케이션에 추가합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION