2016년 7월 28일 목요일

[iAS] Oracle9i AS의 주요 모듈 : OC4J

Oracle9iAS는 다양한 모듈들로 구성되어 있다. 그 중에서 J2EE 기반의 다양한 웹 애플리케이션들의 실행과 관리를 담당하는 핵심 모듈이 바로 OC4J(Oracle Containers for J2EE)이다. 본 장에서는 9iAS의 핵심 서버 모듈인 OC4J의 내부 구조와 환경 파일들에 대해서 소개한다.
1. OC4J의 내부 구조
OC4J의 내부 구조는 크게 다음과 같이 구성되어 있다 :
  • OHS와 OC4J를 연결하는 모듈 mod_oc4j
  • 웹 애플리케이션을 실행해 주는 Web container와 EJB 애플리케이션을 실행해 주는 EJB container
  • J2EE 기반의 다양한 시스템 서비스 모듈들


1.1 애플리케이션의 수행 구조
OC4J는 J2SE(Java 2 Platform Standard Edition) 인프라 구조를 지원한다. 따라서, Web Container와 EJB Container는 J2SE VM(Virtual Machine)을 사용한다. Web Container 상에서 일반적인 웹 애플리케이션이, EJB Container 상에서 EJB 기반의 애플리케이션이 실행되어지게 된다.
OC4J 상에서 수행되는 애플리케이션들은 J2SE 상의 표준 구조에 맞추어 개발되어야 한다. 일반적으로 다음과 같이 구성된다 :
  • 사용자 인터페이스 : JSP 혹은 dynamic HTML 형태로 구성된다. 
  • 비즈니스 로직 : 일반적인 Java Beans로 개발되거나 EJB 형태로 개발된다. EJB는 J2EE가 제공하는 다양한 시스템 서비스(JNDI, JDBC, JTA, JCA, JAAS, JavaMail등)를 활용한다.
EJB로 개발된 애플리케이션은 OC4J 내에서 애플리케이션들 사이의 상호 호출을 통해서 호출될 수도 있고 외부 클라이언트에서 직접 호출될 수도 있다. 외부에서 직접 호출되는 경우에는 ORMI(Oracle Remote Method Invocation) 프로토콜을 통해서 실행이 이루어지게 된다. 이 때 사용되어지는 RMI 포트 번호는 rmi.xml 안에 지정하여 주도록 되어 있다. OC4J가 실행되는 환경 내에서 RMI 포트 번호는 서로 상이해야 한다. 기본 포트 번호는 23791이다.
1.2 OHS와 OC4J의 연결 구조
OC4J는 웹 애플리케이션의 실행에 대한 요청을 OHS(Oracle HTTP Server)를 통해서 받는다. 즉, 사용자가 ‘http://www.host-name.co.kr/app-name/module.jsp’와 같이 쳐 주거나 이에 해당하는 링크를 누르게 되면 이 HTTP 프로토콜 기반의 웹 요청을 OHS가 먼저 받게 된다. OHS는 접수한 요청이 자신이 처리할 수 없는 요청임을 인지하면 해당 애플리케이션의 수행을 다시 OC4J로 전달하게 된다. 그러면 OC4J가 해당 애플리케이션을 찾아서 실행시켜 주고 그 수행 결과만을 다시 OHS에 넘겨 주는 것이다. 이 때, OHS와 OC4J 사이의 요청 및 실행 결과 전달을 위한 모듈이 필요한데 이러한 역할을 담당하는 모듈이 바로 mod_oc4j이다. Mod_oc4j는 OHS와 OC4J 사이에서 AJP(Apache Jserv Protocol)을 활용하여 실행 요청과 실행 결과값들을 전달하고 업무 균형을 유지한다. Mod_oc4j의 내부 프로세스는 다음의 그림과 같다 :
mod_oc4j 는 내부적으로 OC4J로의 요청 전달을 관리하기 위한 공유 메모리 테이블을 가지고 있다. 이 테이블에는 수행이 시작된 OC4J 프로세스 정보가 저장된다. Mod_oc4j가 OC4J로 전달될 요청을 받으면 이 테이블 중에서 적절한 OC4J 프로세스를 선택하여 해당 프로세스에 요청을 할당하게 된다.

OC4J 프로세스는 9iAS 상의 모든 프로세스를 관리를 담당하는 OPMN(Oracle Process Monitoring and Notification) 프로세스에 의하여 시작 및 종료되며, 주기적으로 수행 상태가 모니터링 된다. 만약 OPMN 프로세스가 특정 OC4J 프로세스가 작동하지 않음을 발견하면 해당 OC4J 프로세스에 할당된 모든 웹 요청을 수거하여 다른 OC4J 프로세스로 할당하여 주게 된다. 이를 통해 fail-over 메커니즘이 지원되어진다.
2. OC4J 환경 설정
OC4J는 다음과 같은 종류의 환경 설정 파일들로 구성되어 있다 : 
OC4J는 다음과 같은 3가지 그룹의 환경 설정 파일들을 가지고 있다 :
  • OHS Server 환경 설정 파일(mod_oc4j 관련 파일) : OHS와 OC4J를 연결해 주는 모듈인 mod_oc4j의 수행을 관리하기 위한 설정값들을 가지고 있는 파일이다. 역시 $ORACLE_HOME/j2ee/home/config 디렉토리에 위치한다.
  • OC4J Server 환경 설정 파일들 : OC4J 서버를 관리하기 위한 다양한 설정값들을 가지고 있는 환경 화일들로 구성된다. $ORACLE_HOME/j2ee/home/config 디렉토리에 위치한다.
  • 애플리케이션 환경 설정 파일들 : OC4J 위에서 수행되는 표준적인 J2EE 기반의 애플리케이션들의 수행을 조절하기 위한 다양한 속성값들을 가지고 있는 환경 파일들이다. $ORACLE_HOME/j2ee/home/applications/<app-name> 디렉토리에 위치한다. 또한, OC4J에 특별한 애플리케이션 환경 파일들도 있는데 이들은 $ORACLE_HOME/j2ee/home/application-deployments/<app-name> 디렉토리에 위치한다.
2.1 Mod_oc4j 설정 파일
$ORACLE_HOME/Apache/Apache/conf 디렉토리 밑에 있는 httpd.conf 파일이 바로 OHS의 환경 설정 정보들을 가지고 있는 설정 파일이다. 이 설정 파일 안에 다음과 같은 한 줄이 들어가 있다 :
include “/ias20/Apache/Apache/conf/mod_oc4j.conf”
이 include 절이 바로 mod_oc4j의 환경 정보들을 포함하는 설정 파일을 httpd.conf 파일 안에 포함시키는 문장이다. 이 문장에 표시된 파일인 mod_oc4j.conf 파일이 바로 mod_oc4j 설정 파일이다. Mod_oc4j.conf 파일 안에는 OHS와 OC4J 사이의 연결 관계를 설정하는 문장들이 포함되어 있다. Mod_oc4j.conf의 예제는 다음과 같다
LoadModule oc4j_module modules/ApacheModuleOc4j.dll<IfModule mod_oc4j.c>
     
<Location /oc4j-service>
                SetHandler oc4j-service-handler
                ...
     
</Location>
                     ...
    Oc4jMount /j2ee/*
    Oc4jMount /webapp/* OC4J_Demos
    Oc4jMount /myapp/* ajp13://my-pc:8888

              Oc4jMountCopy On
       Oc4jCacheSize 1
       ... 
</IfModule>
2.2 OC4J Server 설정 파일
$ORACLE_HOME/j2ee/home/config 디렉토리 밑에는 다음과 같은 서버 설정 파일들이 존재한다 :
  • server.xml
  • default-web-site.xml
  • rmi.xml
  • jms.xml
  • principals.xml
  • data-sources.xml
server.xml : OC4J 서버의 실행을 주관
OC4J는 서버의 실행을 위한 설정값들을 확인하기 위해 server.xml을 참조한다. server.xml에는 <1..N> 개의 애플리케이션이 등록되어 있다. 또한, 각각의 애플리케이션은 <0..N> 개의 웹 모듈과 <0..N> 개의 EJB 모듈로 구성되어 있다.
애플리케이션을 등록할 때는 ①애플리케이션의 이름과 ②애플리케이션 설정 파일의 위치, ③그 외의 속성값들을 준다. 애플리케이션의 설정은 밑의 J2EE 애플리케이션 설정 파일들을 참조하면 된다.
server.xml에는 <0..N> 개의 웹 사이트가 등록되어 있다. 웹 사이트가 하나도 등록 되지 않았다는 것은 OC4J 서버를 순수히 EJB 컨테이너로 사용하겠다는 뜻이다. 각 웹 사이트에는 <1..N> 개의 웹 모듈이 등록되어 있다. 웹 모듈을 등록할 때는 ①(server.xml에 등록 된)애플리케이션의 이름과 ②(애플리케이션에 등록 된)웹 모듈의 이름, ③URL Context, ④그 외의 속성값들을 주어야 한다.
또한, server.xml에는 rmi.xml과 jms.xml 파일의 위치를 나타내는 디렉토리 정보가 등록되어 있다.
Server.xml의 예제는 다음과 같다 :
<application-server
     localhostIsAdmin="true"              application-directory="../applications"              deployment-directory="../application-deployments”     connector-directory="../connectors">    <rmi-config path="./rmi.xml" />     <jms-config path="./jms.xml" />      <log><file path="../log/server.log" /></log>      <global-application name="default" path="application.xml" />     <global-web-app-config      path="global-web-application.xml" />      <web-site path="./default-web-site.xml" />     <application name="app01"     path="../applications/app01.ear" />                         ...
</application-server> 
광역 애플리케이션과 일반 애플리케이션
server.xml에 등록되는 애플리케이션은 서로 hierarchical 관계에 있다. OC4J의 최상위 애플리케이션은 광역 애플리케이션(Global application)이라 하여 <global-application ... > 태그를 써서 등록한다. 그 아래의 일반 애플리케이션은 <application ... >태그를 써서 등록한다.
    <global-application name="default" path="application.xml" />
    <application name="foo" path="foo-application.xml" />
    <application name="bar" path="../applications/bar" />
모든 일반 애플리케이션들의 기본적인 부모는 광역 애플리케이션이다. 부모 애플리케이션을 지정하려면 parent attribute를 사용한다.
<application name="bar" parent="foo" path="../applications/bar" />

하위 애플리케이션은 상위 애플리케이션의 각종 자원[resource]을 상속받는다.(Data Source 및 EJB 클래스) 따라서, 하위 애플리케이션의 웹 모듈(.jsp)에서 상위 애플리케이션의 EJB 모듈을 사용 할 수 있다.
기본 웹 모듈과 일반 웹 모듈
광역 애플리케이션과 일반 애플리케이션이 계층적(hierarchical)인 관계라면, 기본 웹 모듈(default web module)과 일반 웹 모듈(web module)의 관계는 평행 관계이다. 다만 기본 웹 모듈의 브라우저 주소는 '/~' 이고 일반 웹 모듈의 브라우저 주소는 '/appserver/~'와 같이 URL context를 가진다는 차이가 있다. 이러한 웹 모듈들은 server.xml 상에 다음과 같이 등록한다.
<default-web-app appslication="default" name="defaultWebApp" />
<web-app application="misc" name="m-web" root="/misc" />
<web-site port="3000" protocol="ajp13"
display-name="Default Oracle9iAS Containers \
for J2EE Web Site">

<default-web-app application="default"
name="defaultWebApp" root="/j2ee"/>

<web-app application="default" name="dms"
root="/dmsoc4j"/>
<web-app application="app01" name="app01"
root="/app01"/>
<web-app application="BC4J" name="webapp"
root="/webapp"/>
<access-log
path="../log/default-web-access.log"/>

</web-site>
DataSource 설정
OC4J 상에서 수행되는 애플리케이션들이 데이타베이스와 연결되어 정보를 저장하거나 검색하기 위해서는 해당 데이타베이스가 data-sources.xml 파일에 등록되어 있어야 한다. Data-sources.xml 파일의 예는 다음과 같다 :
<data-sources> 
            
<data-source class="com.evermind.sql.DriverManagerDataSource"                                         name="OracleDefaultDS" 
                                       location="
jdbc/OracleDefaultDS"
<!--JNDI로 데이타베이스 커넥션을 얻을 때 사용하는 이름 -->
                                       xa-location="jdbc/xa/OracleDefaultDS"
<!--JNDI로 데이타베이스 커넥션을 얻을 때 사용하는 이름, 이때 커넥션은 XA를 지원 -->
                                       ejb-location="jdbc/ejb/OracleDefaultDS"
<!--JNDI로 데이타베이스 커넥션을 얻을 때 사용하는 이름, 이때 커넥션은 XA를 지원하면서 커넥션 풀에서 가져오는 커넥션 -->
                                      pooled-location="jdbc/pooled/OracleDefaultDS"
<!--JNDI로 데이타베이스 커넥션을 얻을 때 사용하는 이름, 이때 커넥션은 커넥션 풀에서 가져오는 커넥션 -->

                                        connection-driver="oracle.jdbc.driver.OracleDriver"
                                        username="scott"
                                        password="tiger"
                                        url="jdbc:oracle:thin:@svr1.customer1.co.kr:1521:ORA817"
                                        inactivity-timeout="30"

                        />
</data-sources>
위의 예에서는 svr1.customer1.co.kr에 설치된 Oracle8.1.7 데이타베이스를 1521 포트를 통해 JDBC Thin 드라이버 방식으로 하여 scott/tiger 사용자 ID와 패스워드를 사용하여 접속함을 의미한다.
2.3 애플리케이션 설정 파일들
$ORACLE_HOME/j2ee/home/application-deployments 디렉토리가 바로 J2EE 기반의 표준 웹 애플리케이션이 설치되는 루트 디렉토리이다. 표준적인 J2EE 애플리케이션들의 환경 설정값을 포함하는 설정 파일들은 다음과 같다 :
  • application.xml : 전체 J2EE 애플리케이션의 환경 설정 파일
  • web.xml : 웹 모듈 환경 설정 파일
  • ejb_jar.xml : EJB 모듈 환경 설정 파일
    또한, 애플리케이션들을 위한 OC4J 만을 위한 환경 설정 파일들은 다음과 같다 :
  • orion-application.xml
  • orion-web.xml
  • orion-ejb_jar.xml
OC4J 상에서 실행되는 J2EE 애플리케이션들의 내부 설정을 정의하는 설정 파일들의 배치 구조는 다음과 같다 :
[애플리케이션 루트]/META-INF/application.xml
[애플리케이션 루트]/META-INF/orion-application.xml

[애플리케이션 루트]/[웹 모듈]/WEB-INF/web.xml
[애플리케이션 루트]/[웹 모듈]/WEB-INF/orion-web.xml
[애플리케이션 루트]/[웹 모듈]/WEB-INF/classes/[서블릿 클래스들]
[애플리케이션 루트]/[웹 모듈]/WEB-INF/classes/[일반 자바 빈 클래스들]
[애플리케이션 루트]/[웹 모듈]/WEB-INF/lib/[JAR 파일들]

[애플리케이션 루트]/[EJB 모듈]/META-INF/ejb-jar.xml
[애플리케이션 루트]/[EJB 모듈]/[EJB 클래스들]

댓글 없음:

댓글 쓰기