개발 서버 설치 및 제거

본 장에서는 ProObject 개발 서버(DevOps) 모듈을 설치하고 제거하는 방법에 대해서 설명한다.

본 안내서에서 설명하는 내용은 Ubuntu 환경에서 작성되었으며, CentOS의 경우 기반 프로그램들의 설치 명령어가 다를 수 있으므로 주의한다.

1. 설치 개요

ProObject의 개발 서버(DevOps)는 개발 전반적인 과정을 통합적으로 지원하고, 관리하는 서버로 ProObject 사상에 맞게 서비스 아키텍처로 설계되었다. 개발 서버에서 제공하는 모든 서비스는 연관된 모듈끼리 서비스 그룹으로 묶여 ProObject 엔진 위에서 수행되도록 구현되었다. 따라서 개발 서버는 ProObject 애플리케이션(ProObject Runtime War)이 배포된 JEUS의 MS(Managed Server) 컨테이너에 설치된다.

개발 서버는 ProObject Studio(이하 ProStudio)에서 개발한 리소스에 대하여 형상관리, 빌드, 테스트, 배포 기능을 제공한다. 또한, ProObject 리소스의 개발 환경을 제어 및 관리하는 ProObject Manager(이하 ProManager), ProObject ManagerOps(이하 ProManagerOps)의 백엔드 서비스 또한 개발 서버에 속한다.

DevOps 개발 환경은 클라이언트 툴인 ProStudio와 매니저를 지원하는 서비스들과 ProObject 런타임 서버에 배포하는 서비스를 제공하는 모듈과, ProObject 리소스로 개발되었으며, 비슷한 서비스들로 구성된 여러 서비스 그룹으로 구성되어 있다.

ProObject 개발 서버는 형상관리와 빌드할 때 제품에서 제공하는 기능을 이용하는 형태의 환경구성 외에 Git/Jenklins를 이용하는 환경구성이 가능하다.

본 장에서는 형상관리와 빌드하는 경우 제품에서 제공하는 기능 이용하는 형태의 환경 구성에 대한 설치만을 기술한다. GIT과 Jenkins 환경에 대한 설치는 별도의 TmaxSoft 제품설치 지원 담당자에게 문의하도록 한다.

ProObject를 사용하기 위해 필요한 기반 제품들의 전반적인 설치 과정과 ProObject 서버 설치 그리고 연동 가이드를 제공한다. 각 계정에 JEUS를 우선 설치한 후 ProObject 서버별 설치 과정을 설명한다.

figure 1
설치 구성도

DevOps 모듈은 ProObject의 시스템 프로그램으로 수행된다. 이를 위해 DevOps 바이너리는 ${PROOBJECT_HOME}/system/devops에 위치한다.

전반적인 설치 순서는 다음과 같다.

  1. JEUS, DB, 런타임 서버를 설치한다.

    JESUS와 PO 런타임 war가 배포된 서버에 개발 서버를 구성하는 바이너리를 배포한다. JEUS, DB, 런타임 서버를 설치했다고 가정하고 설명한다. 런타임 서버 설치에 대한 자세한 내용은 런타임 엔진 설치 및 제거를 참고한다.

  2. 설치전 준비사항을 확인한다.

  3. Dev/Ops 서버를 설치한다. 서버 설치에 대한 자세한 내용은 설치를 참고한다.

  4. Dev/Ops 서버의 정상적인 설치 여부를 확인한다. 설치 확인에 대한 자세한 내용은 설치확인을 참고한다.

2. 설치 전 준비사항

본 절에서는 Dev/Ops 서버를 설치하기 전에 확인이 필요한 사항에 대해서 설명한다.

2.1. 디렉터리 구조

DevOps 모듈은 ProObject의 시스템 프로그램으로 ProObject를 기반으로 개발되었으나 일반 사용자의 애플리케이션과 다른 디렉터리에 배포된다.

다음은 system 디렉터리 구조에 대한 설명이다.

{PROOBJECT_HOME}
  |--application
  |--config
  |--bin
  |--logs
  |--(resource)
  |--system
       |--patch
       |--config
       |--devops
            |--aj
            |--binary
            |--jenkins
                 |--devclient
                 |--script
                       |--3rdPartyLib
                 |--lib
                 |--event
                 |--metaSample
(resource)

Jenkins에서 빌드가 이루어지면서 프로그램에서 자동 생성한다.

system
  • system/patch

    런타임 엔진의 클래스 패치시에 해당 클래스가 위치하는 디렉터리이다.

  • system/config

    런타임 엔진에서 보는 DevOps의 application.xml, 서비스 그룹별 properties 파일이 위치한다.

  • system/devops

    다음은 하위 폴더에 대한 설명이다.

    파일 설명

    aj

    빌드할 때 참조하는 aj 파일(memory calculator 등)이 위치한다.

    binary

    DevOps 프로그램(서비스 그룹 jar, dto jar)이 위치한다.

    서비스 그룹은 SO, BO, DOF로 묶은 {servicegroup-name}.jar와 DO, JSON 메시지로 묶은 {servicegroup-name}-dto.jar로 구성된다. 해당 바이너리들이 위치하는 디렉터리는 ${PROOBJECT_HOME}/system/devops/binary이다.

    DevOps 모듈을 구성하는 서비스 그룹은 다음과 같다.

    • proobject-devserver : ProStudio에서 호출하는 서비스(메타 검색, app/sg 조회 등), Jenkins 빌드 후 실행되는 배포 요청 서비스 등을 담당한다.

    • proobject-manager : 개발계 ProManager에서 호출하는 서비스를 담당한다.

    • proobject-managerops : 운영계 ProManager에서 호출하는 서비스를 담당한다.

    • proobject-deployserver : 사용자 애플리케이션을 테스트 노드로 배포하는 서비스를 담당한다. (추후 master로 통합 예정)

    • proobject-master : 노드관리, 사용자 애플리케이션을 운영 노드로 배포하는 서비스를 담당한다.

    • proobject-devclient : Jenkins에서 구성한 빌드 프로세스 중 스크립트를 이용해 ProObject 서비스를 호출할 때 사용하는 클라이언트 모듈이다. 다른 서비스 그룹과 다르게 dto는 없으며, ${PROOBJECT_HOME}/system/devops/devclient에 위치한다.

    jenkins

    Jenkins 빌드할 때 스크립트를 실행하는 프로그램 및 빌드할 때 참조하는 라이브러리 위치한다.

    • devclient : Jenkins 빌드 중 ProObject 서비스 호출할 때 사용되는 클라이언트 모듈 위치

    • script/3rdPartyLib : Jenkins 빌드 중 사용하는 라이브러리 위치

    • lib : DevOps 서비스 그룹이 참조하는 라이브러리들 위치

    • event : DevOps에서 사용하는 이벤트 관련 바이너리

    • metaSample : ProManager에서 사용하는 메타 샘플 파일이 위치

2.2. DB 계정 생성 및 JDBC 드라이버 설정

개발서버(DevOps) 환경구성을 위해 우선적으로 제품에서 사용하는 Repository DB를 구성한다.

다음은 Dev 계정과 Ops 계정에서 사용할 DB 계정을 2개를 생성하는 과정에 대한 설명이다.

생성 과정은 DB가 설치되어 있다는 전제하에 진행한다. 설치과정에 실행하는 DB 스크립트는 신규 설치를 위한 Full DB 스크립트이다.

  1. DEV DB 계정에 접속하여 DB_Script/개발 폴더 안에 있는 Create_PO7_Table.sql, Initialize_PO7_Table.sql 실행한다.

  2. OPS DB 계정에 접속하여 DB_Script/운영 폴더 안에 있는 Create_PO7_Table-operation.sql, Initialize_PO7_Table-operation.sql, Create_PO7_Table-runtime.sql 실행한다.

  3. JEUS 서버의 데이터소스 구성을 위해 사용하는 DB의 JDBC 드라이버를 각 환경에 맞게 넣어준다.

    ${JEUS_HOME}/lib/datasource

2.3. 설정 파일 확인

설치에 필요한 설정 파일의 설정 값을 확인한다.

  • application.xml

    PO 런타임이 DevOps 모듈을 애플리케이션으로 인식하기 위해 필요한 application.xml 설정 파일은 ${PROOBJECT_HOME}/system/config에 위치한다.

  • 사용자 설정이 필요한 환경파일

    사용자 설정 파일은 ${PROOBJECT_HOME}/config에 위치한다.

    • dbio_config.xml

      ProStudio에서 데이터 오브젝트 팩토리(DataObjectFactory)를 구현할 때 후에 운영노드에서 쿼리를 수행하는 경우 접속할 데이터베이스 정보를 얻어 입력하는데 사용한다.

    • PoDevSvr.xml

      ProObject DEV에서 관리하는 DB와 서비스 수행하면서 필요한 값을 설정한다.

      DB Setting:
      
      DB_TYPE=db_type
      DB_USER_ID=db_user_id
      DB_PASSWD=db_passwd
      DATA_SOURCE=datasource_name
      DB_PLUG_NAME=db_plug_name
      항목 설명

      DB_TYPE

      DB 종류를 설정한다. (예: TIBERO, ORACLE)

      DB_USER_ID

      DB에 접속할 수 있는 사용자 계정 ID를 설정한다.

      DB_PASSWD

      'DB_USER_ID'에 입력한 사용자 계정 ID에 접속할 수 있는 비밀번호를 설정한다.

      DATA_SOURCE

      JEUS에 등록한 데이터소스 이름을 설정한다.

      DB_PLUG_NAME

      현재 기본값은 com.tmax.proobject.commonbo.util.db.DataSourcePlug이다.

    • PoOpsSvr.xml

      ProObject Master(Ops)에서 서비스 수행하면서 필요한 값을 설정한다. DB Setting에 해당 항목에 대한 설명은 PoDevSvr.xml를 참고한다.

      DB_TYPE=db_type
      DB_USER_ID=db_user_id
      DB_PASSWD=db_passwd
      DATA_SOURCE=datasource_name
      DB_PLUG_NAME=db_plug_name
      
      DEPLOY_BASE_HOME=deploy_base_home
      PO_CONFIG_PATH=po_config_path
      항목 설명

      DEPLOY_BASE_HOME

      deploy된 바이너리들이 저장되는 파일 디렉터리 장소를 설정한다.

      PO_CONFIG_PATH

      Default Config(PoOpsSvr.xml) 경로를 설정한다.

    • ProbuilderConfig.xml

      ProStudio에서 DTO를 생성하는 경우 필드 타입 관련 설정을 한다.

    • SiteConfig.xml

      ProStudio의 각종 옵션을 설정한다.

  • ProManager 설정

    • 서버 설정

      아래 파일은 ${PROOBJECT_HOME}/config에 위치한다.

      파일 설명

      ProManager.properties

      개발계 ProManager에서 사용하는 데이터소스 이름을 설정한다.

      ProManagerOps.properties

      운영계 ProManager에서 사용하는 데이터소스 이름을 설정한다.

    • 웹 애플리케이션 설정

      파일 설명

      proobject-manager.war

      하위 setting.js 파일에 개발계 PO 서버의 ip, http port를 설정한다.

      proobject-managerops.war

      하위 setting.js 파일에 운영계 PO 서버의 ip, http port를 설정한다.

2.4. 라이브러리 확인

DevOps 환경을 구성하는데 필요한 라이브러리 목록이다. .

  • 서비스 그룹이 참조하는 라이브러리

    다음은 ${PROOBJECT_HOME}/system/devops/lib에 위치하는 DevOps를 구성하는 서비스 그룹들이 참조하는 라이브러리 목록이다.

    commons-dbutils-1.5.jar
    commons-io-2.4.jar
    commons-lang-2.6.jar
    freemarker-2.3.20.jar
    guava-17.0.jar
    javapoet-1.7.0.jar
    jsr173_api-1.0.jar
    light-prominer-0.0.1-SNAPSHOT.jar
    org.aspectj.ajde_1.8.9.201604061446.jar
    org.eclipse.core.commands-3.6.0.jar
    org.eclipse.core.contenttype-3.4.100.jar
    org.eclipse.core.expressions-3.4.300.jar
    org.eclipse.core.filesystem-1.3.100.jar
    org.eclipse.core.jobs-3.5.100.jar
    org.eclipse.core.resources_3.10.1.v20150725-1910.jar
    org.eclipse.core.runtime-3.7.0.jar
    org.eclipse.equinox.app-1.3.100.jar
    org.eclipse.equinox.common-3.6.0.jar
    org.eclipse.equinox.preferences-3.4.1.jar
    org.eclipse.equinox.registry-3.5.101.jar
    org.eclipse.jdt.core-3.10.0.jar
    org.eclipse.osgi-3.7.1.jar
    org.eclipse.text-3.5.101.jar
    org.eclipse.xtext.xbase.lib-2.10.0.jar
    proobject-client-7.0.0.0.jar
    proobject-compiler.jar
    proobject-devutil-7.0.0.0.jar
    proobject-opsutil-7.0.0.0.jar
    proobject-prominer-7.0.0.0.jar
    proobject-prominer-dto-7.0.0.0.jar
    proobject-prominer-service-7.0.0.0.jar
    proobject-srcgen-7.0.0.0.jar
    proobject-srcgen-dto-7.0.0.0.jar
    stax2-api-3.1.4.jar
    woodstox-core-asl-4.4.1.jar
    poi-3.15.jar
  • Git/Jenkins를 이용하는 환경 구성 시 필요한 라이브러리

    다음은 ${PROOBJECT_HOME}/system/devops/jenkins/script/3rdPartyLib에 위치하는 Jenkins를 빌드하는 경우 참조하는 라이브러리 목록이다.

    aspectj-1.8.10.jar
    aspectjrt-1.8.9.jar
    aspectjtools-1.8.9.jar
    aspectjweaver.jar
    org.aspectj.matcher.jar
    proobject-client-7.0.0.0-jar-with-dependencies.jar

3. 설치

본 절에서는 Dev 서버와 Ops 서버의 설치를 하는 과정에 대해서 설명한다.

3.1. Dev 서버

다음의 과정으로 Dev 서버 환경을 구성한다.

  1. ProObject7\개발\proobject7 폴더를 Dev 계정의 홈에 넣고 .bash_profile(.profile)을 다음과 같이 설정한다.

    export PROOBJECT_HOME=/home/{계정명}/proobject7
  2. aspectj1.8 폴더를 Dev 계정의 홈에 넣고 /home/{계정명}/aspectj1.8/bin에 있는 ajc 파일에 755 권한을 부여하고, gradle-4.9 폴더를 Dev 계정의 홈에 넣고 /home/{계정명}/gradle-4.9/bin에 있는 gradle 파일에 755 권한을 부여한다.

  3. 프로파일\개발\.profile을 참고하여 아래와 같이 설정한다.

    export ASPECTJ_HOME=/home/{계정명}/aspectj1.8
    export GRADLE_HOME=/home/{계정명}/gradle-4.9
    export PATH=$ASPECTJ_HOME/bin:$GRADLE_HOME/bin:$PATH
  4. JEUS\{개발}\domain.xml 파일의 설정을 수정한다(굵은 글씨).

    1. domain Id, port 값은 한 장비 내에 다른 계정과 중복으로 사용하여 충돌되지만 않으면 된다.

      <jvm-option> 값은 계정이 다를 경우 사용자 홈 계정에 맞게 설정한다. 해당 리스너 이름은 추후에 proobject.xml의 <http-listener>와 같게 설정해야 한다. Dev 서버는 <datasource>를 사용해야 한다.

      <!-- DevServer -->
      <server>
         <name>DevServer</name>
         <listeners>
            <base>base</base>
            <listener>
                <name>base</name>
                <listen-address>0.0.0.0</listen-address>
                <listen-port>13000</listen-port>
            </listener>
            <listener>
                <name>http-server</name>
                <listen-address>0.0.0.0</listen-address>
                <listen-port>14000</listen-port>
                <keep-alive-timeout>600000</keep-alive-timeout>
            </listener>
         </listeners>
         <jvm-config>
               <jvm-option>-Xmx256m -XX:MaxPermSize=128m</jvm-option>
               <jvm-option>-DPROOBJECT_HOME=/home/po7dev/proobject7</jvm-option>
         </jvm-config>
         <web-engine>
                :
                :
             <web-connections>
                <http-listener>
                    <name>httpdev</name>
                    <server-listener-ref>http-server</server-listener-ref>
                    <thread-pool>
                        <min>10</min>
                        <max>20</max>
                     </thread-pool>
                </http-listener>
             </web-connections>
                :
                :
            <data-sources>
                <data-source>tibero6_dev</data-source>
            </data-sources>
                :
                :
         </web-engine>
    2. 계정명을 다르게 생성하였을 때만 홈 계정 경로에 맞게 수정한다. <target-server>의 <name>은 생성한 서버의 이름이다.

      <!-- Promanager Application Deploy -->
      <deployed-application>
         <id>promanager.war</id>
         <path>/home/po7dev/proobject7/_for_jeus/proobject-manager-war-7.0.0.0.war</path>
         <type>WAR</type>
         <target-server>
         <name>DevServer</name>
         </target-server>
         <classloading>ISOLATED</classloading>
         <use-fast-deploy>false</use-fast-deploy>
         <keep-generated>false</keep-generated>
         <shared>false</shared>
         <node-java-context>false</node-java-context>
      </deployed-application>
      
      <!-- Runtime Application Deploy -->
      <deployed-application>
          <id>proobject-runtime.war</id>
          <path>/home/po7dev/proobject7/_for_jeus/proobject-runtime.war</path>
          <type>WAR</type>
          <target-server>
          <name>DevServer</name>
          </target-server>
          <classloading>ISOLATED</classloading>
          <use-fast-deploy>false</use-fast-deploy>
          <keep-generated>false</keep-generated>
          <shared>false</shared>
          <node-java-context>false</node-java-context>
          </deployed-application>
      </deployed-applications>
    3. <server>에 설정한 <data-source> 값과 같게 설정해야 한다(<data-source-id>, <export-name>). 사용자 환경의 IP, DB port, DB 계정에 맞게 설정한다.

      <data-source>
         <database>
           <data-source-id>tibero6_dev</data-source-id>
           <export-name>tibero6_dev</export-name>
           <data-source-class-name>com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource</data-source-class-name>
           <data-source-type>ConnectionPoolDataSource</data-source-type>
           <vendor>tibero</vendor>
           <server-name>192.168.3.38</server-name>
           <port-number>8629</port-number>
           <database-name>tibero</database-name>
           <user>po7devdb</user>
           <password>po7devdb</password>
           <login-timeout>0</login-timeout>
           <auto-commit>DRIVER</auto-commit>
           <stmt-query-timeout>0</stmt-query-timeout>
           <pool-destroy-timeout>10000</pool-destroy-timeout>
           <property>
              <name>driverType</name>
              <value>thin</value>
              <type>java.lang.String</type>
           </property>
           <support-xa-emulation>false</support-xa-emulation>
           <connection-pool>
             :
             :
      </data-source>
  5. proobject-manager-war-7.0.0.0.war에 ${PROOBJECT_HOME}/_for_jeus에서 setting.js 파일을 아래와 같이 수정한 후 반영한다.

    var poDevSrvInfo = Top.Data.create({
          ip: "192.168.105.111",
          port: "14000",
          App: "/proobject",
          SG: "/proobject-manager",
          Service: ""
    });
    
    var testSrvInfo =  Top.Data.create({
          ip: "192.168.105.111",
          port: "14000",
          App: "/proobject",
          SG: "/proobject-testserver",
          Service: ""
    });
    
    var DEVOPS_version = "DB";

    다음의 설정을 입력하면 ProManager[Resource] 탭이 추가된다. (DB 버전에서 반드시 필요한 옵션)

    var DEVOPS_version = "DB";
    figure 19
    ProManager 메인 화면 메뉴
  6. ${PROOBJECT_HOME}/config에 있는 proobject.xml 파일을 수정한다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE xml>
    <ProObjectConfig>
      <single-application>false</single-application>
      <file-port>4445</file-port>
      <proobject-port>6777</proobject-port>
      <server-name>DevServer</server-name>
      <engine-config>
          <listener-name>httpdev</listener-name>
          <host-name>ns.test.local</host-name>
          <!--container-name>ProObject7</container-name-->
          <proObject-datasource>tibero6_dev</proObject-datasource>
          <initial-context-factory>jeus.jndi.JEUSContextFactory</initial-context-factory>
          <provider-url>192.168.105.111:13000</provider-url>
      </engine-config>
    항목 설명

    <file-port>

    파일 포트 정보를 설정한다. (다른 계정과 충돌하지 않도록 설정해야 함)

    <proobject-port>

    PO 포트 정보를 설정한다. (다른 계정과 충돌하지 않도록 설정해야 함)

    <server-name>

    JEUS의 domain.xml에 설정한 Dev(Ops, RTE) 서버의 서버명을 설정한다.

    <listener-name>

    JEUS의 domain.xml에 설정한 Dev(Ops, RTE) 서버의 http-listener name을 설정한다.

    <host-name>

    사용자 장비의 hostname 정보를 설정한다.

    <proObject-datasource>

    JEUS의 domain.xml에 설정한 데이터소스 정보를 설정한다.

    <provider-url>

    JNDI Lookup하는 경우 접속할 서버의 주소를 설정한다. 설정하지 않을 경우 현재 서버를 사용한다.

  7. ${PROOBJECT_HOME}/system/config에 있는 dbio_config.xml 파일을 domain.xml에 있는 <datasource> 부분과 동일하게 설정한다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dbio-config xmlns="http://www.tmax.co.kr/proobject/dbio-config">
       <connection-info>
          <datasources>
             <pairDataSource alias="tibero6_dev">
                <non-XA-datasource jndi_name="tibero6_dev" />
                <XA-datasource jndi_name="tibero6_dev" />
             </pairDataSource>
          </datasources>
          <async-jdbc conn_name="tibero6_dev" dbname="tibero" userid="po7devdb" 
            passwd="po7devdb" ip="192.168.3.38" port="8629" />
    
          <!-- for Studio DO Factory target DB -->
      <studio-jdbc conn_name="tibero6_dev" username="po7devdb" passwd="po7devdb" 
         driver="com.tmax.tibero.jdbc.TbDriver" pool_size=""
         url="jdbc:tibero:thin:@192.168.3.38:8629:tibero" />
        </connection-info>
  8. ${PROOBJECT_HOME}/system/config에 있는 PoDevSvr.xml 파일을 domain.xml에 있는 <datasource> 부분과 동일하게 설정한다.

    <!-- DB Setting -->
    <configField id="DB_TYPE" value="TIBERO" type="String" xmlns=""/>
    <configField id="DB_USER_ID" value="po7devdb" type="String" xmlns=""/>
    <configField id="DB_PASSWD" value="po7devdb" type="String" xmlns=""/>
    <configField id="DATA_SOURCE" value="tibero6_dev" type="String" xmlns=""/>
    <configField id="DB_PLUG_NAME" value="com.tmax.proobject.commonbo.util.db.DataSourcePlug" type="String" xmlns=""/>

    DB Setting 이외 나머지 모두 Dev 서버, 계정명, 경로로 설정한다.

    <!-- Directory Setting -->
    <configField id="BASE_HOME" value="/home/po7dev/proobject7/resources/srcs" type="String" xmlns=""/>
    <configField id="PO_APP_HOME" value="/home/po7dev/proobject7/resources/deploy_service_group" type="String" xmlns=""/>
    <configField id="CLASS_HOME" value="/home/po7dev/proobject7/resources/classes" type="String" xmlns=""/>
    <configField id="METAS_HOME" value="/home/po7dev/proobject7/resources/metas" type="String" xmlns=""/>
    <configField id="TEMP_HOME" value="/home/po7dev/proobject7/resources" type="String" xmlns=""/>
    <configField id="ETC_HOME" value="/home/po7dev/proobject7/resources/etcs" type="String" xmlns=""/>
    <configField id="EXTRA_LIBRARY_DIR" value="/home/po7dev/proobject7/lib/extra" type="String" xmlns=""/>
    <configField id="EXTRA_LIBRARY" value="" type="String" xmlns=""/>
    <configField id="TRANSFER_DOWNLOAD_HOME" value="/home/po7dev/proobject7/resources" type="String" xmlns=""/>
    
    <!-- Config directory setting -->
    <!-- 20180622 path edit -->
    <configField id="PO_CONFIG_PATH" value="/home/po7dev/proobject7/system/config" type="String" xmlns=""/>
    
    <!-- System Setting -->
    <configField id="ETC_HOME" value="/home/po7dev/proobject7/resources/etcs" type="String" xmlns=""/>
    <configField id="EXTRA_LIBRARY_DIR" value="/home/po7dev/proobject7/lib/extra" type="String" xmlns=""/>
    <configField id="EXTRA_LIBRARY" value="" type="String" xmlns=""/>
    <configField id="TRANSFER_DOWNLOAD_HOME" value="/home/po7dev/proobject7/resources" type="String" xmlns=""/>
    
    <!-- Config directory setting -->
    <!-- 20180622 path edit -->
    <configField id="PO_CONFIG_PATH" value="/home/po7dev/proobject7/system/config" type="String" xmlns=""/>
    
    <!-- System Setting -->
    <configField id="JDK_VERSION" value="1.7" type="String" xmlns=""/>
    <configField id="CLASSPATH_HOME"
    value="/home/po7dev/proobject7/resources/classes:
    /home/po7dev/proobject7/application/system/devops/lib/guava-17.0.jar:
    /home/po7dev/proobject7/application/system/devops/lib/proobject-compiler.jar:
    /home/po7dev/proobject7/application/system/devops/lib/javapoet-1.7.0.jar:
    /home/po7dev/proobject7/application/system/devops/lib/org.eclipse.text_3.5.101.jar:
    /home/po7dev/proobject7/application/system/devops/lib/org.eclipse.core.resources_3.10.1.v20150725-1910.jar:
    /home/po7dev/proobject7/application/system/devops/lib/org.aspectj.ajde_1.8.9.201604061446.jar:
    /home/po7dev/proobject7/application/system/devops/lib/commons-dbutils-1.5.jar" type="String" xmlns=""/>
    
    <!-- <configField id="DD_HOME" value="home/po7rel/proobject7/resources/metas/" type="STRING" xmlns=""/> -->
    
    <!-- Service Setting -->
    
    <!-- Common -->
    <configField id="IS_CHK_RESOURCE_ID" value="TRUE" type="String" xmlns=""/>
    <configField id="DELETE_DEPLOYED_RESOURCE" value="TRUE" type="STRING" xmlns=""/>
    
    <!-- ResourcesDelete/ResourcesUpdate service -->
    <configField id="IS_DBIO_DEP" value="TRUE" type="String" xmlns=""/>
    <configField id="IS_DELETE_TEMP_WORK_DIR" value="TRUE" type="String" xmlns=""/>
    <configField id="UNIQUE_PHYSICAL" value="TRUE" type="String" xmlns=""/>
    
    <!-- Source Gen Setting -->
    <configField id="PROMAPPER_SOURCE_GENERATE_ON_SERVER" value="TRUE" type="String" xmlns=""/>
    
    <!-- Build Server -->
    <configField id="BUILD_BASE_HOME" value="/home/po7dev/proobject7/resources/srcs/_build" type="String" xmlns=""/>
    <!-- if BUILD_BASE_HOME does not exist, default directory is ${PROOBJECT_HOME}/resources/srcs/_build .-->
    <configField id="BUILD_CLASS_HOME" value="/home/po7dev/proobject7/resources/classes/_build" type="String" xmlns=""/>
    
    <!-- if BUILD_CLASS_HOME does not exist, default directory is ${PROOBJECT_HOME}resources/classes/_build .-->
    
    <!-- Deploy Server -->
    <configField id="DEPLOY_BASE_HOME" value="/home/po7dev/proobject7/resources/classes/_deploy" type="String" xmlns=""/>
    <!-- if DEPLOY_BASE_HOME does not exist, default directory is ${PROOBJECT_HOME}/resources/classes/_deploy .-->
  9. ${PROOBJECT_HOME}/system/config에 있는 proManager.properties 파일을 domain.xml에 있는 <datasource> 부분과 동일하게 설정한다.

    DataSource=tibero6_dev
  10. .bash_profile(.profile)에 alias 설정한 후 정상 기동 여부를 확인한다.

    다음은 dasboot > devboot 순서대로 기동하도록 설정한 내용이다. (프로파일\개발\.profile 참고).

    alias dasboot='startDomainAdminServer -u jeus -p jeus'
    alias dasdown='stopServer -host 127.0.0.1:9736 -u jeus -p jeus -verbose'
    alias devboot='startManagedServer -domain domain1 -server DevServer -u jeus -p jeus'
    alias devdown='stopServer -host 127.0.0.1:13000 -u jeus -p jeus'

    ${PROOBJECT_HOME}/logs/ProObject.log에 다음과 같이 출력되는지 확인한다.

    [2019.11.27 13:39:16][INFO] ====================== ProObject Booting ======================
    [2019.11.27 13:39:16][INFO]  version  : 7.0.0.1.244
    [2019.11.27 13:39:16][INFO]  Global Deploy Version : 0
    [2019.11.27 13:39:16][INFO]  License : standard
    [2019.11.27 13:39:16][INFO]  Installed Path : /home/po7dev/proobject7/
    [2019.11.27 13:39:16][INFO]  Application Path : /home/po7dev/proobject7/application/
    [2019.11.27 13:39:16][INFO] ===============================================================
    [2019.11.27 13:39:16][INFO] Starting Booting sequence.
    [2019.11.27 13:39:16][INFO] [BootLoader][ChannelManager] Starting initialing.
    [2019.11.27 13:39:16] [INFO] [ChannelManager][NodeJAVA] NodeJAVA is detected. Trying to
     initialize with web-connection "httpdev"
    [2019.11.27 13:39:16] [INFO] [BootLoader][ChannelManager] Initialized successfully.
    [2019.11.27 13:39:16] [INFO] [BootLoader][EventManager] Starting initialing.
    [2019.11.27 13:39:16] [INFO] [BootLoader][EventManager] Initialized successfully.
    [2019.11.27 13:39:16] [INFO] [BootLoader][Application] Starting initialing.
    [2019.11.27 13:39:16] [INFO] SYSTEM_QOS_BOOT_ENABLE : false
    [2019.11.27 13:39:16] [INFO]  -- [APPLICATION : proobject] initializing
    [2019.11.27 13:39:17] [INFO]    -- Initializing ServiceGroup [proobject - system]
    [2019.11.27 13:39:17] [INFO]    -- Initializing ServiceGroup [proobject - monitoring]
    [2019.11.27 13:39:17] [INFO]    -- Initializing ServiceGroup [proobject - proobject-master]
    [2019.11.27 13:39:18] [INFO]    -- Initializing ServiceGroup [proobject - proobject-deployserver]
    [2019.11.27 13:39:18] [INFO]    -- Initializing ServiceGroup [proobject - proobject-manager]
    [2019.11.27 13:39:18] [INFO]    -- Initializing ServiceGroup [proobject - proobject-devserver]
    [2019.11.27 13:39:18] [INFO]    -- Initializing ServiceGroup [proobject - proobject-managerops]
    [2019.11.27 13:39:18] [INFO]    -- Initializing ServiceGroup [proobject - proobject-testserver]
    [2019.11.27 13:39:18] [WARNING] [NodeAddressManager] Config File(remote_servicegroup.xml)
    is missing, remote address manager is disabled.
    [2019.11.27 13:39:18] [INFO] [BootLoader][Application] Initialized successfully.
    [2019.11.27 13:39:18] [INFO]  -- ProObject Port 6777 is bound ...
    [2019.11.27 13:39:18] [INFO]  -- File Port 4445 is bound ...
    [2019.11.27 13:39:18] [INFO] Properties Validation : /home/po7dev/proobject7/config/system.properties
    [2019.11.27 13:39:18] [INFO] Properties File Last Modified Date : 2019/11/27/13:26:00
    [2019.11.27 13:39:18] [INFO]
    | Property                                                     | Value     | Default Value | Deprecated | Changed |
    | SYSTEM_APPLICATION                                           |           |               | false      | -       |
    | SYSTEM_CHARSET                                               | UTF-8     | UTF-8         | false      | -       |
    | SYSTEM_GLOBAL_DEPLOY_VERSION                                 | 0         | 0             | false      | -       |
    | SYSTEM_SERVICENAME_CASE                                      | CAMEL     | CAMEL         | false      | -       |
    | SYSTEM_TIMEOUT                                               | 60000     | 60000         | false      | -       |
    | SYSTEM_WEB_PARAMETER_CHARSET                                 | ISO-8859-1| ISO-8859-1    | false      | -       |
    | SYSTEM_WEB_READ_BUFFER_SIZE                                  | 50000     | 16384         | false      | -       |
    | SYSTEM_WEB_WRITE_BUFFER_SIZE                                 | 50000     | 16384         | false      | -       |
    | SYSTEM_EVENTMANAGER_LOG_FILEHANDLER_REMOVAL_PERIOD           | 60        | 1             | false      | -       |
    | SYSTEM_CHANNELEVENTMANAGER_LOG_FILEHANDLER_REMOVAL_PERIOD    | 60        | 1             | false      | -       |
    | SYSTEM_PROOBJECT_LOG_FILEHANDLER_REMOVAL_PERIOD              | 60        | 1             | false      | -       |
    | SYSTEM_LOG_LEVEL                                             | INFO      | INFO          | false      | -       |
    
    [2019.11.27 13:39:18] [INFO] FAIL MESSAGE
    [2019.11.27 13:39:18] [INFO] SYSTEM_GLOBAL_BUFFER_SIZE : Wrong Property
    [2019.11.27 13:39:18] [INFO] SYSTEM_HOTDEPLOY_VERSION_CONSISTENCY_POLICY : Wrong Property
    [2019.11.27 13:39:18] [INFO] SYSTEM_DATAOBJECT_QUERY_LOGGING_LEVEL : Wrong Property
    [2019.11.27 13:39:18] [INFO] SYSTEM_APPLICATION : Split error on property SYSTEM_APPLICATION
    [2019.11.27 13:39:18] [INFO]
    
    [2019.11.27 13:39:18] [INFO] [ChannelManager] Activating Configured Channels.
    [2019.11.27 13:39:18] [INFO] [ChannelManager] Configured channels are activated.
    [2019.11.27 13:39:18] [INFO] Booting is completed. ProObject is ready.
    [2019.11.27 13:39:18] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    is ready for execution : Method - service, WaitObject - null
    [2019.11.27 13:39:18] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    done for executing :  Method - service
    [2019.11.27 13:39:18] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    is done!
  11. 다음 경로에 접속하여 정상적으로 실행되었는지 확인한다.

    http://192.168.105.111:14000/promanager
    figure 32
    ProManager 메인화면

    팝업과 함께 로그인이 안된다면 dbio_config.xml, setting.js, proManager.properties, PoDevSvr.xml을 확인해서 ProObject의 DB 설정을 확인한다.

domain.xml과 proobject.xml 파일 설정 비교

다음은 각 설정된 domain.xml과 proobject.xml 파일의 예이다. 각 설정된 항목을 비교할 수 있다.

  • <domain.xml>

    <servers>
      <server>
         <name>adminServer</name>
         <!-- node-name>ns.test.local</node-name -->
         <listeners>
             <base>base</base>
             <listener>
                 <name>base</name>
                 <listen-address>0.0.0.0</listen-address>
                 <listen-port>9736</listen-port>
             </listener>
                   :
                   :
           <!-- DevServer -->
             <server>
                <name>DevServer</name>
                <listeners>
                    <base>base</base>
                    <listener>
                        <name>base</name>
                        <listen-address>0.0.0.0</listen-address>
                        <listen-port>13000</listen-port>
                    </listener>
                    <listener>
                        <name>http-server</name>
                        <listen-address>0.0.0.0</listen-address>
                        <listen-port>14000</listen-port>
                        <keep-alive-timeout>600000</keep-alive-timeout>
                    </listener>
                </listeners>
                <jvm-config>
                    <jvm-option>-Xmx256m -XX:MaxPermSize=128m</jvm-option>
                    <jvm-option>-DPROOBJECT_HOME=/home/po7dev/proobject7</jvm-option>
                </jvm-config>
                <web-engine>
                      :
                      :
                <web-connections>
                    <http-listener>
                            <name>httpdev</name>
                            <server-listener-ref>http-server</server-listener-ref>
                            <thread-pool>
                                    <min>10</min>
                                    <max>20</max>
                            </thread-pool>
                    </http-listener>
                </web-connections>
                      :
                      :
                <data-sources>
                   <data-source>tibero6_dev</data-source>
                </data-sources>
                      :
                      :
                <data-source>
                   <database>
                     <data-source-id>tibero6_dev</data-source-id>
                     <export-name>tibero6_dev</export-name>
                     <data-source-class-name>com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource</data-source-class-name>
                     <data-source-type>ConnectionPoolDataSource</data-source-type>
                     <vendor>tibero</vendor>
                     <server-name>192.168.3.38</server-name>
                     <port-number>8629</port-number>
                     <database-name>tibero</database-name>
                     <user>po7devdb</user>
                     <password>po7devdb</password>
                </data-sources>
                     :
                     :
        </server>
    </servers>
  • <proobject.xml>

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE xml>
    <ProObjectConfig>
        <single-application>false</single-application>
        <file-port>4445</file-port>
        <proobject-port>6777</proobject-port>
        <server-name>DevServer</server-name>
        <engine-config>
            <listener-name>httpdev</listener-name>
            <host-name>ns.test.local</host-name>
            <!--container-name>ProObject7</container-name-->
            <proObject-datasource>tibero6_dev</proObject-datasource>
            <initial-context-factory>jeus.jndi.JEUSContextFactory</initial-context-factory>
            <provider-url>192.168.105.111:13000</provider-url>
        </engine-config>

3.2. Ops 서버

다음은 Ops 서버 환경을 구성하는 방법에 대한 설명이다.

  1. ProObject7\운영\proobject7 폴더를 Ops 계정의 홈에 넣어준다.

    '.bash_profile(.profile)'을 다음과 같이 설정한다.

    export PROOBJECT_HOME=/home/계정명/proobject7
  2. JEUS\운영\domain.xml 파일을 설정한다.

    1. 도메인 ID, port 값은 한 장비 내에 다른 계정과 중복으로 사용하며 충돌되지만 않으면 된다. <jvm-option>값은 계정이 다를 경우 사용자 홈 계정에 맞게 설정한다. 해당 리스너 이름은 추후에 proobject.xml의 <http-listener>와 같게 설정해야 한다.

      <!-- OpsServer -->
      <server>
          <name>OpsServer</name>
          <listeners>
             <base>base</base>
             <listener>
                <name>base</name>
                <listen-address>0.0.0.0</listen-address>
                <listen-port>23000</listen-port>
             </listener>
             <listener>
                <name>http-server</name>
                <listen-address>0.0.0.0</listen-address>
                <listen-port>24000</listen-port>
                <keep-alive-timeout>600000</keep-alive-timeout>
             </listener>
          </listeners>
          <jvm-config>
              <jvm-option>-Xmx256m -XX:MaxPermSize=128m</jvm-option>
              <jvm-option>-DPROOBJECT_HOME=/home/po7ops/proobject7</jvm-option>
          </jvm-config>
                    :
                    :
          <web-connections>
             <http-listener>
                <name>httpops</name>
                <server-listener-ref>http-server</server-listener-ref>
                <thread-pool>
                   <min>10</min>
                   <max>20</max>
                </thread-pool>
             </http-listener>
          </web-connections>
                   :
                   :
          <data-sources>
              <data-source>tibero6_ops</data-source>
          </data-sources>
    2. 계정명을 다르게 생성하였을 때만 홈 계정 경로에 맞게 수정한다. <target-server>의 <name>은 생성한 서버의 이름이다.

      <!-- Promanagerops Application Deploy -->
      <deployed-application>
          <id>promanagerops.war</id>
          <path>/home/po7ops/proobject7/_for_jeus/proobject-managerops-war-7.0.0.0.war</path>
          <type>WAR</type>
          <target-server>
              <name>OpsServer</name>
          </target-server>
          <classloading>ISOLATED</classloading>
          <use-fast-deploy>false</use-fast-deploy>
          <keep-generated>false</keep-generated>
          <shared>false</shared>
          <node-java-context>false</node-java-context>
      </deployed-application>
      
      <!-- Runtime Application Deploy -->
      <deployed-application>
         <id>proobject-runtime.war</id>
         <path>/home/po7ops/proobject7/_for_jeus/proobject-runtime.war</path>
         <type>WAR</type>
         <target-server>
            <name>OpsServer</name>
         </target-server>
         <classloading>ISOLATED</classloading>
         <use-fast-deploy>false</use-fast-deploy>
         <keep-generated>false</keep-generated>
         <shared>false</shared>
         <node-java-context>false</node-java-context>
      </deployed-application>
    3. <server>에 설정한 <data-source> 값과 같게 설정해야 한다(<data-source-id>, <export-name>). 사용자 환경의 IP, DB port, DB 계정에 맞게 설정한다.

         :
         :
       <data-source>
           <database>
             <data-source-id>tibero6_ops</data-source-id>
             <export-name>tibero6_ops</export-name>
             <data-source-class-name>com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource</data-source-class-name>
             <data-source-type>ConnectionPoolDataSource</data-source-type>
             <vendor>tibero</vendor>
             <server-name>192.168.3.38</server-name>
             <port-number>8629</port-number>
             <database-name>tibero</database-name>
             <user>po7opsdb</user>
             <password>po7opsdb</password>
       </database>
         :
         :
  3. proobject-managerops-war-7.0.0.0.war에서 ${PROOBJECT_HOME}/_for_jeus에서 setting.js 파일을 다음과 같이 수정한다.

    var poOperSrvInfo = Top.Data.create({
      ip: "192.168.105.111", //운영계 ProManager를 배포한 PO7 서버 ip (MASTER NODE)
      port: "24000", //운영계 ProManager를 배포한 PO7 서버 http port (MASTER NODE)
      App: "/proobject",
      SG: "/proobject-managerops",
      Service: ""
    });
  4. ${PROOBJECT_HOME}/config에 있는 proobject.xml 파일을 수정한다. 포트만 충돌되지 않게 사용하며 나머지는 사용자 환경에 맞게 반드시 변경한다. 각 설정항목에 대한 자세한 내용은 Dev 서버를 참고한다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE xml>
    <ProObjectConfig>
        <single-application>false</single-application>
        <file-port>5445</file-port>
        <proobject-port>7777</proobject-port>
        <server-name>OpsServer</server-name>
        <engine-config>
            <listener-name>httpops</listener-name>
            <host-name>ns.test.local</host-name>
            <!--container-name>ProObject7</container-name-->
            <proObject-datasource>tibero6_ops</proObject-datasource>
            <initial-context-factory>jeus.jndi.JEUSContextFactory</initial-context-factory>
            <provider-url>192.168.105.111:23000</provider-url>
        </engine-config>
         :
         :
  5. ${PROOBJECT_HOME}/system/config에 있는 dbio_config.xml 파일을 domain.xml에 있는 <datasource> 부분과 동일하게 설정한다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <dbio-config xmlns="http://www.tmax.co.kr/proobject/dbio-config">
       <connection-info>
         <datasources>
            <pairDataSource alias="tibero6_ops">
                <non-XA-datasource jndi_name="tibero6_ops" />
                <XA-datasource jndi_name="tibero6_ops" />
            </pairDataSource>
         </datasources>
         <async-jdbc conn_name="tibero6_ops" dbname="tibero" userid="po7opsdb" 
            passwd="po7opsdb" ip="192.168.3.38" port="8629" />
    
       <!-- for Studio DO Factory target DB -->
       <studio-jdbc conn_name="tibero6_ops" username="po7opsdb" passwd="po7opsdb"
                   driver="com.tmax.tibero.jdbc.TbDriver" 
                   pool_size="" url="jdbc:tibero:thin:@192.168.3.38:8629:tibero" />
     </connection-info>
         :
         :
  6. ${PROOBJECT_HOME}/system/config에있는 PoOpsSvr.xml 파일을 domain.xml에 있는 <datasource> 부분과 동일하게 설정한다. DB Setting 이외 나머지 모두 Ops 서버, 계정명, 경로로 설정한다.

    <?xml version="1.0" encoding="EUC-KR" standalone="yes"?>
    <serverConfig xmlns="http://www.tmax.co.kr/proobject/serverConfig">
    
    <!--############################################################################
        # DB Setting                                                               #
        ############################################################################-->
    
        <configField id="DB_TYPE" value="TIBERO" type="String" xmlns=""/>
        <configField id="DB_USER_ID" value="po7opsdb" type="String" xmlns=""/>
        <configField id="DB_PASSWD" value="po7opsdb" type="String" xmlns=""/>
        <configField id="DATA_SOURCE" value="tibero6_ops" type="String" xmlns=""/>
        <configField id="DB_PLUG_NAME"
        value="com.tmax.proobject.master.util.DataSourcePlug"
        type="String" xmlns=""/>
    <!--############################################################################
        #  Deploy Server                                                           #
        ############################################################################-->
    
        <configField id="DEPLOY_BASE_HOME"
         value="/home/po7ops/proobject7/resources/classes/_deploy"
         type="String" xmlns=""/>
        <!-- if DEPLOY_BASE_HOME does not exist, default directory is
        ${PROOBJECT_HOME}/resources/classes/_deploy .-->
    
    <!--############################################################################
        # Config Directory Setting                                                 #
        ############################################################################-->
    
        <configField id="PO_CONFIG_PATH" value="/home/po7ops/proobject7/system/config"
        type="String" xmlns=""/>
        <configField id="CLASSPATH_HOME"
        value="/home/po7ops/proobject7/system/devops/lib/proobject-opsutil-7.0.0.0.jar"
        type="String" xmlns=""/>
    
    </serverConfig>
  7. ${PROOBJECT_HOME}/system/config에 있는 proManagerOps.properties 파일을 domain.xml에 있는 데이터소스 부분과 동일하게 설정한다.

    DataSource=tibero6_ops
  8. .bash_profile(.profile)에 alias 설정을 한 후 기동을 확인한다.

    다음은 dasboot > devboot 순서대로 기동하도록 설정한 내용이다(프로파일\운영\.profile 참고).

    alias dasboot='startDomainAdminServer -u jeus -p jeus'
    alias dasdown='stopServer -host 127.0.0.1:19736 -u jeus -p jeus -verbose'
    alias opsboot='startManagedServer -domain domain1 -server OpsServer -u jeus -p jeus'
    alias opsdown='stopServer -host 127.0.0.1:23000 -u jeus -p jeus'

    ${PROOBJECT_HOME}/logs/ProObject.log에 다음과 같이 출력되는지 확인한다.

    [2019.11.27 14:06:46][INFO] ====================== ProObject Booting ======================
    [2019.11.27 14:06:46][INFO]  version  : 7.0.0.1.244
    [2019.11.27 14:06:46][INFO]  Global Deploy Version : 0
    [2019.11.27 14:06:46][INFO]  License : standard
    [2019.11.27 14:06:46][INFO]  Installed Path : /home/po7ops/proobject7/
    [2019.11.27 14:06:46][INFO]  Application Path : /home/po7ops/proobject7/application/
    [2019.11.27 14:06:46][INFO] ===============================================================
    [2019.11.27 14:06:46][INFO] Starting Booting sequence.
    [2019.11.27 14:06:46][INFO] [BootLoader][ChannelManager] Starting initialing.
    [2019.11.27 14:06:46][INFO] [ChannelManager][NodeJAVA] NodeJAVA is detected. Trying to
    initialize with web-connection "httpops"
    [2019.11.27 14:06:47][INFO] [BootLoader][ChannelManager] Initialized successfully.
    [2019.11.27 14:06:47][INFO] [BootLoader][EventManager] Starting initialing.
    [2019.11.27 14:06:47][INFO] [BootLoader][EventManager] Initialized successfully.
    [2019.11.27 14:06:47][INFO] [BootLoader][Application] Starting initialing.
    [2019.11.27 14:06:47][INFO] SYSTEM_QOS_BOOT_ENABLE : false
    [2019.11.27 14:06:47][INFO]  -- [APPLICATION : proobject] initializing
    [2019.11.27 14:06:48][INFO]    -- Initializing ServiceGroup [proobject - system]
    [2019.11.27 14:06:48][INFO]    -- Initializing ServiceGroup [proobject - monitoring]
    [2019.11.27 14:06:49][INFO]    -- Initializing ServiceGroup [proobject - proobject-master]
    [2019.11.27 14:06:49][INFO]    -- Initializing ServiceGroup [proobject - proobject-managerops]
    [2019.11.27 14:06:49][WARNING] [NodeAddressManager] Config File(remote_servicegroup.xml)
    is missing, remote address manager is disabled.
    [2019.11.27 14:06:49][INFO] [BootLoader][Application] Initialized successfully.
    [2019.11.27 14:06:49][INFO]  -- ProObject Port 7777 is bound ...
    [2019.11.27 14:06:49][INFO]  -- File Port 5445 is bound ...
    [2019.11.27 14:06:49][INFO] Properties Validation : /home/po7ops/proobject7/config/system.properties
    [2019.11.27 14:06:49][INFO] Properties File Last Modified Date : 2019/11/27/14:03:13
    [2019.11.27 14:06:49][INFO]
    | Property                                                  | Value     | Default Value | Deprecated | Changed |
    | SYSTEM_APPLICATION                                        |           |               | false      | -       |
    | SYSTEM_CHARSET                                            | UTF-8     | UTF-8         | false      | -       |
    | SYSTEM_GLOBAL_DEPLOY_VERSION                              | 0         | 0             | false      | -       |
    | SYSTEM_SERVICENAME_CASE                                   | CAMEL     | CAMEL         | false      | -       |
    | SYSTEM_TIMEOUT                                            | 60000     | 60000         | false      | -       |
    | SYSTEM_WEB_PARAMETER_CHARSET                              | ISO-8859-1| ISO-8859-1    | false      | -       |
    | SYSTEM_WEB_READ_BUFFER_SIZE                               | 50000     | 16384         | false      | -       |
    | SYSTEM_WEB_WRITE_BUFFER_SIZE                              | 50000     | 16384         | false      | -       |
    | SYSTEM_EVENTMANAGER_LOG_FILEHANDLER_REMOVAL_PERIOD        | 60        | 1             | false      | -       |
    | SYSTEM_CHANNELEVENTMANAGER_LOG_FILEHANDLER_REMOVAL_PERIOD | 60        | 1             | false      | -       |
    | SYSTEM_PROOBJECT_LOG_FILEHANDLER_REMOVAL_PERIOD           | 60        | 1             | false      | -       |
    | SYSTEM_LOG_LEVEL                                          | INFO      | INFO          | false      | -       |
    
    [2019.11.27 14:06:49] FAIL MESSAGE
    [2019.11.27 14:06:49] SYSTEM_GLOBAL_BUFFER_SIZE : Wrong Property
    [2019.11.27 14:06:49] SYSTEM_HOTDEPLOY_VERSION_CONSISTENCY_POLICY : Wrong Property
    [2019.11.27 14:06:49] SYSTEM_DATAOBJECT_QUERY_LOGGING_LEVEL : Wrong Property
    [2019.11.27 14:06:49] SYSTEM_APPLICATION : Split error on property SYSTEM_APPLICATION
    [2019.11.27 14:06:49]
    
    [2019.11.27 14:06:49] [INFO] [ChannelManager] Activating Configured Channels.
    [2019.11.27 14:06:49] [INFO] [ChannelManager] Configured channels are activated.
    [2019.11.27 14:06:49] [INFO] Booting is completed. ProObject is ready.
    [2019.11.27 14:06:49] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    is ready for execution : Method - service, WaitObject - null
    [2019.11.27 14:06:49] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    done for executing :  Method - service
    [2019.11.27 14:06:49] [INFO] [GUID-ServerReady]<<proobject.system.FileSequencerUpdateService>>
    is done!
  9. 다음 경로에 접속하여 정상적으로 실행되었는지 확인한다.

    http://192.168.105.111:24000/promanagerops
    figure 50
    ProManagerOps 메인화면

    팝업과 함께 로그인이 안된다면 dbio_config.xml, setting.js, proManagerOps.properties, PoOpsSvr.xml을 확인해서 ProObject의 DB 설정을 확인한다.

domain.xml과 proobject.xml 파일 설정 비교

다음은 각 설정된 domain.xml과 proobject.xml 파일의 예이다. 각 설정된 항목을 비교할 수 있다.

  • <domain.xml>

    <servers>
      <server>
        <name>adminServer</name>
        <listeners>
           <base>base</base>
           <listener>
               <name>base</name>
               <listen-address>0.0.0.0</listen-address>
               <listen-port>19736</listen-port>
           </listener>
                 :
                 :
           <!-- OpsServer -->
           <server>
             <name>OpsServer</name>
              <listeners>
                 <base>base</base>
                 <listener>
                    <name>base</name>
                    <listen-address>0.0.0.0</listen-address>
                    <listen-port>23000</listen-port>
                 </listener>
                 <listener>
                    <name>http-server</name>
                    <listen-address>0.0.0.0</listen-address>
                    <listen-port>24000</listen-port>
                    <keep-alive-timeout>600000</keep-alive-timeout>
                 </listener>
              </listeners>
              <jvm-config>
                 <jvm-option>-Xmx256m -XX:MaxPermSize=128m</jvm-option>
                 <jvm-option>-DPROOBJECT_HOME=/home/po7ops/proobject7</jvm-option>
              </jvm-config>
                   :
                   :
              <web-connections>
                <http-listener>
                    <name>httpops</name>
                    <server-listener-ref>http-server</server-listener-ref>
                    <thread-pool>
                            <min>10</min>
                            <max>20</max>
                    </thread-pool>
                </http-listener>
              </web-connections>
                     :
                     :
              <data-sources>
                 <data-source>tibero6_ops</data-source>
              </data-sources>
                     :
                     :
              <data-source>
                 <database>
                   <data-source-id>tibero6_ops</data-source-id>
                   <export-name>tibero6_ops</export-name>
                   <data-source-class-name>com.tmax.tibero.jdbc.ext.TbConnectionPoolDataSource</data-source-class-name>
                   <data-source-type>ConnectionPoolDataSource</data-source-type>
                   <vendor>tibero</vendor>
                   <server-name>192.168.3.38</server-name>
                   <port-number>8629</port-number>
                   <database-name>tibero</database-name>
                   <user>po7opsdb</user>
                   <password>po7opsdb</password>
                </database>
             </data-sources>
                     :
                     :
  • <proobject.xml>

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE xml>
    <ProObjectConfig>
        <single-application>false</single-application>
        <file-port>5445</file-port>
        <proobject-port>7777</proobject-port>
        <server-name>OpsServer</server-name>
        <engine-config>
            <listener-name>httpops</listener-name>
            <host-name>ns.test.local</host-name>
            <!--container-name>ProObject7</container-name-->
            <proObject-datasource>tibero6_ops</proObject-datasource>
            <initial-context-factory>jeus.jndi.JEUSContextFactory</initial-context-factory>
            <provider-url>192.168.105.111:23000</provider-url>
        </engine-config>

4. 설치확인

개발 서버(DevOps)의 설치 확인은 ProManager와 ProStudio를 사용해서 확인한다. ProManager에서 설정한 노드와 ProStudio의 통신 가능여부를 확인하고 프로젝트 생성, 서비 스 등록, 배포 정상동작 여부를 확인하는 과정을 통해서 진행한다.

개발 서버(DevOps)의 설치 확인을 하기 전에 ProStudio가 설치되어 있어야 한다. ProStudio의 설치과정은 ProStudio 설치 및 제거를 참고한다.

개발 서버(DevOps)의 정상적인 설치 여부는 다음의 과정으로 확인한다.

  1. 노드 설정

    ProManager를 실행해서 노드와 서비스 그룹을 생성하고 메타 정보를 설정한다.

  2. 프로젝트 생성

    ProStudio를 실행해서 프로젝트를 생성한다.

  3. DO, SO 생성

    ProStuido에서 테스트할 DO, SO 리소스를 생성하고 커밋한다.

  4. HotDeploy 및 Servcie Test

    ProManager에서 리소스를 HotDeploy하고 Servcie Test를 진행한다.

  5. 런타임 서버에 리소스 배포

    ProManagerOps를 실행해서 Runtime 서버에 리소스를 배포한다.

4.1. 노드 설정

ProManager를 실행해서 노드와 서비스 그룹을 생성하고 메타 정보를 설정한다.

  1. ProManager네비게이션 영역에서 [Node] > [Node Managerment]를 선택해서 사용자가 구성한 환경을 기준으로 노드 설정을 추가한다.

    figure 61
    [ProManager] - Node Managerment 화면
    항목 설명

    Node Type

    다음은 Node Type에 대한 설명이다.

    • Master : Ops 서버 환경

    • Runtime : Runtime 서버 환경

    • Test : Dev 서버 환경

  2. ProManagerOps네비게이션 영역에서 [Node] > [Node Managerment]를 선택해서 사용자가 구성한 런타임 환경을 기준으로 노드 설정을 추가한다.

    figure 63
    [ProManagerOps] - Node Managerment 화면
  3. ProManager네비게이션 영역에서 [Overview] > [APP&SG]를 선택한 후 [Create New Application] 버튼을 클릭해서 애플리케이션과 서버 그룹을 생성한다.

    figure 67
    [ProManager] - Overview 화면

    Create Application 화면에 각 항목을 입력하고 [OK] 버튼을 클릭한다.

    figure 66
    Create Application 화면

    Service Group Registration 화면'Physical Name', 'Logical Name'에 값을 입력하고 [+] 버튼을 클릭한다. 각 항목을 입력하고 [Save] 버튼을 클릭한다.

    figure 68
    Service Group Registration 화면

    서버 그룹을 등록하면 Overview 화면에 서버 그룹의 Count가 증가한다.

    figure 69
    [ProManager] - Overview 화면 - 서버 그룹 추가
  4. ProManager네비게이션 영역에서 [Overview] > [Meta] 메뉴를 선택하면 Meta Dictionary 화면에서 등록된 메타정보를 조회할 수 있다.

    figure 71
    [ProManager] - Meta Dictionary 화면

    Meta Dictionary 화면([ProManager] - Meta Dictionary 화면)에서 [Add] 버튼을 클릭해서 아래와 같은 방법으로 몇 가지 샘플을 만든다.

    figure 70
    [ProManager] - Create Meta Field 화면

4.2. 프로젝트 생성

ProStudio를 실행한 후 다음의 과정으로 프로젝트를 생성한다.

  1. ProStudio의 메뉴에서 [New] > [Project]를 선택한 후 New Project 화면에서 [ProObject] > [ProObject Application Project]를 선택한다. Application Project 정보를 입력하고 [Next] 버튼을 클릭한다.

    figure 73
    ProStudio - 프로젝트 생성 (1)

    사용자가 설정한 Dev 서버(ProManager) 환경의 정보와 계정명을 입력한다.

    figure 74
    ProStudio - 프로젝트 생성 (2)

    ProManager에서 추가한 애플리케이션을 선택한 후 [Next] 버튼을 클릭한다.

    figure 75
    ProStudio - 프로젝트 생성 (3)

    프로젝트명을 입력하고 [Finish] 버튼을 클릭한다.

    figure 76
    ProStudio - 프로젝트 생성 (4)
  2. ProStudio의 메뉴에서 [New] > [Project] 선택한 후 New Project 화면에서 [ProObject] > [ProObject Service Group Project]를 선택한다(Application Project를 생성할 때 사용자 정보를 입력하였기 때문에 넘어가면 된다).

    figure 77
    ProStudio - 서버 그룹 생성 (1)

    ProManager에서 생성한 Service Group을 선택한 후 [Next] 버튼을 클릭한다.

    figure 78
    ProStudio - 서버 그룹 생성 (2)

    프로젝트명을 입력하고 [Finish] 버튼을 클릭한다.

    figure 79
    ProStudio - 서버 그룹 생성 (3)

4.3. DO, SO 생성

ProStuido에서 테스트할 DO, SO 리소스를 생성하고 커밋한다.

DO 리소스 생성

다음의 과정으로 DO 리소스를 생성한다.

  1. ProStuido네비게이터 영역에서 'TestSG1’을 선택한 후 컨텍스트 메뉴에서 [New] > [DataObject]를 선택한다.

  2. New Data Object 화면에서 사용자가 원하는 이름으로 설정한 후 [Finish] 버튼을 클릭한다.

    figure 80
    DO 리소스 생성 (1)
  3. 생성한 DO를 열어 Create Message에 JSON을 체크한다.

    figure 81
    DO 리소스 생성 (2)
  4. 네비게이터의 서비스 그룹에 아래와 같이 .msg 파일이 생기는지 확인한다.

    figure 82
    DO 리소스 생성 (3)

SO 리소스 생성

다음의 과정으로 SO 리소스를 생성한다.

  1. 생성한 서비스 그룹 TestSG1를 선택한 후 컨텍스트 메뉴에서 [New] > [Service Object]를 선택한다.

  2. New Service Object 화면에서사 용자가 원하는 이름을 설정하고 Input DO, Output DO에는 위에서 생성한 DO를 선택한 후 [Finish] 버튼을 클릭한다.

    figure 83
    SO 리소스 생성 (1)
  3. SO를 열어 비구현 메소드 추가한다.

    figure 84
    SO 리소스 생성 (2)
  4. 메시지 생성 여부를 묻는 대화상자에서 [OK] 버튼을 클릭하면 메소드가 생성된다.

    figure 86
    SO 리소스 생성 (3)
  5. 생성된 메서드를 더블클릭하면 버추얼 모듈을 추가할 수 있다.

    figure 87
    SO 리소스 생성 (4)
    figure 88
    SO 리소스 생성 (5)
    figure 89
    SO 리소스 생성 (6)
  6. 버추얼 모듈을 더블클릭해서 나오는 SOtest1.so 파일에 다음과 같이 return output을 넣는다. 이후 저장을 하게되면 에러가 발생하지 않는다(return 값이 없으면 에러가 발생한다).

    figure 90
    SO 리소스 생성 (7)

리소스 커밋

다음의 과정으로 커밋한다.

  1. 생성된 DO와 SO를 선택한 후 컨텍스트 메뉴에서 [Team] > [커밋]을 선택한다.

    figure 91
    리소스 커밋 (1)
  2. 커밋 정보를 확인한 후 [OK] 버튼을 클릭한다.

    figure 92
    리소스 커밋 (2)
  3. servicegroup.xml 파일을 생성한다. 생성한 SO 파일은 선택한 후 컨텍스트 메뉴에서 [프로오브젝트] > [Generate Application DD]를 선택한다.

    figure 93
    리소스 커밋 (3)

    DB 버전에서는 생성한 servicegroup.xml 파일은 HotDeploy할 필요 없다. SO를 HotDeploy할 때 자동으로 반영된다.

4.4. HotDeploy 및 Servcie Test

다음의 과정으로 ProManager에서 리소스를 HotDeploy하고 Servcie Test를 진행한다.

  1. ProStudio에서 리소스들을 HotDeploy한다.

    생성한 리소스를 선택한 후 컨텍스트 메뉴에서 [프로오브젝트] > [Hot deploy to Test Server]를 선택한다. HotDeploy하는 과정에서 DEV 서버 로그에 에러가 발생하지 않는지 확인한다. (${PROOBJECT_HOME}/logs/ProObject.log)

    figure 94
    ProStudio - HotDeploy (1)
  2. ${PROOBJECT_HOME}/system/config에서 설정한 dbio_config.xml 파일을 ${PROOBJECT_HOME}/application/AppName/config에 넣어준다.

    figure 95
    ProStudio - HotDeploy (2)
  3. ProManager[Development] 메뉴에서 [Test]를 선택한 후 목록에서 'AppName’을 선택한다. 'Target Node' 항목에서 [검색] 버튼을 클릭한다.

    figure 96
    ProManager 테스트 (1)

    Select Target Node 화면에서 노드를 선택한 후 [Next] 버튼을 클릭한다.

    figure 97
    ProManager 테스트 (2)
  4. 'Resource Name' 항목에서 생성한 SO를 체크하여 [OK] 버튼을 클릭한다.

    figure 98
    ProManager 테스트 (3)
  5. ${PROOBJECT_HOME}/logs/ProObject.log를 tail을 설정해 놓은 상태에서 아래와 같이 [Test] 버튼을 클릭한다.

    figure 99
    ProManager 테스트 (4)
  6. 아래와 같은 화면이 나타나고 로그에 .so 파일에 작성한 로그가 찍히는 것을 확인하면 성공이다.

    figure 100
    ProManager 테스트 (5)
    [2019.12.09 10:57:33] [INFO] [GUID-121617222231994139331697520112325099647]
    <<TestApp1.TestSG1.SOtest1>> is ready for execution : Method - service, WaitObject - null
    [2019.12.09 10:57:33] [INFO] [GUID-121617222231994139331697520112325099647] ####### Test #######
    [2019.12.09 10:57:33] [INFO] [GUID-121617222231994139331697520112325099647]
    <<TestApp1.TestSG1.SOtest1>> done for executing :  Method - service
    [2019.12.09 10:57:33] [INFO] [GUID-121617222231994139331697520112325099647]
    <<TestApp1.TestSG1.SOtest1>> is done!

    다음과 같은 에러가 발생한다면 ${PROOBJECT_HOME}/config/system.properties 파일의 SYSTEM_APPLICATION 설정이 등록한 Application명과 같은지 확인한다.

    [RTE-0110] : ApplicationNotFound

4.5. 빌드 및 런타임 서버 배포

다음의 과정으로 ProManagerOps를 실행해서 런타임 서버에 리소스를 빌드하고 배포한다.

  1. 기존 Git 버전에서 Jenkins 빌드를 통해 OPS로 요청을 보내고 배포가 가능했다면 DB 버전에서는 Jenkins 대신 특정 셸 파일을 실행하여 OPS로 요청을 보낸다.

    ${PROOBJECT_HOME}/system/devops/devbuild 경로에 있는 파일에 755 권한을 부여한다.

    -rwxr-xr-x. 1 po7dev po7dev 15749 Dec  3 00:46 build.gradle
    -rwxr-xr-x. 1 po7dev po7dev   668 Dec  4 00:11 devBuildTrigger.sh
  2. devBuildTrigger.sh 파일을 사용자 환경에 맞게 수정한다.

    #!/bin/bash
    
    DEVOPS_HOME=${PROOBJECT_HOME}/system/devops
    export DEVOPS_HOME
    
    CLASSPATH=${CLASSPATH}:$DEVOPS_HOME/jenkins/devclient/proobject-devclient-7.0.0.0.jar
    CLASSPATH=${CLASSPATH}:$DEVOPS_HOME/binary/proobject-devserver-7.0.0.0.jar
    CLASSPATH=${CLASSPATH}:$DEVOPS_HOME/binary/proobject-devserver-dto-7.0.0.0.jar
    CLASSPATH=${CLASSPATH}:$DEVOPS_HOME/jenkins/script/3rdPartyLib/proobject-srcgen-7.0.0.0-jar-with-dependencies.jar
    CLASSPATH=${CLASSPATH}:$DEVOPS_HOME/jenkins/script/3rdPartyLib/proobject-client-7.0.0.0-jar-with-dependencies.jar
    
    java -classpath ${CLASSPATH} com.tmax.proobject.devclient.build.DevPartialBuildCall "192.168.105.111" "14000" $1 $2 $3 $4
  3. 리소스 경로에 있는 xml 파일을 devbuild 경로에 넣는다.

    1. 로컬에서 AppName, SGName 폴더를 만든다.

    2. 각각 폴더에 meta 폴더를 만든다.

    3. ${PROOBJECT_HOME}/resources/metas/AppName/SGName 경로에서 모듈별 타입 폴더를 위에서 만든 meta 폴더 아래에 생성한다.

      다음은 모듈별로 생성되는 폴더이다.

      모듈별 타입 폴더

      DO, DOMsg

      PO_IO

      DOF, QO

      PO_DBIO

      BO, SO

      PO_MODULES

      JO

      PO_BATCH

    4. 스튜디오에서 생성한 application.xml 파일을 복사하여 AppName\meta 폴더에 넣는다.

    5. 스튜디오에서 생성한 servicegroup.xml 파일을 복사하여 AppName\meta 폴더에 넣는다.

    6. AppName, SGName 폴더를 ${PROOBJECT_HOME}/system/devops/devbuild 경로에 넣는다.

      해당 예제에서 트리 구조는 아래와 같다.

      po7dev@ns:~/proobject7/system/devops/devbuild$ ls -R TestApp1
      TestApp1:
      meta
      
      TestApp1/meta:
      application.xml
      po7dev@ns:~/proobject7/system/devops/devbuild$ ls -R TestSG1
      TestSG1:
      meta
      
      TestSG1/meta:
      PO_IO  PO_MODULES  servicegroup.xml
      
      TestSG1/meta/PO_IO:
      DOtest1.xml  DOtest1MsgJson.xml
      
      TestSG1/meta/PO_MODULES:
      SOtest1.xml
      po7dev@ns:~/proobject7/system/devops/devbuild$
  4. 해당 경로에서 셸 파일을 실행한다.

    '1’은 build number. 'TestApp1’은 Application Name, 'TestSG1’은 ServiceGroup Name이다. 'true’는 DB 버전에서 셸 파일을 사용하는 옵션이다.

    sh devBuildTrigger.sh 1 TestApp1 TestSG1 true
    po7dev@ns:~/proobject7/system/devops/devbuild$ sh devBuildTrigger.sh 1 TestApp1 TestSG1 true
    12월 09, 2019 10:40:04 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: Dev Partial Build Call is Start
    12월 09, 2019 10:40:04 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: property path : /home/po7dev/proobject7/system/devops/devbuild/gradle.properties
    12월 09, 2019 10:40:07 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall srcgenDevResourcesToDevBuildDir
    정보: Is Success copy Dev Resources To DevBuildDir :  true
    12월 09, 2019 10:40:07 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: requestId : 1 appName : TestApp1 sgName : TestSG1 serverIp : 192.168.105.111 serverPort : 14000
    12월 09, 2019 10:40:07 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: return of get build class path is true
    12월 09, 2019 10:40:56 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: DevPartialBuild Success! true
    12월 09, 2019 10:40:56 오전 com.tmax.proobject.devclient.build.DevPartialBuildCall main
    정보: Dev Partial Build Call is End
    po7dev@ns:~/proobject7/system/devops/devbuild$
  5. ProManagerOps네비게이션 영역에서 [Deploy] > [Request]를 선택한 후 Deploy Request 화면에서 Deploy Request가 들어왔는지 확인한다.

    figure 107
    ProManagerOps 테스트 (1)
  6. ${PROOBJECT_HOME}/system/config에서 설정한 dbio_config.xml 파일을 런타임 서버 ${PROOBJECT_HOME}/application/AppName/config에 넣어준다.

    ProManager의 [Deploy] > [Request]에서 빌드된 요청의 'Action' 항목에서 'Deploy’를 선택한다. 초기 한번만 Deploy이고 이후 요청이 들어올 경우 HotDeploy이다.

    figure 108
    ProManagerOps 테스트 (2)
  7. 배포하는 과정에서 Ops 서버 로그에 에러가 발생하지 않는지 확인한다(${PROOBJECT_HOME}/logs/ProObject.log). RTE 서버에 다음 경로에 .jar 파일의 형태로 배포된다.

    /home/po7rte/proobject7/application/TestApp1/servicegroup/TestSG1
  8. 다음은 vim TestSG1.jar 결과이다.

    " zip.vim version v27
    " Browsing zipfile /home/po7rte/proobject7/application/TestApp1/servicegroup/TestSG1/TestSG1.jar
    " Select a file with cursor and press ENTER
    
    META-INF/
    META-INF/MANIFEST.MF
    com/
    com/tmax/
    com/tmax/proobject/
    com/tmax/proobject/test/
    com/tmax/proobject/test/runtime/
    com/tmax/proobject/test/runtime/servicegroup/
    com/tmax/proobject/test/runtime/servicegroup/main/
    com/tmax/proobject/test/runtime/servicegroup/main/service/
    com/tmax/proobject/test/runtime/servicegroup/main/service/memorycalc/
    com/tmax/proobject/test/runtime/servicegroup/main/service/memorycalc/ProObjectMemoryCalculatorForLengthCalc.class
    com/tmax/SOtest1Executor.class
    com/tmax/SOtest1.class
  9. ${PROOBJECT_HOME}/logs/ProObject.log를 tail 걸어 놓은 상태에서 Postman에서 아래와 같이 서비스 호출을 실행한다(Application명, Service Group명, SO파일명)..

    figure 111
    ProManagerOps 테스트 (3) - 서비스 호출
  10. RTE 서버의 ${PROOBJECT_HOME}/logs/ProObject.log에 정상적으로 로그가 저장되었는지 확인한다.

    다음과 같은 에러가 발생한다면 ${PROOBJECT_HOME}/config/system.properties 파일의 SYSTEM_APPLICATION 설정이 등록한 Application명과 같은지 확인한다.

    [RTE-0110] : ApplicationNotFound

5. 제거

설치된 개발 서버(DevOps)를 제거하기 위해서는 실행중인 서버를 모두 종료 후 설치한 폴더의 파일을 제거해주어야 한다. 설치 파일 삭제에 실패한 경우 해당 폴더로 이동한 후 명령어를 실행해서 삭제를 진행한다.