티스토리 뷰

728x90
반응형

 포스팅은 벤더사 별 WAS를 JEUS로 윈백 시 유의사항에 대해 알아보겠습니다.



1. Weblogic -> JEUS

Weblogic 전환시 유의사항
a. IllegalArgumentException 발생

기존의 시스템인 Weblogic 에서는 session.getAttribute() 시에 null 값 인자에 대하여 무시되고 실행되지만, JEUS에서는 해당 method에 대하여 Argument is null 을 뿌려주며 Exception발생한다.
J2EE spec 상에는 IllegalArgumentException 의 발생이 정상적인 case 이다.
소스상에 getAttribute(null)을 허용하도록 되어있는 경우, null check를 하도록 수정해야 한다.


b. include jsp 에서 ./ 으로 시작할 시에 ../ 를 제대로 파싱하지 못하는 문제
JEUSMain.xml 의 <command-option>에 -Djeus.servlet.request.url.allowDotDot=true 옵션을 추가한다.


c. 코드에 header값 WL-Proxy-Client-IP 를 사용하는 경우
terminal = Util.getDelStringFormat(req.getHeader("WL-Proxy-Client-IP"), null, "terminal");를 다음과 같이 변경해야 함.
terminal = Util.getDelStringFormat(req.getRemoteAddr(), null, "terminal");

 

d. <WebAppComponent><PreferWebInfClass>true 로 설정되어 있는 경우
weblogic.xml의 PreferWebInfClass는 Weblogic 의 Classloader의 순서를 WEB-INF/lib가 먼저 인식하도록 하는 설정이다.
이는 JEUS의 jeus-web-dd.xml에서 <webinf-first>true</webinf-first>로 대체할 수 있다.


e. xml parser가 지정 되어 있는 경우
Weblogic 6.1을 예로 들면 아래와 같이 xml을 다른 파서로 사용하도록 설정이 가능하다.
  

 

또는 startWeblogic.sh 파일에 다음과 같이 지정되어 있을 수도 있다. 

–Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp. DocumentBuilderFactoryImpl
–Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp. SAXParserFactoryImpl


이렇게 파서가 변경된 경우는 JDK에 내장 되어 있는 버전과, Weblogic에 내장되어 있는 버전, 외부에서 다른 버전을 다운받은 버전 중 원하는 버전이 적용되도록 하기 위해서 설정한 경우이다. 이에 맞도록 JEUS에서도 <command-option>에서 적용 가능한 parser를 선택하여 위의 startWeblogic.sh 에 넣은 옵션과 같이 설정해 주어야 한다.


f. URLRewrite 가 true로 설정되어 있는 경우
weblogic.xml 에 다음과 같이 설정되어 있는 경우는 클라이언트에서 쿠키를 저장할 수 없기 때문에 사용한 것이므로 JEUS로 포팅을 하여도 비슷한 상황이 발생하여 세션 ID를 저장하지 못하는 현상이 발생할 수 있다.

 

<session-descriptor>
<session-param>
<param-name>URLRewritingEnabled</param-name>
<param-value>true</param-value>
</session-param>
</session-descriptor> 


이런 경우는 JEUS에서도 동일하게 다음과 같이 설정을 해주어야 한다.
jeus-web-dd.xml에서 <url-rewriting>true</url-rewriting> 로 설정


g. Oracle JDBC Driver의 업그레이드시 주의사항
Oracle JDBC Driver는 JDK별 제공되는 버전이 다음과 같이 다르기 때문에 JDK를 업그레이드 한 경우에는 JDK에 맞는 드라이버로 교체해야 한다
- JDK 1.1: classes111.zip + nls_charset11.zip
- JDK 1.2, JDK 1.3 : classes12.zip + nls_charset12.zip + classes12dms.zip+ ocrs12.zip
- JDK 1.4: ojdbc14.jar + ocrs12.zip

주의사항1: nls_charset12.zip, classes12dms.zip, ocrs12.zip의 경우는 선택적으로 사용할 수 있으나, KO16KSC5601 을 사용할 경우, nls_charset12.zip은 반드시 함께 넣어야 하며, 경우에 따라 orai18n.jar를 함께 설정해야 한다.
주의사항2: classes12.zip를 사용할 때, PreparedStatement의 Scrollable Cursor를 사용할 경우, nls_charset12.zip이 함께 등록되어 있지 않으면, 한글이 16진수 Hex형태로 나타나게 된다.
주의사항3: Oralce JDBC가 JDK 1.4를 지원하는 시점은 Oracle9i 9.2.0.3 JDBC Drivers 부터이며, 기존에 익숙하던 classes12.zip 과는 별도로 ojdbc14.jar 라는 이름으로 별도로 존재한다. 그러나, ojdbc14.jar는 Oracle 10.1.0, 9.2.0, 9.0.1, 8.1.7 까지를 지원하며 8.1.6은 지원하지 않는 것으로 되어 있다.

2. Tomcat -> JEUS

a. JNDI 이슈
Tomcat의 JNDI Resource를 사용하는 Application을 JEUS로 포팅하는 경우의 실 사례를 들어보겠다.
Tomcat의 경우, $CATALINA_HOME/conf/server.xml의 <GlobalNameingResources>, <ResourceLink> 설정과 더불어, web application의 web.xml에 설정된 resource reference 설정을 이용한다.

 

Tomcat

context.xml

<Resource name="jdbc/myoracle" auth="Container"
    type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
    username="scott" password="tiger"
    maxActive="20" maxIdle="10"
    maxWait="-1"/>

web.xml

<resource-ref>
    <description>Oracle Datasource example</description>
    <res-ref-name>jdbc/myoracle</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Client Code

Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

JEUS

JEUSMain.xml

<database>
<vendor>oracle</vendor>
<export-name>jdbc/ myoracle</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>mysid</database-name>
<data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
<port-number>1521</port-number>
<server-name>127.0.0.1</server-name>
<user>scott</user>
<password>tiger</password>

<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>2</min>
<max>5</max>
<step>2</step>
<period>3600000</period>
</pooling>
</connection-pool>
</database>

jeus-web-dd.xml

<res-env-ref>
    <jndi-info>
    <ref-name>jdbc/myoracle</ref-name>
    <export-name> jdbc/myoracle</export-name>
    </jndi-info>
</res-env-ref>

Client Code

Context initContext = new InitialContext();
DataSource ds = (DataSource) initContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

 

이 예에서는, context.xml에 DataSource Resource가 정의되어 있는 경우, 이를 JEUSMain.xml의 DataSource설정으로 대체하였고, web.xml에 등록된 resource reference를 jeus-web-dd.xml파일에 심볼릭 reference mapping 하였다.
Client코드도 수정이 불필요 하나, 좀더 간소화 하였다.

 

b. Parser 이슈
Tomcat의 JNDI Resource를 사용하는 Application을 JEUS로 포팅하는 경우의 실 사례를 들어보겠다.
엔진에서 기본적으로 제공하는 XML 파서들 이외의 것들을 Application에서 사용하는 경우, 이 모듈들을 JVM 기본 모듈보다 먼저 로딩시킬 필요가 있다.
Tomcat5.5에서는 $CATALINA_HOME/common/endorsed 디렉토리를 기본적으로 제공한다.

Tomcat

 $CATALINA_HOME/common/endorsed

[/home/narason/tomcat/common/endorsed]ls -alt
dom.jar
jaxb-api.jar
jaxp-api.jar

JEUS

 endorsed 폴더생성

임의의 위치에 endorsed라는 directory를 생성한다.
예) /home/narason/lib/endorsed

 JEUSMain.xml

<command-option>
    -Djava.endorsed.dirs=/home/narason/lib/endorsed
</command-option>

 /home/narason/lib/endorsed

[/home/narason/lib/endorsed]ls -alt
dom.jar
jaxb-api.jar
jaxp-api.jar

 

이 디렉토리에는 JEUS 런타임이 JDK 환경에 영향을 받지 않게 하기 위해 자바 런타임이 JDK 기본 클래스들 보다 먼저 읽어 들여야 하는 클래스들을 JAR 파일 형태로 묶어서 두게 된다.

3. Websphere

a. 기존 운영환경의 로그 확인을 위한 문제점 해결 > 로그 및 추적 내용 확인 하기
전환 진행 중 혹은 진행간 전환된 Application 이 전환 전 환경과 동일하게 작동하는지 여부 및 기 발생된 Exception 등의 내용을 확인할 때 유용하게 쓰일 수 있다.
해당 화면에서 각 Instance 의 이름을 클릭하면 System.out, System.err 로 기록되는 로그의 위치를 확인 할 수 있다.
문제점 해경 > 로그 및 추적 > 서버명 > JVM 로그 화면이다.

 

 

b. JNDI 호출 방법
지금까지 WebSphere 환경 전환에 대한 내용을 개괄적으로 알아 보았다. 마지막으로Client에서 EJB에 접근 시 JNDI를 통해 lookup하는 경우 다음과 같이 명시된다.

 

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, " com.ibm.websphere.naming.WsnInitialContextFactory");
props.put(Context.PROVIDER_URL, “iiop://hostname:port/”);
InitialContext context = new InitialContext(props); 


이를 다음과 같이 JEUS의 형태로 고쳐야 한다.

 

Properties props = new Properties ();
props.put(Context.INITIAL_CONTEXT_FACTORY, "jeus.jndi.JEUSContextFactory");
props.put(Context.PROVIDER_URL,“hostname:jeus_baseport”);
InitialContext context = new InitialContext(props);


타 벤더 사 WAS를 JEUS로 전환할 때 참고하시기를 바랍니다.

감사합니다.

728x90
반응형