EJB 사용하기
본 장에서는 예제를 이용해서 Stateless Session Bean과 Java Persistence API를 이용하여 Entity를 개발하고 deploy하는 과정에 대해 설명한다.
1. Session Bean 예제
Session Bean은 기본적으로 Business Interface와 Bean Class로 구성된다.
1.1. 예제
EJB 예제
다음의 예제 코드는 helloejb를 출력하는 Business 메소드를 가진 간단한 Stateless Session Bean 예제이다.
-
Business Interface
Stateless Session Bean 예제 : <Hello.java>package helloejb; import jakarta.ejb.Remote; @Remote public interface Hello { String sayHello(); }
-
Bean Class
Stateless Session Bean 예제 : <HelloBean.java>package helloejb; import jakarta.ejb.Stateless; @Stateless(mappedName="helloejb.Hello") public class HelloBean implements Hello { public String sayHello() { return "Hello EJB!"; } }
예제 코드는 다음의 디렉터리에서 찾아볼 수 있다.
JEUS_HOME/samples/getting_started/helloejb/helloejb-ejb/src/java/helloejb
서블릿 클라이언트 예제
helloejb를 호출하는 서블릿 클라이언트를 다음과 같이 구현한다.
package helloejb; import java.io.*; import jakarta.ejb.EJB; import jakarta.servlet.*; import jakarta.servlet.http.*; public class HelloClient extends HttpServlet { @EJB(mappedName="helloejb.Hello") private Hello hello; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); try { // Call session bean business method. String msg = hello.sayHello(); response.setContentType("text/html"); out.println("<html>"); out.println("<head>"); out.println("<title>HelloClient</title>"); out.println("</head>"); out.println("<body>"); out.println("<center><h1>" + msg + "</h1></center>"); out.println("</body>"); out.println("</html>"); out.close(); } catch(Exception ex){ response.setContentType("text/plain"); ex.printStackTrace(out); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
예제 코드는 다음 위치의 디렉터리에서 찾아볼 수 있다.
JEUS_HOME/samples/getting_started/helloejb/helloejb-war/src/java/helloejb
1.2. 컴파일
작성된 예제는 Ant를 이용하여 다음과 같이 빌드할 수 있다.
%JEUS_HOME%/samples/getting_started/helloejb>jant build
빌드가 정상적으로 완료되면 %JEUS_HOME%/samples/getting_started/helloejb/dist/helloejb.ear 애플리케이션 EAR 파일이 생성된다.
1.3. Deploy
패키징한 EJB 애플리케이션을 콘솔 툴로 deploy할 수 있다.
콘솔 툴 사용
콘솔 툴을 사용하여 deploy하는 과정은 다음과 같다.
-
위에서 작성한 helloejb.ear 파일을 임의의 경로에 위치시킨다.
-
jeusadmin으로 JEUS에 접속한다.
jeusadmin –u jeus –p <password>
-
다음과 같이 실행하여 애플리케이션을 MASTER에 install한다.
[MASTER]domain1.adminServer>install-application -id helloejb C:\TmaxSoft\JEUS\samples\getting_started\helloejb\dist\helloejb.ear Successfully installed application[helloejb].
-
다음과 같이 실행하여 애플리케이션을 MS(server1)에 deploy한다.
[MASTER]domain1.adminServer>deploy helloejb -servers server1 Succeeded to deploy the application : helloejb
2. Java Persistence API 예제
본 절에서는 Java Persistence API를 통해 Entity를 작성하고 컴파일하여 deploy하는 과정을 설명한다.
2.1. 예제
EJB 예제
예제는 Product Entity와 이를 다루는 EJB인 ProductManager Session Bean으로 구성되어 있다.
-
Entity
Java Persistence API 예제 : <Product.java>package hellojpa; import java.io.Serializable; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.NamedQuery; @Entity @NamedQuery(name="findAllProducts", query="SELECT p FROM Product p") public class Product implements Serializable { @Id private String productId; private double price; private String description; public Product() { } public Product(String productId, double price, String description){ this.productId = productId; this.price = price; this.description = description; } public String getProductId() { return productId; } public void setProductId(String id) { this.productId = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String toString() { return "Product[productId=" + productId + ", price=" + price + ", description=" + description + "]"; } }
-
Business Interface
Java Persistence API 예제 : <ProductManager.java>package hellojpa; import java.util.Collection; import jakarta.ejb.Local; @Local public interface ProductManager { Product createProduct(String productId, double price, String desc); Product getProduct(String productId); Collection findAllProducts(); Collection findProductsByDescription(String desc); Collection findProductsInRange(double low, double high); void updateProduct(Product product); void removeProduct(Product product); void removeAllProducts(); }
-
Bean Class
Java Persistence API 예제 : <ProductManagerBean.java>package hellojpa; import java.util.Collection; import jakarta.ejb.Stateless; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; @Stateless(mappedName="hellojpa.ProductManager") public class ProductManagerBean implements ProductManager { @PersistenceContext private EntityManager em; public ProductManagerBean() { } public Product createProduct(String productId, double price, String desc){ Product product = new Product(productId, price, desc); em.persist(product); return product; } public Product getProduct(String productId){ return (Product)em.find(Product.class, productId); } public Collection findAllProducts() { return em.createNamedQuery("findAllProducts").getResultList(); } public Collection findProductsByDescription(String desc){ Query query = em.createQuery("SELECT p FROM Product p WHERE p.description=:desc"); query.setParameter("desc", desc); return query.getResultList(); } public Collection findProductsInRange(double low, double high){ Query query = em.createQuery("SELECT p FROM Product p WHERE p.price between :low and :high"); query.setParameter("low", low).setParameter("high", high); return query.getResultList(); } public void updateProduct(Product product){ Product managed = em.merge(product); em.flush(); } public void removeProduct(Product product){ Product managed = em.merge(product); em.remove(managed); } public void removeAllProducts(){ em.createQuery("DELETE FROM Product p").executeUpdate(); } }
예제 코드는 다음의 디렉터리에서 찾아볼 수 있다.
JEUS_HOME/samples/getting_started/hellojpa/hellojpa-ejb/src/java/hellojpa
서블릿 클라이언트 예제
ProductManager EJB를 사용하여 데이터베이스에 데이터를 저장하고 데이터를 다루는 서블릿 클라이언트를 다음과 같이 구현한다.
package hellojpa;
import java.io.*;
import java.util.Collection;
import jakarta.ejb.EJB;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
public class ProductManagerClient extends HttpServlet {
@EJB
private ProductManager productManager;
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.println("SERVLET CLIENT CONSOLE OUTPUT:\n");
productManager.removeAllProducts();
out.println("Cleaned up existing products.\n");
out.println("Creating products...");
Product p1 = productManager.createProduct("1", 10.00, "Ceramic Dog");
Product p2 = productManager.createProduct("2", 13.00, "Wooden Duck");
Product p3 = productManager.createProduct("3", 19.00, "Ivory Cat");
Product p4 = productManager.createProduct("4", 33.00, "Ivory Cat");
Product p5 = productManager.createProduct("5", 22.00, "Chrome Fish");
Collection products;
out.println("Created products:");
products = productManager.findAllProducts();
for(Object product : products){
out.println(product);
}
out.println();
out.println("Find product with productId 1:");
Product pp1 = productManager.getProduct("1");
out.println("Found = " + pp1.getDescription() + " $" + pp1.getPrice());
out.println("Update the price of this product to 12.00");
pp1.setPrice(12.00);
productManager.updateProduct(pp1);
Product pp2 = productManager.getProduct("1");
out.println("Product " + pp2.getDescription() + " is now $" + pp2.getPrice());
out.println();
out.println("Find products with description:");
products = productManager.findProductsByDescription("Ivory Cat");
for(Object product : products){
out.println(product);
}
out.println();
out.println("Find products with price range between 10.00 and 20.00");
products = productManager.findProductsInRange(10.00, 20.00);
for(Object product : products){
out.println(product);
}
out.println();
out.println("Removed all products.");
productManager.removeProduct(p1);
productManager.removeProduct(p2);
productManager.removeProduct(p3);
productManager.removeProduct(p4);
productManager.removeProduct(p5);
out.close();
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
예제코드는 다음의 디렉터리에서 찾아볼 수 있다.
JEUS_HOME/samples/getting_started/hellojpa/hellojpa-war/src/java/hellojpa
2.2. 컴파일
jant를 이용하여 예제 코드를 다음과 같이 빌드할 수 있다. 빌드와 데이터베이스 설정이 완료되었다면 패키징된 모듈을 deploy할 준비가 완료되었다.
-
예제가 작성된 경로에서 다음과 같이 ant build 명령어를 실행한다.
C:\TmaxSoft\JEUS\samples\getting_started\hellojpa>jant build
-
빌드가 정상적으로 완료되면 dist\hellojpa.ear 애플리케이션 EAR 파일이 생성된다.
이번 예제는 데이터베이스를 필요로 하므로 Derby를 시작시키도록 한다. 또한 데이터베이스가 jdbc/sample 데이터소스로 설정되어 있어야 한다. 자세한 내용은 시스템 설정을 참고한다.
Derby가 시작되었다면 다음과 같이 데이터베이스 테이블을 생성한다. 본 예제에서는 "sample"이라는 데이터베이스를 사용할 것이다.
CREATE TABLE PRODUCT (PRODUCTID VARCHAR(255) NOT NULL, PRICE FLOAT, DESCRIPTION VARCHAR(255), PRIMARY KEY (PRODUCTID));
-
다음과 같이 ant setup 명령어를 실행해서 데이터베이스 테이블을 생성한다.
C:\TmaxSoft\JEUS\samples\getting_started\hellojpa>jant setup
2.3. Deploy
패키징한 EJB 애플리케이션을 콘솔 툴로 deploy할 수 있다.
콘솔 툴 사용
콘솔 툴을 사용하여 deploy하는 방법은 다음과 같다.
-
jeusadmin으로 JEUS에 접속한다.
jeusadmin –u jeus –p <password>
-
애플리케이션을 MASTER에 install한다.
[MASTER]domain1.adminServer>install-application -id hellojpa C:\TmaxSoft\JEUS\samples\getting_started\hellojpa\dist\hellojpa.ear Successfully installed application[hellojpa].
-
애플리케이션을 MS(server1)에 deploy한다.
[MASTER]domain1.adminServer>deploy hellojpa -servers server1 Succeeded to deploy the application : hellojpa
-
모듈이 정상적으로 deploy되었는지 확인한다.