메시지 번들
본 장에서는 ProObject의 애플리케이션과 서비스 그룹에서 사용되는 메시지 번들을 설정하는 방법에 대하여 설명한다.
1. 개요
웹 애플리케이션 출력할 메시지들을 메시지 번들이라고 한다. 일반적으로 웹 애플리케이션은 메시지 번들을 소스 내에 하드 코딩(Hard Coding)하지 않고 데이터베이스나 설정 파일(*.properties)에 정의한 후 프로그램이 기동할 때 읽어 오는 방식으로 개발한다.
메시지 번들을 사용하는 경우 다음과 같은 장점을 갖는다.
-
메시지 수정 시 소스 컴파일 불필요
단순 오타나 메시지의 내용을 수정하기 위해 애플리케이션의 코드를 새로 컴파일하고 배포하는 작업을 하지 않고, 단순 파일이나 데이터베이스의 값을 수정함으로써 메시지를 수정하는 것이 가능하다.
-
다국어 지원 용이
다국어가 정의된 파일을 추가하거나, 데이터베이스에 로케일(Locale)을 포함해 값을 단순히 저장함으로써 다국어를 보다 쉽게 지원할 수 있도록 도와준다.
2. 파일을 통한 메시지 번들
파일을 통해 메시지 번들을 이용하기 위해서는 일반적인 Java에서 사용되는 ResourceBundle과 동일한 형태로 설정 파일(*.properties)을 작성해야 한다. 보통 설정 파일에는 다국어 언어 정보가 들어가며, 설정 파일의 항목에 대한 자세한 내용은 Java의 ResourceBundle 항목을 참고한다. 현재 파일을 통한 메시지 번들은 단일 언어만 가능하며, 다국어에 대해서는 DB를 통한 메시지번들을 이용하도록 한다.
파일을 이용해 메시지 번들을 작성한 후에는 다음과 같은 위치에 각 번들 파일을 배포해야 한다. 애플리케이션이나 서비스 그룹의 메시지 번들 설정이 활성화된 경우에는 이 파일이 무시된다. 디렉터리 구조에 대한 자세한 설명은 애플리케이션 디렉터리 구조를 참고한다.
-
애플리케이션 메시지 번들
애플리케이션에서 공용으로 사용되는 메시지 번들은 다음의 경로에 배포한다.
${APP_HOME}/common/<APP_NAME>_<LOCALE>.properties
-
서비스 그룹 메시지 번들
서비스 그룹에서 공용으로 사용되는 메시지 번들은 다음과 같은 경로에 배포하여 사용이 가능하다.
${APP_HOME}/servicegroup/<SERVICEGROUP_NAME>/<SERIVCEGROUP_NAME>_<LOCALE>.properties
${SVG_HOME}/<SERIVCEGROUP_NAME>_<LOCALE>}.properties
3. 데이터 베이스를 통한 메시지 번들
데이터베이스를 통해 메시지 번들을 이용하기 위해서는 먼저 데이터베이스에 KEY, LOCALE, VALUE 컬럼을 지니는 테이블을 먼저 작성해야 한다.
다음 예제는 Tibero를 이용하여 테이블을 작성하는 경우의 DDL 예제이다.
create table {TABLE_NAME}
(
KEY VARCHAR(256),
LOCALE VARCHAR(32),
VALUE VARCHAR(4096)
);
위와 같이 테이블을 작성한 뒤에는 테이블의 이름으로 애플리케이션이나 서비스 그룹에서 원하는 테이블을 참조할 수 있다. 데이터 베이스를 통한 메세지 번들의 경우 부팅 시점에 DB의 리소스를 캐시하여 사용한다. 애플리케이션이나 서비스 그룹에서 메시지 번들을 활성화하는 방법에 대해서는 애플리케이션의 메시지 번들 설정이나 서비스 그룹의 메시지 번들 설정의 설명을 참고한다.
애플리케이션의 메시지 번들은 ${APP_HOME}/config/dbio_config.xml, 서비스 그룹의 메시지 번들은 ${SG_HOME}/config/dbio_config.xml 의 데이터소스를 참조하여 사용한다. |
4. 커스텀 메시지 번들
테이블 및 컬럼명을 지정할 수 있는 기능을 이용하기 위해서 커스텀 메시지 번들을 이용할 수 있다.
-
로직 변경
다음 예제는 MySQL을 이용하여 테이블을 작성하는 경우의 DDL 예제이다.
public class CustomMessageBundle extends ProObjectMessageBundles { @Override public List<ProObjectMessageBundleBucket> initMessage() { List<ProObjectMessageBundleBucket> list = new ArrayList<>(); ProObjectMessageBundleWell bundleWell = new ProObjectMessageBundleWell("test"); bundleWell.setFullQuery(FULLQUERY.SELECT_MESSAGES); bundleWell.setTableInformation("", "MSG_CUSTOM_TEST"); list = bundleWell.getForwardList(); return list; } }
ProObjectMessageBundles를 상속하여 initMessage 메시지를 override해야 한다. initMessage 내에서는 쿼리문이 들어있는 dof를 만든 후 DB에서 가져온 내용을 조작하여 ProObjectMessageBundleBucket dto안에 key, locale, value를 넣어서 list로 만들어 리턴해야 한다. 적용할 범위가 애플리케이션이라면 application.xml에 서비스 그룹이라면 servicegroup.xml에 클래스 풀 패키지명을 걸정한다.
-
DOF 변경
데이터베이스의 컬럼명만을 변경하는 경우 DOF를 커스터마이징하여 등록한다. 적용할 범위가 애플리케이션이라면 application.xml에 서비스 그룹이라면 servicegroup.xml에 클래스 풀 패키지명을 걸정한다.
애플리케이션 메타 설정
커스텀 메시지 번들 기능을 사용하기 위해서 메시지 번들 클래스를 설정해야 한다.
애플리케이션 메타는 아래 경로에 XML 형식으로 작성한다.
${APP_HOME}/config/application.xml
application.xml은 반드시 아래의 예제와 동일한 구조로 작성해야 한다.
<ns18:message-bundle>
<ns18:class>com.tmax.proobject.test.runtime.application.testOther.lib.CustomMessageBundle</ns18:class>
</ns18:message-bundle>
태그 | 설명 |
---|---|
<message-bundle> |
메시지 번들 설정을 관리한다. |
<class> |
사용자 정의 메시지 번들을 정의하는 경우 ProObjectMessageBundles를 상속받아 만든 클래스 이름을 패키지 이름을 포함해서 지정한다. |
<dataobjectfactory> |
사용자 정의 DB 컬럼을 사용하는 경우 사용자가 만든 dataobjectfactory 클래스 이름을 패키지 이름을 포함하여 지정한다. |
5. 메시지 번들 사용
설정된 메시지 번들은 로그와 응답 메시지 코드등을 반환할 때 사용하는 것이 가능하다.
응답 메시지 코드와 관련된 내용은 ProObjectRequest 변경을 참고하며, 로그에서는 다음과 같이 사용하는 것이 가능하다.
public StringDataObject service(KeyValueDataObject input) throws Throwable {
MessageBundles bundle = ServiceManager.getMessageBundle();
ProObjectLogger logger = ServiceLogger.getLogger();
logger.info("MSG_KEY"); //MSG_KEY에 매칭되는 value가 로그로 찍힘
StringDataObject out = new StringDataObject();
out.setValue(bundle.getMessage(input.getKey(), "EN"));
return out;
}
위와 같은 코드를 작성하게 되면, 현재 애플리케이션/서비스 그룹 등에서 불러온 메시지 번들의 MSG_KEY 에 해당하는 메시지 내용을 가져오게 된다. 만약 메시지 형식에 매개변수가 존재하는 경우에는 기록하는 로그 뒤에 매개 변수를 전달하여 로그 내용을 포매팅(Formatting)하는 것 또한 가능하다.
예를 들어, key는 "MSG_KEY"이고 value는 "{0}_{1}"인 경우 아래와 같은 코드를 실행하면 "PARAM1_PARAM2"가 로그로 찍히게 된다.
매개변수를 나타내어 로그 메시지를 나타내는 방법은 다국어 로거를 참고한다.
logger.info("MSG_KEY", "PARAM1", "PARAM2");