표준전문생성프로그램
프로그램용도 | 구현할 Java인터페이스 | 적용할 설정화면 |
---|---|---|
사용자호출프로그램 | StandardCreateMessage | 기본설정관리>시스템별업무정보 |
내부에서 사용하는 표준전문을 생성하는 프로그램이다.
대외기관에서 입력되는 값의 매핑만으로 모든 값을 생성할 수 있는 경우 생략될 수 있으나, 대부분의 경우 기관의 입력되는 공통부외에 추가적인 필드 값을 설정하므로 일반적으로 개발되어 적용된다.
표준전문을 생성하는 케이스
수신한 전문의 헤더와 대내시스템의 표준전문 헤더가 다른 경우
대외기관이나 채널에서 수신한 전문으로 대내시스템의 표준전문 헤더를 생성할 수 없는 경우, 표준전문 헤더를 생성하는 사용자 프로그램을 통하여 표준전문 헤더를 생성한다.
일부 표준전문 헤더 필드를 생성해야 하는 경우
대외기관이나 채널에서 수신한 전문으로, 먼저 사용자 프로그램을 통하여 일부 필드를 생성하고 나머지 필드는 매핑을 통하여 표준전문 헤더를 생성한다.
매핑을 통해 표준전문 헤더를 생성하는 경우
대외기관이나 채널에서 수신한 전문으로 대내시스템의 표준전문 헤더를 매핑을 통하여 표준전문을 생성한다.
표준전문 헤더 필드를 검증하는 경우
대외기관이나 채널에서 수신한 표준전문 헤더의 필드를 검증하고자 하는 경우에도 사용한다.
개발방법
제공되는 인터페이스에는 네 개의 API가 있다.
요청을 위한 표준전문 생성
아래 예제는 대외기관이나 채널에서 수신된 요청 전문의 헤더가 대내시스템의 표준전문 헤더와 달라 새롭게 생성하는 케이스이다.
대외기관이나 채널에서 수신한 전문이 요청 전문인 경우 표준전문 헤더를 생성하는 예제로, Null을 리턴하면 에러 처리한다.
@Override
public Map<String, Object> request(ExchangeMessage bxiMessage, Map<String, Object> extHeader,
BxiOnlineIntrfcIO onlIntrfcInfo) {
// 1. Generate a standard header map
Map<String, Object> stdHeader = new LinkedHashMap<String, Object>();
String guid = JavaUtil.createUid();
stdHeader.put("stdMsgLen", 344L);
stdHeader.put("stdMsgVer", 1L);
stdHeader.put("guid", guid);
stdHeader.put("guidSeq", 1L);
stdHeader.put("fstGuid", guid);
stdHeader.put("trtInstCd", extHeader.get("instCd"));
stdHeader.put("fstTrmsDttm", DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
stdHeader.put("msgClssCd", "S");
...
// 2. Store user data
Map<String, String> userData = new HashMap<String, String>();
userData.put("guid", (String) stdHeader.get("guid"));
userData.put("fstGuid", (String) stdHeader.get("fstGuid"));
bxiMessage.setUserData(userData);
// 3. Save layout information
XmlTypeInfo xmlInfo = LayoutUtil.makeXmlTypeInfo(STD_HDR_LAYOUT, 1024);
bxiMessage.setStdHeaderMsgInfo(xmlInfo);
return stdHeader;
}
표준전문 헤더를 생성하기 위해서는 표준전문 헤더의 레이아웃을 알아야 한다.
표준전문 헤더의 각 필드별 데이터를 Map 형식으로 저장한다.
표준전문 헤더 생성에 필요한 정보는 bxiMessage
에 저장되어 있으므로 이것을 이용하여 표준전문 헤더를 생성한다.
사용자 데이터는 거래내역이나 온라인로그상세 화면에서 사용자 데이터로 검색하고자 하는 경우에 사용하는 데이터로,
userData
에 저장하면 해당 데이터를 거래내역이나 송수신 로그에 저장하여 UI에서 검색용도로 사용할 수 있다.
전문정보는 BXI 엔진에서 인터페이스를 식별하기 위해서 전문에서 필요 데이터를 추출해야 한다. BXI는 전문 데이터 추출을 위해서 웹어드민의 공통헤더정보에 레이아웃별로 등록해서 사용한다.
사용자가 직접 표준전문 헤더를 생성했으므로 해당 전문의 정보도 표준전문 헤더 정보인 stdHeaderMsgInfo
에 저장한다.
☑ 입력
- bxiMessage : 전문 처리에 필요한 정보가 저장되어 있는 항목
- extCommonHeader : 대외기관이나채널에서 수신한 헤더를 Unmarshal한 데이터
- onlIntrfcInfo : 요청한 거래의 인터페이스 정보
☑ 출력
- Map 형식의 표준전문 헤더
정상 응답을 위한 표준전문 생성
응답을 위한 표준전문 헤더 처리는 대내시스템에서 대외기관이나 또는 단위시스템에 서비스를 요청하고 응답을 받는 경우에 사용한다.
요청 시 표준전문 헤더는 저장해 두었다가 응답을 받으면 이를 복원하므로 표준전문 헤더 전체를 생성하지 않고, 복원한 요청 헤더에서 필요한 필드만 변경한다.
응답에 대한 표준전문 헤더 처리는 요청 시 표준전문으로 요청한 경우에 사용한다. 표준전문헤더에 요청/응답 구분이 있거나 또는 응답 시간을 설정하는 경우에 사용한다.
Null을 리턴하면 에러 처리한다.
@Override
public Map<String, Object> response(ExchangeMessage bxiMessage, Map<String, Object> stdHeader,
Map<String, Object> extHeader) {
// 1. Change request / response breakdown to response
stdHeader.put("msgClssCd", "R");
return stdHeader;
}
☑ 입력
- bxiMessage : 전문 처리에 필요한 정보가 저장되어 있는 항목
- extCommonHeader : 대외기관이나 채널에서 수신한 헤더를 Unmarshal한 데이터
- onlIntrfcInfo : 요청한 거래의 인터페이스 정보
☑ 출력
- Map 형식의 표준전문 헤더
Dummy 응답을 위한 표준전문 헤더 생성
대내시스템의 서비스가 요청서비스와 응답서비스로 분리되어 있어 대외기관에 비동기 방식으로 요청한 경우, BXI는 대외기관에 전문을 전송하고, 응답을 받기 전에 먼저 대내시스템에 Dummy 응답을 전송하여 대내시스템의 서비스를 해제한다.
이후 실 응답을 수신하면 다른 요청처리와 동일하게 대내시스템의 응답서비스를 호출하는 방식이다.
이런 방식으로 처리하는 이유는 대내시스템서비스가 대외기관으로부터 응답을 받을 때까지 대기하여 발생하는 시스템의 처리 성능 저하를 방지하기 위함이다. 이와 같은 경우에 Dummy 응답을 생성하기 위해 사용하는 예제이다.
@Override
public void dummyResponse(ExchangeMessage bxiMessage, BxiIntrnlSysBizIO intrnlSysBizInfo) {
// 1. Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2. Standard message header changes
// Response
stdHeader.put("msgClssCd", "R");
// Change response code
stdHeader.put("rspnRsltClssCd", "9");
// In case of dummy response, set guid sequence to "0"
stdHeader.put("guidSeq", "0");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3. Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4. Store dummy response message
bxiMessage.setMessage(responseMessage);
}
표준전문 헤더의 필드 중에서 Dummy 응답을 나타내는 필드를 변경한다.
Dummy 응답을 위해 전송할 전문은 API에서 직접 만들어야 한다.
Dummy 응답은 개별부는 제외하고 헤더부만으로 생성하기 때문에 body
데이터는 Clear한다.
마지막으로 생성된 Dummy 응답은 전송을 위해 ExchangeMessage의 message
에 저장한다.
☑ 입력
- bxiMessage : 전문 처리에 필요한 정보가 저장되어 있는 항목
- intrnlSysBizInfo : 요청한 대내시스템의 시스템별업무정보
☑ 출력
- 없음
응답 전문 전송 오류에 따른 표준전문 헤더 생성
대외기관에 요청한 전문을 대내시스템에서 처리하고 응답을 대외기관에 전송할 때 전송할 커넥션이 끊어졌거나, 또는 기타 다른 오류로 인하여 응답을 전송하는 못하는 경우에 사용하는 API이다.
이 경우에 표준전문 헤더에 응답전문 전송 오류라는 플래그를 설정해서 전달한다.
@Override
public void sendErrorReply(ExchangeMessage bxiMessage) {
// 1. Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2. Set the response-specific transmission error flag
stdHeader.put("sendFlag", "E");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3. Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4. Store dummy response message
bxiMessage.setMessage(responseMessage);
}
응답에 대한 에러 반환도 Dummy응답과 동일하게 표준전문 헤더에 응답전문 전송 오류 플래그를 설정하고 전송 데이터를 생성한다. 나머지 처리에 대한 설명은 Dummy응답 전문 생성 API를 참고한다.
☑ 입력
- bxiMessage : 전문 처리에 필요한 정보가 저장되어 있는 항목
☑ 출력
- 없음
전체 예제
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import bxi.api.StandardCreateMessage;
import bxi.common.dao.dto.BxiIntrnlSysBizIO;
import bxi.common.dao.dto.BxiOnlineIntrfcIO;
import bxi.common.model.ExchangeMessage;
import bxi.common.model.XmlTypeInfo;
import bxi.common.utility.DateUtil;
import bxi.common.utility.JavaUtil;
import bxi.common.utility.ObjectUtil;
import bxi.online.common.SendMessageCreator;
import bxi.parser.base.LayoutUtil;
@Component
public class BcFepStandardHeaderProcessor implements StandardCreateMessage {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/** 표준전문 헤더 레이아웃 정보 */
private final String STD_HDR_LAYOUT = "bxi.extension.layout.StdMsgHeader";
@Override
public Map<String, Object> request(ExchangeMessage bxiMessage, Map<String, Object> extHeader,
BxiOnlineIntrfcIO onlIntrfcInfo) {
// 1) Generate a standard header map
Map<String, Object> stdHeader = new LinkedHashMap<String, Object>();
String guid = JavaUtil.createUid();
stdHeader.put("stdMsgLen", 344L);
stdHeader.put("stdMsgVer", 1L);
stdHeader.put("guid", guid);
stdHeader.put("guidSeq", 1L);
stdHeader.put("fstGuid", guid);
stdHeader.put("trtInstCd", extHeader.get("instCd"));
stdHeader.put("fstTrmsDttm", DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
stdHeader.put("msgClssCd", "S");
// 2) Store user data
Map<String, String> userData = new HashMap<String, String>();
userData.put("guid", (String) stdHeader.get("guid"));
userData.put("fstGuid", (String) stdHeader.get("fstGuid"));
bxiMessage.setUserData(userData);
// 3) Save layout information
XmlTypeInfo xmlInfo = LayoutUtil.makeXmlTypeInfo(STD_HDR_LAYOUT, 1024);
bxiMessage.setStdHeaderMsgInfo(xmlInfo);
return stdHeader;
}
@Override
public Map<String, Object> response(ExchangeMessage bxiMessage, Map<String, Object> stdHeader,
Map<String, Object> extHeader) {
// 1) Change request / response breakdown to response
stdHeader.put("msgClssCd", "R");
return stdHeader;
}
@Override
public void dummyResponse(ExchangeMessage bxiMessage, BxiIntrnlSysBizIO intrnlSysBizInfo) {
// 1) Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2) Standard message header changes
// Response
stdHeader.put("msgClssCd", "R");
// Change response code
stdHeader.put("rspnRsltClssCd", "9");
// In case of dummy response, set guid sequence to "0"
stdHeader.put("guidSeq", "0");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3) Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4) Store dummy response message
bxiMessage.setMessage(responseMessage);
}
@Override
public void sendErrorReply(ExchangeMessage bxiMessage) {
// 1) Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2) Set the response-specific transmission error flag
stdHeader.put("sendFlag", "E");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3) Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4) Store dummy response message
bxiMessage.setMessage(responseMessage);
}
}