Bx Client
Bx Client는 전문을 생성해서 HTTP 거래를 요청하는 모듈이다.
1. 필요 요소
본 모듈을 사용하기 위해서 필요한 파일은 아래와 같다.
| 파일명 | 설명 |
|---|---|
bxi.client.jar |
callEai 메서드를 포함하고있는 라이브러리 파일 |
bxiClient.yml |
전문을 만들기 위한 헤더정보와 URL 리스트가 있는 파일 |
log4j2.xml |
로깅 처리를 위한 설정 파일 |
etc |
bxi.client.jar가 동작하기 위한 3dr Party 라이브러리 파일 |
2. 환경설정
본 모듈을 실행하기 위해서는 bxiClient.yml 설정이 필요하다. 또한, log4j2.xml 파일을 지정하지 않으면 로그가 남지않으므로 설정을 권장한다.
2.1. bxiClient.yml 설정
bxi.client.jar 실행 시 -Dbxi.clientYml={파일경로}/bxi.client.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을 의미한다. 리스트로 지정해야하며, 라운드 로빈 방식으로 부하를 분산한다.
해당 값들은 동적으로 변경가능하다. 예를 들어 url의 포트를 변경하면, 다음 요청부터는 변경한 포트로 HTTP를 요청한다.
|
상위 'header', 'name', 'url' 명칭은 변경하지않는다. |
3. 사용방법
본 모듈을 callEai() 메소드를 호출하는것으로 사용가능하다.
3.1. 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");
...
}
3.2. 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");
...
}
3.3. 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");
...
}
3.4. 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");
...
}
3.5. 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은 라운드 로빈 방식으로 다음 url에 요청한다
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"
}
}