본문으로 건너뛰기
버전: 3.4.4

에러응답프로그램

프로그램용도구현할 Java인터페이스적용할 설정화면
사용자호출프로그램ErrorResponseCreate기본설정관리>기관별업무정보, 기본설정관리>시스템별업무정보

수신시스템의 장애 등으로 요청전문을 수신시스템으로 전송하지 못하면, 해당 거래는 무응답(Timeout) 처리된다.

만일 송신시스템에 에러응답전문을 전송해야 하는 경우, 에러응답프로그램을 통해 에러전문을 생성하여 송신시스템에 응답을 전송할 수 있다.

개발방법

대외기관이나 대내시스템의 에러 응답 전문이 다르다면 별도로 작성해서 각각 등록해야 한다.

에러응답프로그램 입출력 모델

ErrorResponseCreate API는 입력과 출력을 각각 ErrorResponseCreateInErrorResponseCreateOut으로 사용한다. 입력과 출력의 모델은 API 프로젝트의 bxi.api.model에 정의되어 있으며, 각각의 항목에 대한 설명은 아래와 같다.

ErrorResponseCreateIn

설정항목필드명설명
기관코드instCd전문을 전송한 기관코드이거나 또는 대내시스템 전문을 대외기관에 전송할 기관코드를 의미한다. FEP에서만 사용되는 항목이다.
업무코드bizCd기관이나 대내시스템의 업무코드를 의미한다.
커넥션IDcnntId전문을 수신한 커넥션의 ID를 의미한다.
헤더부 데이터header요청이나 응답으로 수신한 전문 중 헤더부를 Unmarshal한 데이터를 의미한다.
개별부 데이터body요청이나 응답으로 수신한 전문 중 개별부 데이터를 의미한다. 개별부 데이터는 인터페이스 정보에 레이아웃을 등록하여 Unmarshal이 되었으면 Map 형식이고, 그렇지 않으면 Plain text 데이터이다.
응답코드rspsCd대외 채널이나 대내 채널에 전송할 에러코드를 의미한다.
타임아웃 여부timeout타임아웃 에러 여부를 의미한다. 타임아웃 에러이면 true이다.
전송에러 여부sendError전문 전송 에러 여부를 의미한다. 전문 전송 에러이면 true이다.

ErrorResponseCreateOut

설정항목필드명설명
헤더부 데이터header에러 응답할 헤더부 데이터를 의미한다. 입력으로 전달한 헤더부 데이터에 에러 여부나 에러코드를 저장한 데이터를 의미한다.
메시지부 데이터errMessage채널에 에러 응답할 메시지를 저장한 데이터를 의미한다. MCI, EAI에서만 사용되는 항목이며, FEP에서는 null로 응답한다.
개별부 데이터body에러 응답할 개별부 데이터를 의미한다. 응답할 개별부 데이터가 없으면 null로 응답한다.
에러 여부error에러 응답 전문 생성 중에 에러가 발생했는지 여부를 의미한다. true로 응답하면 에러 응답 전문을 전송하지 않는다.

아래 예제는 대외기관에서 수신한 전문을 처리하는 과정에서 에러가 발생하여 에러 응답을 하는 예제이다.

1. 출력 객체 생성 및 초기화

@Override
public ErrorResponseCreateOut errorProcess(ErrorResponseCreateIn in) {
ErrorResponseCreateOut out = new ErrorResponseCreateOut();
out.setError(false);
out.setRspsCd("000");
}

에러 응답 전문을 생성하여 전달할 출력 객체를 생성하고, 에러 응답 전문 생성 중에 발생할 에러 여부는 clear한다.

2. 종별코드를 구함

String msgCbtpCd = null;
try {
msgCbtpCd = (String) header.get("msgCbtpCd");
} catch (IllegalArgumentException ex) {
out.setError(true);
return out;
}

if (StringUtil.isEmpty(msgCbtpCd)) {
out.setError(true);
return out;
}

대외기관 전문은 일반적으로 종별코드로 요청과 응답을 구분한다.

에러 응답 전문 생성은 종별코드를 구해서 종별코드를 응답 전문코드로 변경해야하므로, 종별코드가 없으면 에러처리한다. 위의 예제는 종별코드의 요청과 응답을 구분하지만 경우에 따라서 다양한 항목을 통해서 구분할 수 도 있다.

3. 에러코드 저장

// Generate error response message
out.setHeader(in.getHeader());

byte[] value = msgCbtpCd.getBytes();
value[2] = '1';
msgCbtpCd = new String(value);
out.getHeader().put("msgCbtpCd", msgCbtpCd);

if (in.isTimeout()) {
out.getHeader().put("rspsCd", "01");
} else if (in.isSendError()) {
out.getHeader().put("rspsCd", "02");
} else {
out.getHeader().put("rspsCd", in.getRspsCd());
}

입력으로 전달한 헤더를 출력의 헤더에 저장하고, 종별코드를 응답코드로 변경하여 응답 헤더를 변경한다.

헤더의 응답 코드에는 에러 종류에 따른 에러 코드를 저장한다. 위의 예제는 요청응답 구분을 하는 종별코드나 응답코드 필드가 헤더부에 있는 경우이다.

만약, 개별부에 에러 정보가 있다면 헤더부에서 한 방식과 같이 에러 정보를 생성하여 body에 저장한다.

전체 예제

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import bxi.api.ErrorResponseCreate;
import bxi.api.model.ErrorResponseCreateIn;
import bxi.api.model.ErrorResponseCreateOut;
import bxi.common.utility.StringUtil;

@Component
public class ErrorMessageCreate implements ErrorResponseCreate {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Override
public ErrorResponseCreateOut errorProcess(ErrorResponseCreateIn in) {
ErrorResponseCreateOut out = new ErrorResponseCreateOut();
out.setError(false);
out.setRspsCd("000");

// Lookup category code
String msgCbtpCd = getKindCode(in.getHeader());
if (StringUtil.isEmpty(msgCbtpCd)) {
out.setError(true);
return out;
}

// Generate error response message
out.setHeader(in.getHeader());
byte[] value = msgCbtpCd.getBytes();
value[2] = '1';
msgCbtpCd = new String(value);
out.getHeader().put("msgCbtpCd", msgCbtpCd);
if (in.isTimeout()) {
out.getHeader().put("rspsCd", "01");
} else if (in.isSendError()) {
out.getHeader().put("rspsCd", "02");
} else {
out.getHeader().put("rspsCd", in.getRspsCd());
}

if (logger.isDebugEnabled()) {
logger.debug("msgCbtpCd: {}", msgCbtpCd);
logger.debug("rspsCd: {}", out.getHeader().get("rspsCd"));
}

return out;
}

/**
* Lookup category code from the header
*
* @param header
* @return
*/
private String getKindCode(Map<String, Object> header) {
String msgCbtpCd = null;
try {
msgCbtpCd = (String) header.get("msgCbtpCd");
} catch (IllegalArgumentException ex) {
return null;
}
if (StringUtil.isEmpty(msgCbtpCd)) {
return null;
}

return msgCbtpCd;
}
}