로깅 개선 및 EAI 배치 가상 연동 작업 완료

This commit is contained in:
Rinjae
2025-10-16 15:02:35 +09:00
parent c204bbf106
commit f5e689fe51
10 changed files with 246 additions and 47 deletions
@@ -0,0 +1,112 @@
package com.eactive.ext.kjb.eai;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.nio.ByteBuffer;
@Slf4j
public class EaiBatchMessage {
@Getter
private String interfaceId = "";
@Getter
private String baseDate = "";
@Getter
private String count = "";
@Getter
private String resultCode = "";
@Getter
private String filename = "";
private String rawMessage = "";
private boolean isReadOnly = false;
private EaiBatchMessage() {}
public static EaiBatchMessage createRequest(String interfaceId, String filename) {
EaiBatchMessage message = new EaiBatchMessage();
message.interfaceId = interfaceId;
message.filename = filename;
return message;
}
public static EaiBatchMessage fromResponse(String rawMessage) {
EaiBatchMessage message = new EaiBatchMessage();
message.rawMessage = rawMessage;
message.isReadOnly = true;
if (rawMessage.length() >= 40) {
message.interfaceId = rawMessage.substring(0, 20).trim();
message.baseDate = rawMessage.substring(20, 28).trim();
message.count = rawMessage.substring(28, 38).trim();
message.resultCode = rawMessage.substring(38, 39).trim();
// filename 은 @@가 발견되면 이전 까지 trim / 발견되지 않으면 나머지 전체 그리고 trim
int endIdx = rawMessage.indexOf("@@", 39);
if (endIdx == -1) {
message.filename = rawMessage.substring(39).trim();
} else {
message.filename = rawMessage.substring(39, endIdx).trim();
}
}
if (StringUtils.isEmpty(message.interfaceId)) {
log.error("Invalid EAI Batch response message: interfaceId is empty. rawMessage={}", rawMessage);
throw new IllegalArgumentException("Invalid EAI Batch response message: interfaceId is empty");
}
return message;
}
@Override
public String toString() {
if (isReadOnly) {
return rawMessage;
} else {
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 0~19 : 인터페이스ID (20)
buffer.put(fixedString(interfaceId, 20));
// 19-8: 기준일자 (8)
buffer.put(fixedString(baseDate, 8));
// 27-10 : 건수 (10)
buffer.put(fixedString(count, 10));
// 37-1 : 결과코드 (1)
buffer.put(fixedString(resultCode, 1));
// 38-100 : 파일명 (100)
buffer.put(fixedString(filename, 100));
// 종료 구분자 (2)
buffer.put("@@".getBytes());
return new String(buffer.array()).trim();
}
}
private byte[] fixedString(String str, int length) {
if (str == null) {
str = "";
}
byte[] strBytes = str.getBytes();
byte[] result = new byte[length];
int copyLength = Math.min(strBytes.length, length);
System.arraycopy(strBytes, 0, result, 0, copyLength);
for (int i = copyLength; i < length; i++) {
result[i] = ' ';
}
return result;
}
}
@@ -0,0 +1,57 @@
package com.eactive.ext.kjb.eai;
import com.eactive.ext.kjb.common.KjbProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import javax.validation.constraints.NotNull;
import java.io.IOException;
@Slf4j
public class KjbEaiBatchModule {
private final KjbProperty property;
private final CloseableHttpClient httpClient;
public KjbEaiBatchModule(@NotNull KjbProperty property) {
if (property == null) {
throw new IllegalArgumentException("KjbProperty cannot be null");
}
this.property = property;
if (StringUtils.isNotEmpty(property.getEaiBatchUrl())) {
this.httpClient = HttpClients.createDefault();
} else {
this.httpClient = null;
log.warn("EAI_BATCH_URL 가 설정되지 않음. 실제 EAI 배치 연동 없이 동작함");
}
}
public EaiBatchMessage call(String interfaceId, String filename) throws IOException {
EaiBatchMessage reqMessage = EaiBatchMessage.createRequest(interfaceId, filename);
log.debug("EAI 배치 호출: {}", reqMessage);
if (this.httpClient != null) {
String url = property.getEaiBatchUrl() + "?eaibatMsg=" + reqMessage.toString();
final HttpGet httpGet = new HttpGet(url);
String message = httpClient.execute(httpGet, response -> EntityUtils.toString(response.getEntity(), "EUC-KR"));
EaiBatchMessage resMessage = EaiBatchMessage.fromResponse(message);
log.debug("EAI 배치 응답: {}", resMessage);
return resMessage;
} else {
log.info("EAI_BATCH_URL 이 설정되지 않아 실제 호출하지 않음. 요청 메시지: {}", reqMessage);
// 정상응답 리턴
EaiBatchMessage resMessage = EaiBatchMessage.fromResponse(String.format("%-20s%-8s%-10s%-1s%s@@", interfaceId, "", "0000000000", "1", "S:" + filename));
log.debug("EAI 배치 응답(모의): {}", resMessage);
return resMessage;
}
}
}