개발자가 어떤 기능을 수행하는 애플리케이션을 만든다고 할 때 Standalone 프로그램으로 만들지 않고 J2EE를 사용하는 이유는 개발자가 Enterprise Application이 필요로 하는 기본기능을 구현하는 것이 녹녹치 않고 , 실수하기 쉽고,무엇보다 어렵기 때문이다.
이러한 Enterprise Application이 갖는 기본기능은 분산환경을 전제로 하며 Transaction Management, Resource Management,Security 등을 포함하며 이런 기능들은 비즈니스와 직접 관련이 없는 백엔드 서비스라고 할 수 있다. J2EE 서버, 즉 J2EE 런타임 환경을 이용하면 이 기본기능을 거저 공짜로 주울 수 있다.

관계형 DB와 관련한 애플리케이션이 있다고 가정하고 정해진 비즈니스 로직에 따라 수행하는 애플리케이션이 필요하다고 생각해보자. 이 프로그램을 Shell에서 실행하여 결과를 얻는다고 가정해보자.

Standalone 프로그램은 DB와의 Connection을 포함한 Resoure를 관리해야한다. 당연히 Transaction 처리도 직접해야 한다. 일반적으로 우리나라 개발자들의 생각은 이 전부를 자기들이 다들 잘하는 줄 안다.
물론 소규모의 아주 조그만 프로그램의 경우는 충분히 유지 관리가 될 수도 있으나, 세상일은 아무도 모르는것.
프로그램이 규모가 커지고, 복잡해질 수록 중복되는 로직과 코드가 생겨나고 리소스 관리를 엄격하게 하지 못해 메모리,DB자원이 낭비되는 경향이 짙다.

만약 J2EE 서버에 Standalone에서 필요로하는 로직의 대부분이 EJB로 구성되어 있다면 혹은 몇개의 EJB만 추가하고 이를 조합하면 비즈니스 로직을 처리할 수 있는 경우는 Standalone 프로그램에 새로운 비즈니스 로직,프로그램 코드를 생성하지 않고 EJB를 이용하여 프로그램을 하는 것이 절대적으로 유리하다.

여기서는 이런 환경에서 EJB를 이용한 프로그램을 실행하는 법을 알아보자.

1. 필요한 Classpath 추가
J2EE서버는 일반적으로 클라이언트가 Remote RMI 를 호출하기 위해 필요한 모든 클래스를 모아서 제공하는데 JBoss의 경우도 예외는 아니다. 하지만 애플리케이션에는 사용자가 개발한 클래스 파일도 클래스 패스에 추가해야하니까 추가해야 하는 클래스가 좀 많긴 하다. 이를 모두 적어주기에는 너무 번거롭기 때문에 shell script를 이용한다.

JAVA_HOME=/usr/loca/java/bin
JBOSS_HOME=/home/java/sarah/jboss

SERVER_LIB_DIR=$JBOSS_HOME/lib
SERVER_LIB_DIRS="`find $SERVER_LIB_DIR -type d -print`"
DEFAULT_LIB_DIR=$JBOSS_HOME/server/default/lib
EJB_DIR=$JBOSS_HOME/server/default/deploy/sarah.ear
EXT_LIB_DIRS="`find $DEFAULT_LIB_DIR/ext -type d -print`"

for i in $SERVER_LIB_DIRS
do
        DIRLIBS="$DIRLIBS:`ls $i/*.jar  2>/dev/null`"
done

DIRLIBS="$DIRLIBS:`ls $DEFAULT_LIB_DIR/*.jar 2>/dev/null`"
DIRLIBS="$DIRLIBS:`ls $EJB_DIR/*.jar 2>/dev/null`"
DIRLIBS="$DIRLIBS:$JBOSS_HOME/client/jbossall-client.jar"

for i in $EXT_LIB_DIRS;
do
        DIRLIBS="$DIRLIBS:`ls $i/*.jar  2>/dev/null`"
done

for i in ${DIRLIBS}; do
if [ "$i" != "${DIRLIBS}" ]; then
    if [ -z "$LOCALCLASSPATH" ] ; then
    LOCALCLASSPATH=$i
    else
    LOCALCLASSPATH="$i":$LOCALCLASSPATH
    fi
fi
done

echo $CLASSPATH

이 shell은 JBoss 시스템 라이브러리 및 사용자가 Deploy한 모든 클래스 파일을 CLASSPATH 변수에 추가하는 shell 스크립트이다.
(이 shell 스크립트는 특정 JBoss 서버의 환경을 전제로 작성되었으며 모든 JBoss 서버에 통용되는 것은 아니다. 예를 들어 EJB_DIR은 실제로 J2EE에 개발자가 등록한 EJB 및 관련 클래스가 모여있는 위치를 지정한것이다)

2. jndi properties 및 log4j properties 지정
jndi properties의 내용은 J2EE 서버들 마다 모두 다르다.
JBoss의 경우는 jnp 프로토콜을 사용하며 여기서 JNDI 서버의 IP 및 PORT를 지정해주면 된다.
일반적으로 서버의 IP가 standalone 프로그램을 실행시키는 서버의 IP와 다를 수 있다.
이때 지정해주는 property가 java.naming.provider.url 이며 JBoss의 경우 이 값은
jnp://서버IP:JNDI Port 이다. default 값은 jnp://localhost:1099 이다.

log4j.properties의 내용은 나중에 상세히 다루도록 하고 여기서는 standalone 프로그램이 log4j properties를
어떻게 이용하는 지 알아보자.
command line으로 log4j.configuration property는 log4j의 설정 파일의 위치를 알려준다.
여기서는 jboss-log4j.xml 이란 이름의 설정파일인데, 중요한 것은 반드시 URL형태로 지정해야 한다는 것이다.(경험으로 알게된 것인데 파일시스템 즉 "/"로 시작하는 경로를 넣어서는 인지하지 못했다.)
그리고 JBoss의 경우는 log4j 설정대로 로깅을 어느 디렉토리에 로그를 남길 것인지를 알려줄 수 있는데
이때 알려주는 property가 jboss.server.log.dir이다.

이를 shell 프로그램으로 정의하면 아래와 같다.

java -classpath $LOCALCLASSPATH:$JBOSS_HOME/server/default/conf -Djboss.server.log.dir=$JBOSS_HOME/server/default/log -Dlog4j.config
uration=file:///home/java/sarah/jboss/server/default/conf/jboss-log4j.xml -Djava.naming.provider.url=jnp://localhost:1099 com.kisinf
o.sarah.admin.UserAgent $@



Posted by
,