커스터마이즈
아래는 커스터마이즈 할 수 있는 목록에 대한 설명 및 예시이다.
BXM Web Admin의 서버단은 BXM으로 개발된 프로젝트이기 때문에, BXM의 기본 흐름(Service > Bean > DBIO)을 따라서 개발한다.
1. 메뉴 추가
-
기본 메뉴 구성은 BXM_USER_MENU 테이블에 있는 데이터로 만들어지며, BXM_USER_ROLE_N_MENU 테이블에서 역할과 메뉴를 매칭시켜야 한다.
-
소메뉴의 상위 메뉴(이하 대메뉴라 한다.)가 존재하는 경우에는 반드시 대메뉴도 함께 추가해야 하며, 사용할 메뉴는 'USE_YN' 필드를 반드시 'Y’로 지정한다.
-
MENU00100의 숫자 중 처음 세 자리는 대메뉴의 분류를 나타낸다.
-
MENU00100의 숫자 중 마지막 두 자리는 대메뉴 속 소메뉴들의 분류를 나타낸다.
[예시] 아래와 같이 BXM_USER_MENU 테이블에 메뉴를 추가한다고 가정한다.
Insert into BXM_USER_MENU (MENU_ID,MENU_NM,MENU_DESC,USE_YN,PARENT_MENU_ID,MENU_TYPE_CD,MENU_SEQ) values ('MENU00100','테스트 관리','테스트 관리','Y',null,'0',100);
Insert into BXM_USER_MENU (MENU_ID,MENU_NM,MENU_DESC,USE_YN,PARENT_MENU_ID,MENU_TYPE_CD,MENU_SEQ) values ('MENU00101','테스트 조회','테스트 조회','Y','MENU00100','1',101);
Insert into BXM_USER_MENU (MENU_ID,MENU_NM,MENU_DESC,USE_YN,PARENT_MENU_ID,MENU_TYPE_CD,MENU_SEQ) values ('MENU00102','테스트 현황','테스트 현황','Y','MENU00100','1',102);
메뉴는 역할에 따라 보여지는 목록이 달라지는데, 이를 설정하는 데이터는 BXM_USER_ROLE_N_MENU 테이블에 존재한다. 만약 역할ID가 'R0001’인 사용자가 'MENU00100', 'MENU00101’을 사용할 수 있게 설정하려면 아래와 같이 추가하면 된다.
Insert into BXM_USER_ROLE_N_MENU (ROLE_ID,MENU_ID) values ('R00001','MENU00100');
Insert into BXM_USER_ROLE_N_MENU (ROLE_ID,MENU_ID) values ('R00001','MENU00101');
메뉴 정보를 추가한 뒤 화면 커스터마이즈는 BXM Web Admin UI 커스터마이즈 가이드를 참조한다. |
2. 메인 옵션 추가
-
메인 옵션을 사용해 UI 커스터마이징에 활용할 수 있다.
-
개발자가 필요한 옵션을 임의로 추가할 수 있으며, 옵션 목록은 Key와 Value를 값으로 가지는 OMM(Object)의 리스트 형태로 저장 된다.
-
MainBean의 getMain에서 추가 설정할 수 있다.
추가 방법
-
ExtraOptionOMM의 객체를 생성한다.
-
ExtraOptionOMM의 객체에 key와 value값을 설정한다.
-
output.getExtraOption() 리스트에 객체를 추가한다.
ExtraOptionOMM option = new ExtraOptionOMM();
...
option = new ExtraOptionOMM();
option.setKey("BatchTypeField");
if(!Boolean.getBoolean(BxmConfig.BATCH_TYPE_CLASSIFICATION)) {
option.setValue("hide");
} else {
option.setValue("show");
}
output.getExtraOption().add(option);
option = new ExtraOptionOMM();
option.setKey(<<옵션key값>>);
if(Boolean.getBoolean(BxmConfig.SCHEDULER_USE_YN)) {
option.setValue(<<옵션value값>>);
} else {
option.setValue(<<옵션value값>>);
}
output.getExtraOption().add(option);
...
3. 공통메시지 자동채번 추가
-
자동 채번은 ICommonMessageUtil 인터페이스를 구현해서 사용할 수 있다. 기본적인 메시지 자동채번은 bxm.web.admin.common.inf.concrete.CommonMessageBeanUtil에 구현되어 있다.
추가 방법
-
ICommonMessageUtil 인터페이스를 구현하는 구상 클래스를 기존의 코드를 참고해 생성한다.
-
bxm-management-instance.xml 파일의 시스템 프로퍼티에 common.message.id.generator=[커스터마이즈한 구상 클래스 명]을 추가한다.
//인터페이스
public interface ICommonMessageUtil {
public void generateMsgId(CommonMessageOMM input) throws ApplicationException;
}
//구상 클래스(Defualt)
public class CommonMessageBeanUtil implements ICommonMessageUtil {
final Logger logger = LoggerFactory.getLogger(this.getClass());
private CommonMessageDBIO commonMessageDBIO;
/**
* Common Message 추가할 때 자동채번을 사용할 시 필요한 유틸
*/
@Override
public void generateMsgId(CommonMessageOMM input) throws ApplicationException {
if(commonMessageDBIO == null){
commonMessageDBIO = LApplicationContext.getBean(CommonMessageDBIO.class);
}
ThreadSafeDecimalFormat msgSrNoFormat = new ThreadSafeDecimalFormat(AdminConstant.AUTO_00000);
StringBuilder builder = new StringBuilder();
if(StringUtils.isEmpty(input.getMsgId())) {
String lastMsgId = commonMessageDBIO.selectAutoNumbering(input);
...
4. 이미지 로그 파싱
-이미지 로그 상세 팝업에서 전문 유형이 FLD, XML, JSON일 때 시스템 헤더부와 데이터부는 특정 클래스의 정보를 가지고 파싱한 후 그리드에 출력된다.
-기본적인 옵션은 bxm-management-instance.xml의 system-properties인 admin.image.log.system.header=bxm.dft.context.DefaultSystemHeader를 따른다.
설정 방법
-
시스템 헤더를 커스터마이징한 경우 system-properties의 admin.image.log.system.header값을 커스터마이징한 클래스 명으로 바꿔야 한다.
5. 재실행 입력 전문 생성
-거래 재실행은 입력 전문의 GUID만 재생성해서 똑같은 입력 전문으로 거래를 실행시키는 기능이다. 온라인 로그 조회 메뉴의 이미지 로그 상세 팝업에서 실행시킬 수 있다.
-온라인 거래의 헤더를 커스터마이징했으면, IInputRegenerator를 구현하는 구상 클래스를 반드시 커스터마이징해야 한다.
-거래 재실행은 전문 유형이 JSON, XML, FLD일 때만 가능하다.
-
기본적인 입력 전문 재생성은 bxm.web.admin.common.inf.concrete.DefaultInputRegenerator에 구현되어 있다. bxm-management-instance.xml의 시스템 프로퍼티에 별다른 옵션이 없을 경우 DefaultInputRegenerator를 사용한다.
추가 방법
-
IInputRegenerator 인터페이스를 구현하는 구상 클래스를 기존의 코드를 참고해 생성한다.
-
bxm-management-instance.xml 파일의 시스템 프로퍼티에 admin.online.input.regenerator=[커스터마이즈한 구상 클래스 명]을 추가한다.
//인터페이스
public interface IInputRegenerator {
public String reproduceInputData(ExecuteTranInOMM input, StringBuilder newGuid);
}
//구상 클래스(Defualt)
public class DefaultInputRegenerator implements IInputRegenerator{
private Logger logger = LoggerFactory.getLogger(DefaultInputRegenerator.class);
@Override
public String reproduceInputData(ExecuteTranInOMM input, StringBuilder newGuid) {
//Generate Guid
String guid = DefaultGuidGenerator.generateInitialGuid();
newGuid.append(guid);
String oldMessage = input.getMsgData();
String newMessage = null;
logger.debug("New GUID : [{}]", guid);
switch (input.getMsgType()) {
case AdminConstant.MSG_FLD:
StringBuilder fldBuilder = new StringBuilder(oldMessage);
fldBuilder.replace(8, 40, guid);
newMessage = fldBuilder.toString();
break;
case AdminConstant.MSG_JSON:
newMessage =remakeJsonInputData(guid, oldMessage);
break;
case AdminConstant.MSG_XML:
newMessage =remakeXmlInputData(guid, oldMessage);
break;
default:
logger.info("Not Supported except for FLD, JSON, XML message type.");
...