2008/01/25
1.1 JEUS 환경 설명
JEUS5 를 설치하게 되면 Servlet, EJB, JMS, WS(webserver=내장webtob) 엔진이 설치 된다.
8080포트는 내장 WebtoB가 구동이 되면서 JEUS와 자동으로 연동이 되고, 8088포트는 http listener로 servlet엔진에서 구동된 리스너가 동작하게 된다. Jsp/servlet 개발이라면 8088포트만으로도 충분히 개발 및 테스트가 가능하다.
JEUS의 웹관리자 주소는 http://localhost:9744/webadmin (아이디:administrator, 비밀번호: 처음 설치시 입력한 비밀번호) 이다.
1.2 WEB application 추가 방법
WEB application은 context단위(독립적인 web application, 배포 시에는 war파일의 형태를 가지게 됨)로 개발을 하게 된다. 이러한 context는 servlet engine에서 운영되며 다른 context와는 독립적으로 운영되게 된다.
하나의 context는 아래와 같은 디렉토리 구조를 가지게 된다.
root라는 디렉토리 하위로 WEB-INF와 classes, lib라는 디렉토리 구조를 가지고 있다. 이 디렉토리 구조는 J2EE spec에 의한 것이므로 이름이 동일해야만 WAS에서 인식을 할 수 있는 것이다.
root라는 디렉토리를 /insa라는 context-path로 http://localhost:8088/insa/와 같이 mapping을 했다면, 이 경우 /insa가 인사업무 context를 위한 URI로 할당이 되었다. 이 때 /insa를 context path라고 한다.
위 그림에서 WEB-INF 디렉토리에는 web.xml 파일이 존재하게 되는데 이 파일은 context에 대한 전체 설정을 가지게 되는 파일이 된다.
classes디렉토리는 이 context에서 사용하는 class들(servlet 혹은 bean, helper classes들)이 들어가게 되고, lib디렉토리는 context에서 사용하는 library들이 jar나 zip의 형태로 들어가게 된다. src 디렉토리는 일반적으로 개발자들의 소스가 들어가게 되는데 이 디렉토리는 개발을 위한 것이므로 실제 context와는 아무런 상관이 없다.
위와 같이 구성된 디렉토리를 JAVA의 JAR유틸리티를 이용해 묶어서 war로 확장자를 바꾼 것이 배포를 위한 WAR파일이다.
이렇게 개발된 디렉토리나 WAR파일을 JEUS에서 배포하기 위해서는 다음과 같은 과정을 통하게 된다.
1) WEB Application 배포
디렉토리 형태나 war파일로 만들어진 Web application의 배포는 다음과 같이 웹관리자를 통해서 수행할 수 있다.
배포하고자 하는 어플리케이션을 선택한 후 다음을 누르면서 필요한 항목들을 입력하거나 선택한다.
주의해야 할 두 가지 사항은 어느 서버의 어느 Container에 배포할지를 선택하는 것과,
‘영구적인 배치’를 할지를 선택하는 것이다. 영구적인 배치란 서버를 내렸다 올려도 해당WEB Application이 계속 배포된 상태로 있는 것을 말한다. 체크하지 않은 상태로 배치를 누르게 되면 배포는 되나 JEUS를 재기동하게 되면 다시 재배포하여야 한다.
2) JEUS DD 파일의 자동생성
위에서와 같이 web Application을 웹관리자로 배포를 하게 되면 jeus-web-dd.xml (JEUS Web Deployment Descriptor)파일이 아래와 같이 context의 WEB-INF하위에 자동으로 생성되게 된다
<?xml version="1.0" encoding="UTF-8"?>
<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
<context-path>/sample</context-path>
<enable-jsp>true</enable-jsp>
<auto-reload>
<enable-reload>false</enable-reload>
<check-on-demand>false</check-on-demand>
</auto-reload>
<max-instance-pool-size>-1</max-instance-pool-size>
<url-rewriting>false</url-rewriting>
<enable-default-login>false</enable-default-login>
<webinf-first>false</webinf-first>
<jndi-properties>
<local-bindings>false</local-bindings>
</jndi-properties>
</jeus-web-dd>
위의 내용을 보면 지금 deploy하고자 하는 context의 이름은 sample이며 이 context는 URI가 /sample과 같이 호출될 경우(context-path)에 동작을 하게 된다. 만약 이 context-path를 /로 변경하여 http://localhost/ 이렇게 직접 접근하길 원할 경우 <context-path>/<context-path>로 수정하면 된다.
auto-reload는 servlet이나 bean class가 변경이 될 경우 자동으로 reload할 지 여부를 결정하는 부분으로 default는 false이다. check-on-demand는 요청시마다 파일의 변경여부를 체크하는 옵션으로 default는 false이다. 이 두 옵션은 운영시에는 서버의 과중한 부하를 야기시키므로 반드시 개발시에만 사용할 것을 권고한다.
1.3 JDBC의 설정
일반적으로 J2EE에서는 Data Source의 형태로 사용한다. 이는 JNDI에 바인딩 되어 있는 DataSource를 찾아와 그것으로부터 connection을 얻어내는 방법이다.
일반적으로 아래와 같은 예제 코드를 사용하게 된다.
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup(“oracle-data-source”);
Connection con = ds.getConnection();
위와 같은 코드로 connection을 얻어오기 위해서는 먼저 JEUS에 DB에 대한 connection pool이 설정되고 아울러 그 pool을 JNDI에 바인딩 시켜놓아야 한다(위의 코드에서는 oracle-data-source란 이름으로).
먼저 DB를 사용하기 위해서는 JDBC드라이버를 $JEUS_HOME/lib/datasource디렉토리에 넣는다(오라클의 경우 ojdbc14.jar 파일). 다른 디렉토리에 넣어도 상관없지만 datasource와 같이 이름을 준 것은 용도에 맞는 라이브러리를 넣도록 하기 위함이므로 지키는 것이 향후 관리에 편할 수 있다.
데이터 소스의 생성은 위의 그림과 같이 JEUS 매니저리소스->JDBC를 누른 후 ‘새JDBC데이터 소스 생성’을 클릭하면 된다.
각 필드값을 입력하고 생성을 한 후 ‘테스트’가 정상적으로 되면 ‘바인드’를 눌러 JEUS매니저의 JNDI에 등록한다.
JEUS에서 제공하는 4가지 Datasource type의 설명은 아래와 같다.
l DataSource: 사용자들을 위해 Connection을 반환한다.
l ConnectionPoolDataSource: Connection Pool로부터 사용자들을 위해Connection을 반환한다. 가장 일반적으로 많이 사용하는 방식이다.
l XADataSource: XA연결 Pool로부터 사용자들을 위해 분산/전역 Transaction 역할을 하는Connection을 반환한다.
l LocalXADataSource: XA연결 Pool로부터 사용자들을 위해 지역 Transaction 역할을 하는 connection을 반환한다.(일명 지역 XA DataSource). 지역 Transaction은 1개의 database에서만 세션에서만 Transaction을 보장하는 방식이다.
1.4 EJB의 개발
EJB를 개발하기 위해서는 일반적으로 다음과 같은 과정을 수행하게 된다.
l class의 개발
l ejb-jar.xml의 생성
l deploy를 위한 JEUS DD파일의 생성
이러한 일련의 작업들은 최근에는 개발 툴을 이용하여 대부분 작업을 하게 된다.
EJB는 특정폴더의 ejb관련 클래스들과 META-INF/ejb-jar.xml 가 있을 경우 EJB모듈로 인식하게 된다.
이렇게 개발된 디렉토리나 jar파일로 압축한 2가지 모드로 JEUS에서 배포하기 위해서는 다음과 같은 과정을 거치게 된다.
1) jar모드로 배포하기
위의 sample_ejb 디렉토리에서 다음의 절차를 수행한다.
a) jar cvf sample_ejb.jar *
b) jeus-ejb-dd.xml 를 생성하기 위해 JEUS에서 제공하는 [JEUS홈]/bin/jeusbuilder를 실행한다.
c) open module을 선택하여 sample_ejb.jar파일을 선택하면 ejb 모듈의 정보가 불러들여진다. jeus-ejb-dd 의 내용이 자동으로 생성이 되게 되는데 이때 반드시 확인하고 수정해야 되는 부분이 beanlist에 있는 export-name이다.
client에서 ejb를 lookup할 때 바로 이 export-name으로 등록된 이름을 호출하므로 아래 그림에서와 같이 원하는 이름으로 수정한 후 저장한다.
d) 위와 같이 jar파일을 저장하게 되면 jeus-ejb-dd.xml이 META-INF에 추가된다.
e) 이 파일을 JEUS에서 웹모듈배포와 동일한 방식으로 웹관리자 J2EE어플리케이션 모듈배치에서 jar 파일을 선택하여 배포하면 된다.
만약 위의 jeus-ejb-dd.xml을 만들지 않고 배포를 하게 되면 자동으로 만들어지게 되는데, 이때 export-name은 default로 Home Interface의 package명까지 포함된 full name으로 생성이 되게 된다.
2) dir모드로 배포하기
디렉토리 자체를 배포를 하기 위해서는 [디렉토리 선택]을 해서 찾아가면 된다.
이때도 jeus-ejb-dd.xml 이 없으면 자동으로 생성이 되게 된다.
3) fast-deploy
ejb 배포를 하게 되면 ejb 클래스가 있는 곳에 자동으로 stub과 skeleton들이 생성이 된다. DIR모드일 경우는 해당 디렉토리에 생성이 되고, jar모드일 경우는 실제 배포가 된 위치(webhome/container명/ejb모듈명)에 생성이 된다.
ejb모듈 배포시에 ‘영구모듈배포’를 체크하게 되면 해당 application은 JEUSMain.xml에 등록이 되고 매번 JEUS서버를 내렸다 올려도 자동으로 배포가 되게 된다. 그렇다면 매번 JEUS가 부팅할 때마다 ejb모듈이 배포 되면서 stub과 skeleton을 생성하게 되면 모듈이 많을 경우 부팅 시에 시간을 많이 소요하게 될 것이다. 그러므로 운영 시에는 반드시 fast-deploy(빠른 배포)를 체크하는 것이 필요하다.
fast-deploy를 적용한 경우에는 자동으로 stub과 skeleton을 생성해주지 않으므로 다음의 명령어로 수동으로 생성을 해주어야 한다.
appcompiler sample_ejb.jar
4) client에서 호출
client에서 EJB 호출시에는 JNDI를 통해 lookup을 하게 되는데, JNDI 접근시에는 client가 같은 JEUS에 있지 않을 경우 Context에 다음과 같은 properties 세팅이 필요하다. 이는 datasource 접근시에도 동일하다.
Properties props = new Properties ();
props.put(Context.INITIAL_CONTEXT_FACTORY, "jeus.jndi.JEUSContextFactory");
props.put(Context.URL_PKG_PREFIXES, "jeus.jndi.jns.url");
props.put(Context.PROVIDER_URL, “127.0.0.1:9736”);
InitialContext context = new InitialContext(props);
Object objref = context.lookup("ejb.basic.statelessSession");
PROVIDER_URL의 9736은 JEUS의 BasePort 임을 주의한다.
1.6 한글 문제
한글 문제의 해결을 위해 JEUS에서는 browser로부터 전송되는 data에 대해 encoding관련 설정을 할 수 있도록 하는 다음과 같은 설정을 가지고 있다.
Request-encoding: 브라우저로부터 받은 요청에 적용된다. 구체적으로 인코딩은 HTTP 헤더 byte 배열(HTTP URL, 질의문과 쿠키 포함)을 Web Container의 java.lang.String 객체로 변환할 때 적용된다
Postdata-encoding: HTTP요청의 post data에 사용되는 인코딩은 HTTP 헤더 태그들(URL, 질의문, 쿠키 등)에 설정되는 것과 달리 설정된다. 전자의 인코딩은 postdata-encoding 을 통하여 설정되고 후자는 request-encoding을 통하여 설정된다
Response-encoding: browser로 전송하는 data에 대한 encoding
웹관리자 각 container->서블릿엔진->Group을 누른 후 인코딩을 선택하게 되면 아래와 같은 화면이 나오게 된다.
각각 Default와 Forced 가 있는데, Default는 jsp에서 content-type을 설정하지 않았을 경우에 적용되고, Forced에 설정하게 되면 강제적으로 최우선적으로 적용되게 된다. 일반적으로 Default에만 설정하는 것이 바람직하다. 아무런 값을 넣지 않게 되면 ISO-8859-1(영문모드)이고 대부분의 한글사이트에서는 euc-kr로 설정하게 된다.