본문으로 건너뛰기

Bx Client

Bx Client는 전문을 생성해서 HTTP 거래를 요청하는 모듈이다.

필요 요소

본 모듈을 사용하기 위해서 필요한 파일은 아래와 같다.

파일명설명
bxi.client.jarcallEai 메서드를 포함하고있는라이브러리 파일
bxiClient.yml전문을 만들기 위한 헤더정보와 url리스트가 있는 파일
log4j2.xml로깅 처리를 위한 설정파일
etcbxi.client.jar가 동작하기 위한 3dr Party 라이브러리 파일

환경설정

본 모듈을 실행하기 위해서는 bxiClient.yml 설정이 필요하다. 또한, log4j2.xml 파일을 지정하지 않으면 로그가 남지않으므로 설정을 권장한다.

1. bxiClient.yml설정

bxi.client.jar실행 시 -Dbxi.clientYml={파일경로}/bxi.client.yml옵션을 추가한다.

bxiClient.yml
header:
stdMsgLen:
stdMsgVer:
guid: 2
guidSeq:
fstGuid:
trtInstCd:
msgClssCd: 3
itfcId: 1
errCd:
name:
header.root.element.name: "EduSystemHeader"
body.root.element.name: "APtoDBreq"
url:
- "http://123.123.123.44:32310"
- "http://123.123.123.44:14382/eai"
- "http://123.123.123.44:13020"
  • header : eai에 등록된 표준전문헤더 레이아웃 및 그 값들 중 입력받고자 하는 순서를 의미한다. 위를 예로들어, 표준전문헤더에는 stdMsgLen, stdMsgVer ... errCd 등의 항목이 정의되어 있지만, 그 중 itfcId, guid, msgClssCd만 순서대로 입력값을 줄 수 있다. 숫자는 순서를 나타내므로 중복이 되어서는 안된다.
  • name : header.root.element.name는 헤더의 루트엘리먼트명을 의미하고, body.root.element.name는 바디의 루트엘리먼트명을 의미한다. yml파일의 엘리먼트명을 사용하지않고, callEai호출시 파라미터에 넣어서 지정할 수도 있다.
  • url : 요청할 endpoint url를 의미한다. 리스트로 지정해야하며, Round Robin방식으로 순서대로 부하를 분산한다.

해당 값들은 동적으로 변경가능하다. 예를 들어 url포트를 변경하면, 다음 요청부터는 변경한 포트로 HTTP를 요청한다.

주의

상위 'header', 'name', 'url' 명칭은 변경하지않는다.

2. log4j2.xml설정

bxi.client.jar실행 시 -Dlog4j.configurationFile={파일경로}/log4j2.xml옵션을 추가한다.

사용방법

본 모듈을 callEai()메소드를 호출하는것으로 사용가능하다.

☑ Map으로 헤더정보를 전달하면서 yml파일의 엘리먼트명을 사용하는 경우의 예제

Map<String, Object> headerMap = new HashMap<>();
headerMap.put("itfcId", "AP_TO_DB_INTERFACE03");
headerMap.put("guid", "3d321690fbb145f993780bc51d9f2c59");
headerMap.put("msgClssCd", "S");

Map<String, Object> resultMap = BxiHttpSender.callEai(bodyMap, headerMap);
if (resultMap != null) {
// TODO : 정상처리. 헤더바디 추출가능
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : 에러처리(404, 500 등으로 응답메시지를 받지못한상황). 사이트별로 커스터마이징 필수
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements); // yml정보를 읽어서 헤더를 만들어주는 메서드
header.put("errCd", "ERROR");
...
}

☑ Map으로 헤더정보를 전달하면서 엘리먼트명을 직접 전달하는 예제

Map<String, Object> headerMap = new HashMap<>();
headerMap.put("itfcId", "AP_TO_DB_INTERFACE03");
headerMap.put("guid", "3d321690fbb145f993780bc51d9f2c59");
headerMap.put("msgClssCd", "S");

Map<String, Object> resultMap = BxiHttpSender.callEai("바디명", bodyMap, "헤더명", headerMap);
if (resultMap != null) {
// TODO : 정상처리. 헤더바디 추출가능
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : 에러처리(404, 500 등으로 응답메시지를 받지못한상황). 사이트별로 커스터마이징 필수
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements); // yml정보를 읽어서 헤더를 만들어주는 메서드
header.put("errCd", "ERROR");
...
}

☑ Object로 헤더정보를 전달하면서 엘리먼트명을 직접 전달하는 예제

Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> resultMap = BxiHttpSender.callEai("바디명", bodyMap, "헤더명", headerElements);
if (resultMap != null) {
// TODO : 정상처리. 헤더바디 추출가능
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : 에러처리(404, 500 등으로 응답메시지를 받지못한상황). 사이트별로 커스터마이징 필수
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

☑ Object로 헤더정보를 전달하면서 yml파일의 엘리먼트명을 사용하는 예제

Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> resultMap = BxiHttpSender.callEai(bodyMap, headerElements);
if (resultMap != null) {
// TODO : 정상처리. 헤더바디 추출가능
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : 에러처리(404, 500 등으로 응답메시지를 받지못한상황). 사이트별로 커스터마이징 필수
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

☑ Wrapper로 감싸는 예제

class BxiClientWrapper {
public Map<String, Object> callEai(Map<String, Object> bodyMap, String intrfcId, String msgClssCd) {
return BxiHttpSender.callEai(bodyMap, new Object[] { intrfcId, makeGuid(), msgClssCd });
}

// TODO : 사이트별 GUID 생성
public String makeGuid() {
return "3d321690fbb145f993780bc51d9f2c59";
}
}

BxiClientWrapper wrapper = new BxiClientWrapper();
Map<String, Object> resultMap = wrapper.callEai(bodyMap, "AP_TO_DB_INTERFACE03", "S");
if (resultMap != null) {
// TODO : 정상처리. 헤더바디 추출가능
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : 에러처리(404, 500 등으로 응답메시지를 받지못한상황). 사이트별로 커스터마이징 필수
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

위 예제처럼 callEai()를 호출했을때, EAI에 요청하는 전문은 아래와 같다

url : http://123.123.123.44:32310
body : {
"EduSystemHeader":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"APtoDBreq":{
"password":"123",
"name":"abc",
"id":"9999"
}
// 엘리먼트명을 yml파일에서 읽지않고 직접 파라미터에 넣어줬을때는 아래와 같다.
body : {
"헤더명":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"바디명":{
"password":"123",
"name":"abc",
"id":"9999"
}
}

한번 더 호출했을때, url은 Round Robin방식으로 다음 url에 http를 요청한다

url : http://123.123.123.44:14382/eai
body : {
"EduSystemHeader":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"APtoDBreq":{
"password":"123",
"name":"abc",
"id":"9999"
}
}