환경설정 및 운영

본 절에서는 환경설정 파일이 위치하는 디렉터리 구조와 파일, 운영 방법에 대해서 설명한다.

1. 디렉터리 구조

JEUS(WAS)의 디렉터리 구조는 아래와 같다. domains 폴더 하위에 servers 폴더가 있고 application 폴더 내에 OpenFrame GW 바이너리가 위치한다.

$JEUS_HOME/domains
  +---- <domain_name>
     +---- bin
     +---- config
     +---- lib
     +---- servers
          +---- <server_name>
               +---- bin
               +---- logs
               +---- lib
                   +---- application
                       |---- META-INF
                           |---- persistence.xml
                       |---- logback.xml
                       |---- *.jar
                       +---- UninstallerData
                       +---- scripts
                       +---- webterminal
                       +---- ofgwconf
                           |---- ofgw.properties
                           +---- cpm
                           +---- license
                           +---- initScreen
                               |---- initScreen.txt
                           |---- vtam.properties
                           |--- dhcp.properties
servers/<server_name>/lib/application

ofgw-73-<revision>.jar 및 기타 라이브러리가 위치한다. (logback.xml 설정 파일은 해당 폴더에 위치)

폴더 또는 파일 설명

META-INF/persistence.xml

JPA를 사용하기 위해 Entity 및 JPA 관련 옵션들을 정의하는 파일이다. 자세한 설명은 persistence.xml를 참고한다.

logback.xml

로그 파일의 파일 포맷 및 로그 레벨을 정의하는 설정 파일이다. 자세한 설명은 logback.xml를 참고한다.

servers/<server_name>/lib/application/ofgwconf

OpenFrame GW 설정 파일이 위치한다.

폴더 또는 파일 설명

ofgw.properties

OpenFrame GW와 웹 터미널 환경을 정의하는 설정 파일이다. 자세한 설명은 ofgw.properties를 참고한다.

cpm

웹 터미널에서 사용하는 CPM 파일이 위치하는 디렉터리이다.

license

OpenFrame GW 라이선스 파일이 위치하는 디렉터리이다.

initScreen

터미널 접속할 때 초기 화면 출력을 나타내기 위한 initScreen.txt 파일이 저장된다. 해당 파일에 대한 자세한 설명은 initScreen.txt를 참고한다.

vtam.properties

멀티 포트와 그에 따른 init screen을 지정할 수 있도록 지원하는 설정 파일이다. 자세한 설명은 vtam.properties를 참고한다.

dhcp.properties

DHCP 환경에서 Hostname을 이용해 LU 자동 할당 기능을 지원하는 설정 파일이다. 자세한 설명은 dhcp.properties를 참고한다.

WAS에 설정되어 있는 애플리케이션이 디플로이된 폴더의 위치는 다음의 경로에 저장된다.

${JEUS_HOME}/domains/<domain_name>/servers/<server_name>/lib/application/
<application_id>/

각 디렉터리에 대한 자세한 내용은 "JEUS Application & Deployment 안내서"의 "1.1.4. 애플리케이션 관리 디렉터리 구조"를 참고한다.

2. OpenFrame GW 설정 파일

본 절에서는 OpenFrame GW를 사용하기 위해서 필요한 설정 파일의 항목과 설정 예에 대해서 설명한다.

2.1. persistence.xml

persistence.xml에 OpenFrame GW에서 사용하는 JPA Entity 및 옵션을 정의한다.

다음은 속성 파일의 설정 예이다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="ofgw" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>="
        <non-jta-data-source>DATASOURCE_NAME</non-jta-data-source>
        <!-- Don't modify these class names -->
        <class>com.tmax.ofgw.entity.vtam.LuMap</class>
        <class>com.tmax.ofgw.entity.vtam.LuGroup</class>
        <class>com.tmax.ofgw.entity.vtam.ActiveLu</class>
        <class>com.tmax.ofgw.entity.vtam.LuStatus</class>
        <class>com.tmax.ofgw.entity.vtam.Gateway</class>
        <class>com.tmax.ofgw.entity.osc.OscTerminalInfo</class>
        <class>com.tmax.ofgw.entity.osc.OscTran2svc</class>
        <class>com.tmax.ofgw.entity.osc.OscConfig</class>
        <class>com.tmax.ofgw.entity.osc.OscKey2tran</class>
        <class>com.tmax.ofgw.entity.osc.OscNetName</class>
        <class>com.tmax.ofgw.entity.osc.OscSACEE</class>
        <class>com.tmax.ofgw.entity.osc.OscCspg</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

다음은 속성 파일의 항목에 대한 설명이다.

항목 설명

<persistence-unit>

OpenFrame GW 내부에서 JPA를 사용하기 위한 ID이다. 이를 임의로 바꿀 경우 OpenFrame GW가 오동작할 수 있으므로 수정하지 않는다.

<transaction-type="RESOURCE_LOCAL">

OpenFrame GW 내부에서 JPA를 통해 DB에 접근하기 위해 EntityManagerFactory를 직접 정의해서 사용한다는 의미이다. 이를 임의로 바꿀 경우 OpenFrame GW가 오동작할 수 있으므로 수정하지 않는다.

<provider>

JPA의 구현체로 Hibernate를 설정한다. JPA의 구현체는 여러 가지가 있고, 이를 임의로 바꿀 경우 OpenFrame GW가 오동작할 수 있으므로 수정하지 않는다.

<non-jta-data-source>

OpenFrame GW가 배포된 서버에 등록된 데이터소스 중 하나로 설정한다. OpenFrame GW가 연결할 DB를 선택하는 옵션이다.

<class>

OpenFrame GW 내부에서 정의한 Entity 클래스의 경로를 명시한다. 이를 임의로 바꿀 경우 OpenFrame GW가 오동작할 수 있으므로 수정하지 않는다.

<property name="hibernate.dialect">

JPA가 DB에 접근할 때 어떤 DB 문법을 사용할지 설정한다.

Tibero는 Oracle 문법을 따르고 있기 때문에 "org.hibernate.dialect.Oracle10gDialect"로 설정한다. 이를 임의로 바꿀 경우 OpenFrame GW가 오동작할 수 있으므로 수정하지 않는다.

<property name="hibernate.format_sql">

JPA가 SQL을 로깅할 때 임의로 출력하는 것이 아닌 일정 형식을 갖고 출력하도록 설정한다.

<property name="hibernate.use_sql_comments">

JPA가 SQL을 출력할 때 그에 맞는 주석도 함께 출력하도록 설정한다.

<property name="hibernate.show_sql">

JPA가 발행한 SQL을 출력하도록 설정한다.

2.2. logback.xml

logback.xml에 로그 파일의 파일 포맷 및 로그 레벨을 정의한다.

다음은 속성 파일의 설정 예이다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
        <charset>UTF-8</charset>
        <pattern>[%d{yyyy-MM-dd}T%d{HH:mm:ss.SSSSS}][OFGW|%-24logger{0}][%-24t{1}][%.-1level] %msg%n</pattern>
     </encoder>
  </appender>
   <property name="USER_HOME" value="/home/user/logs" />
   <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${USER_HOME}/ofgw-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
          <maxFileSize>300MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <maxHistory>30</maxHistory>
     </rollingPolicy>
     <encoder>
       <pattern>[%d{yyyy-MM-dd}T%d{HH:mm:ss.SSSSS}][OFGW|%-24logger{0}][%-24t{1}][%.-1level] %msg%n</pattern>
     </encoder>
   </appender>
   <logger name="com.tmax.ofgw.region.LUManager" level="DEBUG" />
   <logger name="com.tmax.ofgw.Main" level="INFO" />
   <logger name="com.tmax.ofgw.region.Region" level="ERROR" />
   <logger name="com.tmax.webtnio" level="OFF" />
   <logger name="org.hibernate" level="INFO" />
   <root level="DEBUG">
     <appender-ref ref="STDOUT" />
     <appender-ref ref="ROLLING" />
   </root>
</configuration>

다음은 속성 파일의 항목에 대한 설명이다.

항목 설명

<configuration>

scan, scanperiod 항목을 설정하면 동적으로 로그 레벨을 변경할 수 있다.

<appender>

LogBack에서 제공하는 형태로 로거 형식을 추가할 수 있다(Event 마다 로그를 기록하는 것이 가능하도록 한다).

  • ConsoleAppender : 콘솔로 출력되는 형식을 제공한다.

  • RollingFileAppender : 파일의 최대 용량을 설정하여 인텍스로 로그 파일을 생성한다.

<charset>

로그 파일의 인코딩 형식을 설정한다. ofgw.properties의 rmi.addLength가 yes로 설정된 경우 해당 속성을 SJIS로 설정해야 한다. (기본값: UTF-8)

<property>

property에 설정한 값은 변수처럼 사용이 가능하다. 이 파일에서 USER_HOME은 로그 파일의 경로(Log File Path)로 사용된다.

<fileNamepatten>

로그 파일명의 패턴을 설정한다.

기본값은 날짜 형식과 인덱스("%i")가 추가된다.

<maxFileSize>

파일 하나당 최대 용량을 설정한다.

<maxHistory>

파일의 로그를 남기는 최대 일수를 정한다. 값을 넘어가면 가장 오래된 순으로 자동으로 삭제된다.

<pattern>

출력되는 로그의 형식을 설정한다.

<logger name>

<root>에 설정된 로그 레벨과는 별개로 특정 클래스를 지정하여 로그 레벨을 설정한다.

<root>

로그 레벨을 설정하고 <appender>를 추가하여 해당 로거 형식에 로그 레벨로 출력된다. <logger name>이 기재되어 있지 않은 경우 기본적으로 <root>에 기재된 로그 레벨로 각 클래스의 로그 레벨이 설정되며, <logger name>이 설정된 클래스의 경우 <root>에 기재된 로그 레벨을 덮어 쓴다.

해당 항목은 기본으로 제공하는 항목이며, 운영자가 환경에 맞도록 커스터마이징하여 사용해야 한다. 추가 항목에 대해서는 logback 관련 안내서를 참고한다.

2.3. ofgw.properties

ofgw.properties 속성 파일의 각 항목에 대한 설명은 다음과 같다.

gw.name =gateway_name
lu.port = port_no
lu.autoalloc = {yes|no}
lu.checkStatus = {yes|no}
vtamProperties = {yes|no}
dhcpProperties = {yes|no}
debug.time = {yes|no}
db.threadPool.core = db_threadpool_core
db.threadPool.max = db_threadpool_max
db.threadPool.keepAliveTime = db_threadpool_keepalivetime
coroutine.threadPool.core = coroutine_threadpool_core
coroutine.threadPool.max = coroutine_threadpool_max
coroutine.threadPool.keepAliveTime = coroutine_threadpool_keepalivetime
rmi = {yes|no}
rmi.ip = rmi_deployed_ip_address
rmi.port = rmi_port_no
rmi.serviceName = rmi_service_name
rmi.proc = aim_procedure_name
rmi.smqn = aim_smqn_name
rmi.addLength = {yes|no}
rmi.logMessage = {yes|no}

cpmpath = cpmfile_path
terminal.timeout = terminal_timeout
terminal.aliveCheck = {yes|no}
terminal.aliveInterval = terminal_alive_checktime
sslEnabled = {yes|no}

tmax.retrytime = tmax_retrytime
tmax.node.list = node_name_list
tmax.node.NODE1.name = node_name
tmax.node.NODE1.ip = node_ip_address
tmax.node.NODE1.port = node_port_no
tmax.node.NODE1.min = node_min
tmax.node.NODE1.max = node_max
tmax.node.NODE1.rate = node_rate
tmax.node.NODE1.timeout = node_timeput
tmax.node.NODE1.idletime = node_idletime
항목 설명

gw.name

DB에 들어갈 게이트웨이 이름을 설정한다.

lu.port

3270 터미널이 사용할 포트 번호를 설정한다.

lu.autoalloc

LU 자동할당 기능을 사용할지 여부를 설정한다. RMI 서버를 사용하는 경우 yes로 설정해야 한다. (기본값: yes)

lu.checkStatus

LU Status 체크 기능을 사용할지 여부를 설정한다. (기본값: no)

vtamProperties

VTAM에서 포트별로 접속 가능한 터미널과 Region을 지정하고 각각의 첫 화면을 지정하여 사용할 수 있도록 하는 기능을 사용할지 여부를 설정한다. (yes/no) (기본값: no)

dhcpProperties

DHCP 환경에서 dhcp.properties에 기재된 Hostname에 매핑되는 IP로 LU 자동할당 기능을 사용할지 여부를 설정한다. (yes/no)

(기본값: no)

debug.time

디버그하는 경우 성능체크를 위해 사용할 time 로그를 출력할지 설정한다.

db.threadPool.core

최소 DB Thread 개수를 설정한다.

db.threadPool.max

최대 DB Thread 개수를 설정한다.

db.threadPool.keepAliveTime

최소 DB Thread 개수보다 많은 Thread가 생성되어 있을 때 Idle 상태의 사용되지 않는 DB Thread가 종료되기 위한 시간을 설정한다. (단위: s)

coroutine.threadPool.core

최소 Coroutine Thread 개수를 설정한다.

coroutine.threadPool.max

최대 Coroutine Thread 개수를 설정한다.

coroutine.threadPool.keepAliveTime

최소 Coroutine Thread 개수보다 많은 Thread가 생성되어 있을 때 Idle 상태의 사용되지 않는 Coroutine Thread가 종료되기 위한 시간을 설정한다. (단위: s)

rmi

RMI 서버의 사용 여부를 설정한다. (기본값: no)

rmi.ip

RMI 서버가 위치한 IP Address를 설정한다(OFGW가 Deployed된 IP와 동일하게 작성하면 된다).

rmi.port

RMI 서버가 데이터를 받아들일 포트 번호를 설정한다.

rmi.serviceName

RMI 서버가 데이터를 받아들일 서비스 이름을 설정한다.

rmi.proc

RMI 서버가 WEBAIM과 통신할 때 데이터를 전송할 AIM의 프러시저를 설정한다.

rmi.smqn

RMI 서버가 WEBAIM과 통신할 때 데이터를 전송할 AIM의 SMQN을 설정한다.

rmi.addLength

RMI 서버가 전달받을 데이터 앞에 길이 정보를 추가하여 WEBAIM과 통신할지 설정한다. (기본값: no)

rmi.logMessage

RMI 서버가 전달받은 데이터와 전송할 데이터를 Logging 할 것인지 설정한다. yes로 설정하는 경우 Logger Encoding을 SJIS로 변경해야 한다. (기본값: no)

cpmpath

웹 터미널에서 사용될 CPM 파일의 path를 지정한다.

항목에 값을 설정하지 않으면 default 폴더의 위치를 사용한다.

(기본 경로: $OFGW_HOME/ofgwconf/cpm/)

terminal.timeout

서버와 통신하지 않는 idle 상태인 웹 터미널의 연결을 해제하기 위한 임계 시간을 설정한다. 0으로 설정하면 타임아웃을 사용하지 않는다. (단위: s, 기본값: 0)

terminal.aliveCheck

OpenFrame GW에서 3270 에뮬레이터 및 웹 터미널의 연결 상태 확인을 사용할 때 설정한다. 네트워크 유실 등으로 접속이 끊어진 경우 자동으로 터미널 자원 해제를 진행한다.

  • yes : terminal.aliveInterval에 기재된 초마다 현재 OpenFrame GW와 연결된 터미널들의 접속 상태를 확인한다.

  • no : OpenFrame GW와 연결된 터미널들의 접속 상태를 확인하지 않는다. (기본값)

terminal.aliveInterval

OpenFrame GW와 연결된 터미널들의 접속 상태를 확인하기 위한 시간을 설정한다. (단위: s, 기본값: 10, 최솟값: 10)

sslEnabled

OpenFrame GW에서 3270 에뮬레이터와 통신하는 경우 SSL 설정을 사용할 때 설정한다.

  • yes : 3270 에뮬레이터에서 SSL을 enable로 설정되면 OpenFrame GW에서 yes로 설정하여 통신한다.

  • no : 3270 에뮬레이터에서 SSL disable로 설정되면 OpenFrame GW에서 no로 설정하여 통신한다. (기본값)

tmax.retrytime

Tmax의 커넥션이 끊어졌을 때 다시 연결을 시도하기까지의 대기 시간을 설정한다. (단위: ms)

tmax.node.list

Tmax 노드 이름을 구분자(,)로 설정한다. (예: NODE1,NODE2,NODE3…​)

tmax.node.[NODENAME].name

Tmax 노드 이름을 설정한다.

tmax.node.[NODENAME].ip

Tmax 노드의 IP을 설정한다.

tmax.node.[NODENAME].port

Tmax 노드의 포트 번호($TMAX_HOST_PORT)를 설정한다.

tmax.node.[NODENAME].min

Tmax 커넥션의 최소 개수를 설정한다.

tmax.node.[NODENAME].max

Tmax 커넥션의 최대 개수를 설정한다.

tmax.node.[NODENAME].rate

커넥션이 부족할 때 커넥션 증가시키는 개수를 설정한다.

tmax.node.[NODENAME].timeout

커넥션을 시도할 때 해당 커넥션의 대기 시간을 설정한다. (단위: ms)

tmax.node.[NODENAME].idletime

커넥션의 개수가 min보다 많은 상태에서 사용하지 않아 커넥션을 줄이는데 기준 시간을 설정한다. (단위: s)

  1. Tmax 노드 정보에 대한 자세한 내용은 "Tmax Administration Guide"를 참고한다.

  2. RMI 서버의 동작 방식 및 구조에 대한 자세한 내용은 WEB 통신을 참고한다.

다음은 ofgw.properties 속성 파일의 설정 예이다.

gw.name = ofgw
lu.port = 5556
lu.autoalloc = yes
lu.checkStatus = yes
debug.time = no
db.threadPool.core = 5
db.threadPool.max = 30
db.threadPool.keepAliveTime = 60
coroutine.threadPool.core = 5
coroutine.threadPool.max = 30
coroutine.threadPool.keepAliveTime = 60
rmi = yes
rmi.ip = 192.144.121.11
rmi.port = 5557
rmi.serviceName = ofgwaad
rmi.proc = aadproc
rmi.smqn = aadsmqn

cpmpath =
terminal.timeout = 60
sslEnabled = no

tmax.node.list = NODE1
tmax.node.NODE1.name = NODE1
tmax.node.NODE1.ip = 192.168.37.11
tmax.node.NODE1.port = 6511
tmax.node.NODE1.min = 5
tmax.node.NODE1.max = 10
tmax.node.NODE1.rate = 2
tmax.node.NODE1.timeout = 20000
tmax.node.NODE1.idletime = 90
tmax.retrytime = 60000

2.4. initScreen.txt

initScreen.txt 파일은 편집기를 이용하여 터미널에 초기 접속할 때 출력되는 화면 구성을 저장한다. 파일에 작성된 내용이 터미널 화면에 그대로 출력되고 파일 마지막 출력의 바로 다음란에 입력필드와 커서가 위치한다. 파일에 다음과 같이 설정하면 터미널에 동일한 간격과 공백이 출력된다.

ofgw.properties의 vtamProperties 항목을 yes로 설정하여 VTAM 포트별 접속 가능하도록 설정하는 경우 vtam.properties의 [PORT_NAME].initScreen에 설정된 파일의 화면이 출력된다. vtamProperties 항목을 no로 설정한다면 initScreen.txt의 화면이 출력된다.

@ THIS TERMINAL CONNECTED TO THE OPENFRAME GW



                ******.  *******.  ******.  **.   **.
               ********. *******. ********. **.   **.
               **....**. **...... **....**. **.   **.
               **.   **. **.      **.   ... **.   **.
               **.   **. *******. **.       **.**.**.
               **.   **. *******. **. ****. **.**.**.
               **.   **. **...... **. ****. **.**.**.
               **.   **. **.      **.  .**. ********.
               ********. **.      ********. ***..***.
                ******.. **.       *******. **..  **.
                 ......   ..        .......  ..    ..




@ ENTER COMMAND :

다음은 초기 접속 화면이 출력된 예이다.

figure init
초기 접속 화면 출력 예

2.5. vtam.properties

vtam.properties 속성 파일은 ofgw.properties에서 vtamProperties 설정이 yes일 경우 동작한다.

현재는 OSC와의 연동하는 경우에만 지원하고, OSI와 AIM은 해당 기능을 지원하지 않는다.

vtam.properties 속성 파일의 각 항목에 대한 설명은 다음과 같다.

port.list = port_name
[PORT_NAME].port = port_no
[PORT_NAME].regionList = region_list
[PORT_NAME].initScreen = init_screen_filename
항목 설명

port.list

VTAM에 설정되어 있는 포트를 지정하기 위한 포트 이름을 설정한다.

(예: PORT1,PORT2,PORT3…​)

[PORT_NAME].port

PORT_NAME의 포트 번호를 설정한다. 포트 번호는 VTAM 리소스에 등록되어 있는 포트들을 설정하여 사용해야 한다.

여러 포트 번호 중 한 개는 반드시 ofgw.properties의 lu.port의 값과 일치해야 한다.

[PORT_NAME].regionList

VTAM 포트로 접속한 터미널에서 접속을 허용할 Region 서버 이름을 지정한다. (예: OSC00001, OSC00002…​)

[PORT_NAME].initScreen

해당 포트로 터미널이 접속할 경우 보여줄 첫 화면 파일을 지정한다($OFGW_HOME/ofgwconf/initScreen 폴더 내에 위치한 파일이어야 한다).

다음은 vtam.properties 속성 파일의 설정 예이다.

port.list = PORT1,PORT2,PORT3
PORT1.port = 5556
PORT1.regionList = OSCOIVP1
PORT1.initScreen = initScreen.txt
PORT2.port= 5558
PORT2.regionList = OSCOIVP2
PORT2.initScreen = initScreen2.txt
PORT3.port = 5570
PORT3.regionList = OSCOIVP1,OSCOIVP2
PORT3.initScreen = initScreen3.txt

2.6. dhcp.properties

dhcp.properties 속성 파일은 ofgw.properties에서 dhcpProperties 설정이 yes인 경우에만 동작한다.

dhcp.properties 속성 파일의 각 항목에 대한 설명은 다음과 같다.

hostnames = [HOST_NAME1]:[IP1],[HOST_NAME1]:[IP2],[HOST_NAME2]:[IP3],...,\
            [HOST_NAME5]:[IP10],...
항목 설명

hostnames

DHCP 환경에서 웹 터미널을 통해 입력된 Hostname에 매핑되는 IP 값을 저장한다.

  • [HOST_NAME] : 웹 터미널을 통해 입력될 Hostname을 지정한다.

  • [IP] : Hostname에 매핑될 IP 값을 지정한다.

다음은 dhcp.properties 속성 파일의 설정 예이다.

hostnames=hostname1:192.168.11.23,hostname2:192.168.14.32,hostname2:192.168.14.33,\
hostname1:192.168.11.31,hostname3:192.168.17.87
DHCP LU 할당 기능 사용 방법

DHCP 환경에선 IP가 유동적으로 변하기 때문에 고정된 IP를 사용하여 LU를 할당하려면 다른 방식을 사용해야 한다. 이에 따라 OpenFrame GW에선 웹 터미널의 Query Parameter로 입력되는 Hostname을 사용하여 고정 IP를 추출하고, 이를 사용해 LU를 할당하는 방법을 제공한다.

다음은 dhcpProperties를 yes로 설정한 후 웹 터미널을 사용해 DHCP 환경에서 LU를 할당 받는 방법의 예이다.

figure dhcp lu allocation
DHCP 환경에서 Hostname을 사용한 LU 할당 방법의 예

host를 Key로 하고 LU 할당에 사용할 Hostname을 Base64로 2번 Encoding(hostname1 → aG9zdG5hbWUx → YUc5emRHNWhiV1V4)하여 값으로 설정한 뒤 웹 터미널에 접속한다.

그 후 기존 방식대로 접속을 시도하면 OpenFrame GW에선 dhcpProperties가 yes로 설정되어 있는 것을 확인하고, 입력된 Hostname(hostname1)을 사용해 dhcp.properties에서 IP를 가져온다. 그리고 접속한 웹 터미널의 IP(127.0.0.1)는 무시한 채 가져온 IP(192.168.11.23, 192.168.11.31)를 사용하여 LU 할당을 시도한다.

Hostname을 사용한 LU 할당 방식은 오직 위와 같은 방식으로 웹 터미널로 접속했을 때만 동작하며, RMI나 3270 에뮬레이터로 접속했을 때는 기존의 LU 할당 방식을 사용한다.

3. OpenFrame GW 운영

본 절에서는 OpenFrame GW를 기동하고 종료하는 과정과 로그 포맷을 출력하는 방법에 대해서 설명한다.

3.1. OpenFrame GW 기동 및 종료

본 절에서는 OpenFrame GW를 기동하거나 종료하는 과정에 대해서 설명한다.

기동

JEUS의 DAS 위에 OpenFrame GW를 올렸을 경우 DAS를 기동시킬 때 <lifecyle-invocation> 속성에 의해 OpenFrame GW도 함께 기동된다. DAS를 시작하는 스크립트는 startDomainAdminServer로 DAS의 도메인 이름, JEUS를 시작할 수 있는 권한을 가진 사용자명과 패스워드가 필요하다.

JEUS_HOME/bin 하위에서 실행할 경우에는 이 모든 값이 필요하지만, DAS의 DOMAIN_HOME 하위에서 실행할 때에는 도메인 이름을 생략할 수 있다.

OpenFrame GW 기동은 위치에 따라 다음의 과정으로 진행한다.

  1. startDomainAdminServer로 서버를 기동한다.

    $JEUS_HOME/bin/startDomainAdminServer -domain <domain_name> -u <user_name> -p <password>

    또는

    $JEUS_HOME/domains/<domain_name>/bin/startDomainAdminServer -u <user_name> -p <password>
  2. startManagedServer로 서버를 기동한다.

    $JEUS_HOME/domains/<domain_name>/servers/<server_name>/bin/startManagedServer -server <server_name> -u <user_name> -p <password>

    또는

    $startManagedServer -domain <domain_name> -server <server_name> -u <user_name> -p <password> -dasurl <das_ip:das_baseport>
  3. jps 툴을 이용하여 DomainAdminServerBootstrapper와 ServerBootstrapper가 정상 기동되었는지 확인한다.

    $jps
    23541 Jps
    22797 DomainAdminServerBootstrapper
    22981 ServerBootstrapper
종료

OpenFrame GW를 종료하기 위해서는 OpenFrame GW가 설치된 환경의 서버를 종료해야 한다.

  1. Managed Server를 종료할 경우 stopServer 명령으로 종료한다.

    $JEUS_HOME/bin/stopServer -u <user_name> -p <password> -host <server_ip:server_baseport>
  2. DomainAdminServer를 종료할 경우 마찬가지로 stopServer 명령으로 종료한다.

    $JEUS_HOME/bin/stopServer -u <user_name> -p <password> -host <server_ip:server_baseport>

    JEUS의 기동/종료는 WebAdmin을 사용하거나, jeusadmin 또는 해당 명령어를 사용해서 할 수 있다. 본 매뉴얼에서는 UNIX 환경에서의 기동/종료에 대해서만 기술한다. 다른 방법으로 기동/종료하는 방법에 대한 자세한 사항은 "JEUS Domain 안내서" 또는 "JEUS WebAdmin 안내서"를 참고한다.

기동 및 종료 시 DB 작업 수행

OpenFrame GW는 OFM_BASE_VTAM_GATEWAY, OFM_BASE_VTAM_ACTIVE_LU 테이블에 정보를 업데이트 작업을 수행한다.

기동할 때는 이전의 비정상 종료로 인해 정보가 남아있는지 확인하여 남아있다면 해당 정보를 삭제하고 새롭게 기동되는 OpenFrame GW 정보를 업데이트 작업을 수행한다. 종료하는 경우는 게이트웨이에 연결되어 있던 터미널의 연결이 끊어짐과 동시에 해당 서버에 등록된 OpenFrame GW의 정보를 삭제 및 터미널 정보도 DB에서 삭제된다.

다음은 OpenFrame GW의 정보를 vtamadm 툴로 확인하는 방법이다.

  • 게이트웨이 정보 확인

    다음은 OpenFrame GW의 게이트웨이 정보를 확인하는 명령어 사용법이다.

    $ vtamadm -w
    
    VTAM Gateway List
    
    =================================================================================
    NO.  GATEWAY_NAME   CLID   IP_ADDR:PORT              NODENAME
    ---------------------------------------------------------------------------------
      1  ofgw_A            3   192.168.105.208:5668      NODE1
    =================================================================================
  • 터미널 LU 정보 확인

    OpenFrame GW에 연결되어 있는 터미널 LU 정보를 확인하는 명령어 사용법이다.

    $ vtamadm -l
    
    Active LU information connected to VTAM
    
    ==========================================================================================================
    NO.  LU        TYPE          CLID       NODENAME         IP_ADDR           LOGON_REGION    USERID
    ----------------------------------------------------------------------------------------------------------
      1  OSC00001  OSC REGION               NODE1
      2  OIVPTRM1  IBM-3278-2-E  5          NODE1            192.168.105.208   OSC00001        ROOT
      3  TSO       TSO                      NODE1
    ==========================================================================================================

vtamadm 명령어는 OpenFrame에서 제공하는 툴이다. 해당 툴에 대한 자세한 내용은 OpenFrame Base "툴 참조 안내서"를 참고한다.

Online Region 기동 및 종료

기본적으로 OpenFrame GW는 OpenFrame의 Region 서버의 기동과 종료에 상관없이 기동 상태를 유지한다. OpenFrame GW가 기동 중 Online Region이 기동되면 해당 Region의 정보를 DB에서 가져온다.

종료할 때에도 해당 Online Region에 접속해 있던(LOGON된 LU) 터미널의 연결을 끊고 DB에서도 정보를 삭제한다.

OpenFrame 엔진이 모두 다운된 경우에는 Tmax 커넥션이 없어져서 다음과 같은 로그가 발생된다.

[2022-06-22T14:49:07.00976][OFGW|WebtChannelHandlerImpl  ][Main                    ][I] Close connection for node[NODE1], clid=[246]
[2022-06-22T14:49:07.00982][OFGW|WebTerminal             ][Main                    ][D] WebTerminal disconnect status=transaction_status_none
[2022-06-22T14:49:07.00984][OFGW|WebSocketEndPoint       ][Main                    ][D] handleClose(...)
[2022-06-22T14:49:07.00985][OFGW|WebtChannelHandlerImpl  ][Main                    ][I] System channel[NODE1] (clid=[246])

이때 ofgw.properties 설정 파일에 설정된 tmax.retrytime에 지정된 시간 이후에 다시 커넥션을 시도하여 OpenFrame이 기동 중인지 체크하고 연결을 시도한다.

3.2. 로그 출력 포맷

logback.xml에 기본으로 제공하는 표준 출력은 다음과 같은 포맷으로 출력된다. 각 사이트 환경에 맞추어서 변경해서 사용한다.

[시간] [로그 레벨] [Thread] [로거] [메시지]
항목 설명

[시간]

"시간:분:초.밀리초" 형식으로 출력된다.

[로그 레벨]

지정된 로그 레벨을 출력한다. OpenFrame GW는 'ERROR', 'WARN', 'INFO', 'DEBUG' 4가지 레벨의 로그 출력을 제공한다.

다음은 설정 가능한 로그 레벨이다.

  • ERROR : 각 모듈들이 기대했던 대로 끝나지 않고 비정상적으로 종료되거나 에러가 발생하였을 때 정보 출력을 담당한다.

  • WARN : 각 모듈들이 기대했던 대로 동작하지는 않았지만 이후의 GW의 정상동작에 영향을 끼치지 못하는 경우의 출력을 담당한다.

  • INFO : 각 모듈들의 동작 성공/실패와 관계 없이 해당 작업을 수행했을 때 중요 정보들의 출력과 작업들의 시작과 끝을 알리는 정보들의 출력 등을 담당한다.

  • DEBUG : 각 모듈들의 동작에 대해 INFO 레벨보다 더욱 상세한 정보들의 출력을 담당한다.

로그 레벨은 ERROR < WARN < INFO < DEBUG 순서로 되어있으며, 상위 레벨의 로그는 하위 레벨의 로그 출력을 포함하고 있다. (예: 로그 레벨이 INFO로 설정되어 있다면 로그 레벨 ERROR와 WARN을 포함하여 로그를 출력)

[Thread]

현재 Thread Name이다. logging하는 프로세스(서버 또는 런처(Launcher))와 Thread 번호로 표현된다. 각 항목을 하이픈(-)으로 구분된다.

[로거]

'로거 이름 + {length}'이다. length는 최대 자릿수이다.

[메시지]

로그 메시지 alias이다.

다음은 logback.xml 설정 파일에 로그 출력 패턴을 정의하여 출력한 예이다.

<pattern>[%d{yyyy-MM-dd}T%d{HH:mm:ss.SSSSS}][OFGW|%-24logger{0}][%-24t{1}][%.-1level] %msg%n</pattern>
[2022-06-22T14:49:06.00599][OFGW|WebtChannelHandlerImpl  ][Main                    ][D] Node name=NODE1
[2022-06-22T14:49:06.00599][OFGW|WebtChannelHandlerImpl  ][Main                    ][D] Msg for OFGW
[2022-06-22T14:49:06.00600][OFGW|WebtChannelHandlerImpl  ][Main                    ][D] Tmax msg type: tpsendto
[2022-06-22T14:49:06.00600][OFGW|VtamMessage             ][Main                    ][D] [VtamMessage] vtam header: msgtype(aim(104)) clid(0) gwclid(0) regionclid(0)
[2022-06-22T14:49:06.00600][OFGW|VtamMessage             ][Main                    ][D] [VtamMessage] msgflag : 0, ipaddr :
...
[2022-06-22T14:49:06.00650][OFGW|TranslateWorker         ][Worker-3                ][D] Send to TransWorker channel there is something to work for terminal(id=13)
[2022-06-22T14:49:06.00651][OFGW|TransWorkerChImpl       ][Worker-3                ][D] WorkerThread > TransWorker channel
[2022-06-22T14:49:06.00651][OFGW|TransWorkerChImpl       ][Worker-3                ][D] writeQ for Web count=1
[2022-06-22T14:49:06.00654][OFGW|TransWorkerChImpl       ][Worker-3                ][I] < Send to WebTerminal(id=13,len=2468)
[2022-06-22T14:49:06.00654][OFGW|TransWorkerChImpl       ][Worker-3                ][D] < Send data(id=13):
...
[2022-06-22T14:49:06.00655][OFGW|TranslateWorker         ][Worker-3                ][D] translation(id=13) done, WorkerThread > TransWorkChannel done

4. 멀티 환경 구성

본 절에서는 멀티 환경을 구성하는 방법에 대해서 설명한다.

4.1. OpenFrame GW 멀티 노드

사용자가 부하분산 환경을 구축하기 위해 OpenFrame GW는 다음 그림과 같이 OpenFrame에 멀티 노드로 운영이 가능하다.

figure multinode
OpenFrame GW 멀티 노드 운영

멀티 노드를 구성하는 경우 ofgw.properties 파일에 다음과 같이 설정한다. 해당 파일에 대한 자세한 내용은 ofgw.properties를 참고한다. 단, 하나의 OpenFrame GW로 각기 다른 OpenFrame에 설치된 노드 환경으로의 연결은 지원하지 않는다.

tmax.node.list = NODE1,NODE2
tmax.node.NODE1.name = NODE1
tmax.node.NODE1.ip = 192.168.33.1
tmax.node.NODE1.port = 6300
tmax.node.NODE1.min = 2
tmax.node.NODE1.max = 6
tmax.node.NODE1.rate = 3
tmax.node.NODE1.timeout = 10000
tmax.node.NODE1.idletime = 30000

tmax.node.NODE2.name = NODE2
tmax.node.NODE2.ip = 192.168.33.1
tmax.node.NODE2.port = 6400
tmax.node.NODE2.min = 2
tmax.node.NODE2.max = 6
tmax.node.NODE2.rate = 3
tmax.node.NODE2.timeout = 10000
tmax.node.NODE2.idletime = 30000 … 생략

OpenFrame GW와 Online Region 간 통신은 Tmax를 이용하며 커넥션 스케줄링은 Tmax가 수행하므로 OpenFrame GW는 업무 스케줄링을 담당한다. OpenFrame GW는 DB에 저장되어 있는 Online Region별 매핑 정보를 읽어와서 스케줄링한다.

4.2. OpenFrame GW 멀티 게이트웨이

WAS에 여러 개의 OpenFrame GW를 실행하는 경우 다음 그림과 같이 서버마다 OpenFrame GW를 한 개씩 실행할 수 있다.

figure multigw
OpenFrame GW의 멀티 게이트웨이 예

위와 같은 환경을 구성하기 위해서는 JEUS 서버 설정은 domain.xml(${JEUS_HOME}/domains/<domain_name>/config) 설정 파일에 다음과 같이 기술해야 한다. domain.xml에 각 항목에 대한 자세한 내용은 JEUS 설정 파일을 참고한다. 이후 추가한 JEUS 서버의 각 디렉터리에 OpenFrame GW 바이너리가 lib/application 디렉터리 안에 위치해야 한다.

<servers>
  <server>
     <name>server1</name>
     <lifecycle-invocation>
            <class-name>com.tmax.ofgw.Main</class-name>
            <invocation>
               <invocation-method>
                  <method-name>init</method-name>
               </invocation-method>
               <invocation-type>READY</invocation-type>
            </invocation>
     </lifecycle-invocation>
     <lifecycle-invocation>
            <class-name>com.tmax.ofgw.Main</class-name>
            <invocation>
               <invocation-method>
                  <method-name>shutdown</method-name>
               </invocation-method>
               <invocation-type>BEFORE_UNDEPLOY</invocation-type>
            </invocation>
         </lifecycle-invocation>
  </server>
  <server>
     <name>server2</name>
     <lifecycle-invocation>
            <class-name>com.tmax.ofgw.Main</class-name>
            <invocation>
               <invocation-method>
                  <method-name>init</method-name>
               </invocation-method>
               <invocation-type>READY</invocation-type>
            </invocation>
     </lifecycle-invocation>
     <lifecycle-invocation>
            <class-name>com.tmax.ofgw.Main</class-name>
            <invocation>
               <invocation-method>
                  <method-name>shutdown</method-name>
               </invocation-method>
               <invocation-type>BEFORE_UNDEPLOY</invocation-type>
            </invocation>
         </lifecycle-invocation>
  </server>
...생략
</servers>

서버 추가에 대한 자세한 내용은 "JEUS Server 안내서"의 "2.2. 서버 추가"를 참고한다.