====== Basic J2EE Development Using Rational Application Developer (RAD) v6 ======
Web Age Solutions Inc.
{{keywords>>J2EE Development Using Rational Application Developer v6 creation client stub}}
===== Introduction =====
이번 강좌는 RAD(Rational Application Developer) v6을 이용한 Session EJB, Servlets, JSP개발에 대해 알아보고자 한다.\\
이제부터 제곱근을 구하는 간단한 Application을 개발할 것이다. 숫자를 입력하지 않거나 음수일 경우에는 에러 페이지를 돌려준다.
===== Launch and Configure RAD v6 =====
RAD IDE를 기동시킨다.(Start Menu **Programs->IBM Rational->IBM Rational Application Developer V6.0->Rational Application Developer**).
{{study:ejb:workspace.jpg|Workspace Launcher}}
workspace폴더 위치를 지정하고 **ok**를 클릭
IDE가 **환영**페이지를 보여줄 것이다.
{{study:ejb:profile.jpg|Welcome screen}}
오른쪽 아래구석에 **Enable/Disable roles**아이콘을 클릭한다.
그림에 보이는 **Advanced J2EE** role을 클릭하면 선택된 역할에 해당되는 메뉴를 보여준다.
===== Create the Projects =====
{{study:ejb:project.jpg|Create the Project}}
**Project Explorer**에서 **Enterprise Applications**에 마우스 오른쪽 클릭후 **New->Enterprise Application Project**을 선택한다.
Project이름으로 Test Application을 입력하고 **Show Advanced**버튼을 클릭한다.
{{study:ejb:entapp.jpg|Enterprise Application}}
기본 J2EE level이 1.4이며, Target Server가 Application Server v6.0임을 주목하기 바란다. Target Server는 Project의 Class Path에 추가될 J2EE jar파일들을 결정한다. RAD v6에서는 Test Server가 자동 생성된다.
**finish**버튼을 클릭한다.
**Project Explorer**의 **EJB Projects**에 오른쪽 마우스 클릭후 **New->EJB Project**을 선택한다. Project Name으로 TestEJB를 입력한다. **Show Advanced**을 클릭한다. EAR프로젝트로 Test Application을 지정한다.
{{study:ejb:ejbproject.jpg|EJB Projects}}
**다음**을 클릭한다. 기본으로 지정되어 있는 EJB Client project이름과 jar file이름을 받아들인다.
여기서 EJB client project란 remote/local interface와 이것으로부터 자동 생성된 stub class들의 집합들을 말한다.
project는 EJB client application을 compile하고 실행할 최소한의 class들로 이루어져있다.
이제 **finish**를 클릭한다.\\
여기서 잠깐 EJB project가 EJB client project의 home interface에 어떻게 접근하는지 짚고 넘어가자. EJB client project는 utility JAR project((utility JAR project의 개념은 매우 오래된것으로 자세한 논의는 이 강좌의 범위를 벗어난다.))로서 Enterprise application project(예제에서는 **Test Application**이다.)에 설정되어 있다.
EJB project(예제에서는 **Test EJB**)는 client project에 의존하고 있다.
**Project Explorer** view에서 **Dynamic Web Projects**에 오른쪽 클릭 후 **New->Dynamic Web Project**를 선택한다. Project이름으로 Test Web을 입력하고 **Show Advanced**버튼을 클릭한다. EAR project로 Test Application을 입력하고 context root를 testweb으로 변경한다.
{{study:ejb:webproj.jpg|Web Project}}
**다음**을 클릭한다.
{{study:ejb:depend.jpg|dependent jars}}
Test_EJBClient.jar에 체크를 하자. EJB client계층(여기서는 Web project)은 client JAR파일에만 의존해야 하며 실제의 EJB JAR파일에 의존해서는 안된다. 여기서 EJB JAR파일은 EJB 모듈이 배포되는 application 서버에만 설치된다. 반면에 client JAR파일은 원하는 서버에 분산되어 배포될 수 있다.
**다음**을 클릭하자. Features창에서 Struts나 JSTL을 추가할 수도 있다. 하지만 우리의 간단한 application은 추가 feature를 필요로 하지 않는다. **Finish**버튼을 클릭하고 **Confirm Perspective Switch** 대화창에서 **No**를 클릭한다.
===== Build the Model Layer =====
우리의 Model계층은 매우 간단하다. 제곱근의 계산결과를 담을 JavaBean을 만들것이다.또한 비지니스 로직을 담당하는 EJB session bean을 작성할 것이다.
여기서 JavaBean은 DTO(Data Transfer Object)이다. EJB계층과 Client계층에서 이 DTO클래스에 접근하게 될 것이다. 소규모 application의 경우에는 EJB client project에 Common 클래스들을 포함시키는 것이 편리하다. client project는 이미 utility JAR project로서 설정되어 있고 EJB와 Web project는 이 프로젝트에 의존하고 있다. 그러므로 client JAR파일은 client계층에만 배포하면 된다. 이보다 더 복잡한 application에서는 공통의 code(utility classes등)를 Java project로서 생성하고 이를 utility JAR projects로 설정하게 된다.
**Other Projects**를 펼쳐서 **Test EJBClient**를 마우스 오른쪽 클릭한다. **New->Package**를 선택한다. package이름으로 com.webage.beans을 입력하고 **Finish**를 클릭한다. 새로 생성된 package에서 오른쪽 클릭하고 **New->Class**를 선택한다.
Class이름으로 SquareRootResultBean을 입력하고 **Finish**를 클릭한다. java.io.Serializable interface를 추가하고 아래와 같이 두개의 member변수를 추가한다.
public class SquareRootResultBean implements java.io.Serializable {
private double sourceNumber;
private double resultValue;
}
**Source->Generate Getters and Setters**를 클릭하여 setter method와 getter method를 생성하고 SquareRootResultBean.java를 저장한다.\\
이제 session bean을 만들 차례이다. **EJB projects->Test EJB**를 펼쳐서 **Deployment Descriptor:Test EJB**를 마우스 오른쪽 클릭한다. 다음으로 **New->Enterprise Bean**을 선택한다.
{{study:ejb:session.jpg|Session Bean}}
생성할 EJB bean 종류로 session bean을 선택한다. bean name으로는 SimpleSession을 입력한다. default package로 com.webage.ejbs을 선택한다. **다음**을 클릭한다. 여기서는 기본값(stateless nature and remote interface only)으로 그대로 두고 **Finish**를 클릭한다.
IDE는 자동으로 EJB를 class diagram에 추가해준다. 저장하고 class diagram을 닫는다.
**Test EJB->ejbModule->com.webage.ejbs**을 펼친다. SimpleSessionBean.java를 더블 클릭하고 아래와 같이 새 메소드를 추가한다.
public SquareRootResultBean getSuqareRoot(double val) {
SquareRootResultBean r = new SquareRootResultBean();
r.setSourceNumber(val);
r.setResultValue(Math.pow(val, 0.5));
return r;
}
**Ctrl+Shift+O**를 클릭해서 필요한 package를 import하고 저장, class를 compile한다.
{{study:ejb:outline.jpg|Outline}}
Outline view에서 getSquareRoot메소드를 마우스 오른쪽 click하여 Enterprise Bean->Promote Remote Interface를 선택한다.
이것으로 EJB 개발을 마쳤다. 이제 deployment code를 생성할 차례다.
project Explorer view에서 Test EJB를 마우스 오른쪽 클릭하고 Deploy를 선택한다.
Deploy한 후에는 RAD가 자동으로 코드를 생성해 준다. 생성된 client project의 stub class들은 Test EJBClient project에서 확인할 수 있다. 그 이외의 생성된 class는 EJB project에서 확인가능하다.
===== Unit Test the EJB =====
{{study:ejb:server.jpg|Server}}
Servers view에서 WebSphere Application Server v6.0을 선택해 기동시킨다.((RAD는 WSAD는 달리 서버를 기동시키고 나서야 프로젝트를 추가할 수 있다. 서버가 기동되어 있지 않다면 RAD는 debug모드로 시작할 것이다. non-debug모드로 기동시키고 project를 추가하는 것이 속도면에서 빠르다.))
서버가 기동되기를 기다리자. console창에 몇가지 에러메세지가 나오더라도 무시하자. server를 오른쪽 클릭해서 **Add or Remove Projects**를 선택한다. Test Application project를 server에 추가하고 **Finish**를 클릭한다. project가 배포되는데 1~2초정도 걸린다.
다시 server를 오른쪽 클릭하여 **Run universal test client**를 선택한다.
{{study:ejb:jndi.jpg|JNDI}}
**JNDI Explorer**를 클릭한다. **ejb->com->webage->ejbs**를 펼쳐서 위의 그림에 보이듯 **SimpleSessionHome**을 클릭한다.
{{study:ejb:home.jpg|SimpleSessionHome}}
왼쪽편에 **SimpleSession->SimpleSessionHome**을 펼쳐서 create()를 클릭한다. **Invoke**버튼을 클릭하면 remote interface의 reference를 얻어오게 된다. 다음으로 **Work with Object**버튼을 클릭한다.
{{study:ejb:remote.jpg|Remote Interface}}
왼쪽편에 SimpleSession 1을 펼쳐서 getSquareRoot메소드를 클릭한다.
{{study:ejb:param.jpg|Parameter}}
오른쪽에 메소드 parameter값으로 4.0을 입력하고 **Invoke**버튼을 클릭한다. 이것으로 SquareRootResultBean Object를 얻어오게 된다. 앞서와 마찬가지로 **Work with Object** 버튼을 클릭한다.
{{study:ejb:result.jpg|Result}}
왼쪽에 **Objects->SquareRootResultBean**를 펼쳐서 getResultValue()를 클릭한다. Invoke를 클릭한 후 결과값으로 2.0이 돌아오는 것을 확인한다.
{{study:ejb:result2.jpg|Result2}}
model계층 test가 끝났으니 이제 우리는 client계층-Web계층으로의 build단계로 넘어갈 수 있다.
===== Develop the Controller =====
Project Explorer view에서 **Dynamic Web Prjects->Test Web**을 펼친다. **Deployment Descriptor:Test Web**을 오른쪽 클릭하고 **New->Reference**를 선택한다.
**EJB Reference**를 선택하고 **Next**를 클릭한다.
{{study:ejb:ref.jpg|reference}}
reference name으로 **SimpleSessionRef**을 입력하고 위의 그림에 보이듯 **SimpleSssion EJB**를 선택한다. 이제 **Finish**를 클릭한다.
**Deployment Descriptor : Test Web**을 오른쪽 클릭하고 **New->Servlet**을 선택한다. Servlet name으로 SquareRootServlet을 입력하고 **Next**을 클릭한다. package name으로 com.webage.servlets을 입력하고 **Finish**을 클릭한다.
**Java Resources->JavaSource->com.webage.servlets**을 펼쳐서 SquareRootServlet.java을 더블클릭한다. 밑의 import 구문을 추가한다.
import javax.naming.*;
import com.webage.beans.*;
import com.webage.ejbs.*;
doGet method의 parameter를 아래와 같이 변경한다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet method안에 다음코드를 입력한다.
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
double val = 0.0;
String errorMessage = null;
try {
val = Double.parseDouble(request.getParameter("value"));
} catch (NumberFormatException e) {
errorMessage = "Please enter a valid number.";
} catch (NullPointerException e) {
errorMessage = "Please enter a value.";
}
if (errorMessage != null) {
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/failure.jsp").forward(request, response);
return;
}
try {
SimpleSessionHome sh;
SimpleSession s;
Context ctx = new InitialContext();
Object o = ctx.lookup("java:comp/env/SimpleSessionRef");
sh = (SimpleSessionHome) PortableRemoteObject.narrow(o,
SimpleSessionHome.class);
s = sh.create();
SquareRootResultBean rb = s.getSuqareRoot(val);
request.setAttribute("resultBean", rb);
request.getRequestDispatcher("/success.jsp").forward(request, response);
} catch (Exception e) {
throw new ServletException("doGet failed", e);
}
}
Ctrl+Shift+O로 import구문을 정리하고 저장한다.
===== Develop the View =====
**Project Explorer** view에서 **Test Web**을 오른쪽 클릭하고 **New->JSP**을 선택한다. file name으로 success.jsp을 입력하고 **Finish**를 클릭한다.\\
Jsp editor의 **Source view**로 바꿔서 다음과 같이
태그의 내용을 입력한다.((JSP2.0는 EL 표현식을 사용할 수 있다. 예를 들면 ${resultBean.sourceNumber}는 resultBean object의 sourceNumber값을 참조할 수 있게 해준다. EL 표현식을 사용하면 JSP 스크립틀릿을 사용하지 않아도 되기때문에 코드가 간단해지며 가독성이 높아진다.))
Square root of ${resultBean.sourceNumber} is ${resultBean.resultValue}.
저장하고 file을 닫는다.
failure.jsp라는 다른 JSP파일을 생성해서 위와 같은 방식으로 태그안에 다음내용을 입력한다.
${errorMessage}
저장하고 file을 닫는다.
===== Test the Application =====
Application을 테스트하기에 앞서 WepSphere v6 test server와 project을 연결시켜야 한다. **Test Web** project를 오른
쪽 클릭하고 **Properties**를 선택한 후 **Server** property를 선택한다.
{{study:ejb:serverpref_000.jpg|Server property}}
WebSphere Application Server v6.0를 기본 runtime server로 선택하고 **OK**를 클릭한다.
{{study:ejb:run.jpg|Run}}
**Test Web->Deployment Descriptor : Test Web->Servlets**을 펼쳐서 SquareRootServlet을 오른쪽 클릭한 후 **Run->Run on Server**을 선택한다.
{{study:ejb:run_result.jpg|Run Result}}
error 조건들과 success조건을 Test한다.
===== Conclusion =====
In this tutorial, we learned the following items.
이 강좌에서는 다음의 내용을 다루었다.
- RAD v6에서 J2EE projects를 생성하는 방법
- remote interface를 갖는 Session bean을 생성하는 방법
- J2EE application project를 test server에 배포하는 방법
- Session EJB를 unit test(単体テスト)하는 방법
- EJB를 사용하는 Servlet을 개발하는 방법
- Servlet을 unit test(単体テスト)하는 방법
===== Resources =====
- http://www.webagesolutions.com/knowledgebase/waskb/waskb017/index.html