Compare commits

...

8 Commits

Author SHA1 Message Date
curry772 d79bcf8430 서브모듈 인덱스 업데이트 (elink-online-common)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 10:05:48 +09:00
curry772 e049420ca3 내부 오류 시 ERROR_CODE_AUTH_FAIL로 설정되는 현상 수정 2026-07-30 13:09:34 +09:00
curry772 10bbd57c78 서브모듈 인덱스 업데이트 2026-07-30 09:15:34 +09:00
curry772 70c636d719 API 거래 uuid(TRANSACTION_UUID) 앞 prefix에 GroupInstId 추가 2026-07-27 10:41:59 +09:00
curry772 1b37fc5e1b GUID 생성 시 node 번호를 -Dinst.Name값을 이용하도록 변경 2026-07-24 17:02:36 +09:00
curry772 9a730dc0b7 Test Filter 수신 메시지 JsonNode 지원 2026-07-24 17:01:54 +09:00
curry772 0ff2259f78 서브모듈 인덱스 갱신 (elink-online-common, elink-online-core,
elink-online-transformer)
2026-07-24 09:01:12 +09:00
curry772 8231318f14 version info 생성 기능 추가 2026-07-23 11:44:35 +09:00
11 changed files with 74 additions and 48 deletions
+1
View File
@@ -5,6 +5,7 @@ gradle.properties
src/main/generated
WebContent/generated
src/main/resources/version.info
# Eclipse #
.metadata
+48
View File
@@ -172,6 +172,54 @@ task initDirs() {
file(generatedJavaDir).mkdirs()
}
// version.info 를 classpath 리소스로 생성해 WAR의 WEB-INF/classes에 포함시킨다.
// elink-online-common 등 공유 라이브러리 모듈이 아니라, 실제 배포 아티팩트(eapim-online.war)를
// 만드는 이 루트 프로젝트에서 생성해야 "지금 배포된 게이트웨이가 정확히 어느 커밋인지"를
// eapim-online 소스 변경 여부와 무관하게 항상 최신으로 반영한다.
// ToolsController(/manage/tools/version, elink-online-common 모듈)는 이 파일을
// Class.getResourceAsStream("/version.info")로 읽는데, WAR는 WEB-INF/classes와
// WEB-INF/lib 전체가 하나의 클래스로더를 공유하므로 어느 모듈의 클래스에서 조회하든 찾을 수 있다.
//
// elink-online-common/elink-online-core/... 는 별도 저장소를 참조하는 git submodule이라
// 루트(eapim-online)의 describe/dirty 만으로는 "어느 서브모듈이 바뀌었는지"를 알 수 없다
// (서브모듈 포인터가 커밋되고 나면 루트는 다시 clean 해져서 -dirty 흔적도 사라진다).
// 그래서 서브모듈 각각에 대해서도 describe를 실행해 module.<이름>=<결과> 형식으로 함께 기록한다.
def describeGit(File dir) {
try {
def proc = "git describe --tags --always --dirty".execute(null, dir)
// proc.text는 JVM/OS 기본 charset(Windows 환경에선 CP949 등)으로 stdout을 디코딩한다.
// git 태그명은 UTF-8 바이트이므로 기본 charset이 UTF-8이 아니면 여기서 한글이 깨진다.
// stream을 명시적으로 UTF-8로 읽어서 이 문제를 피한다.
def output = proc.inputStream.getText("UTF-8")
proc.waitFor()
return (proc.exitValue() == 0) ? output.trim() : "unknown"
} catch (Exception e) {
logger.warn("${dir} git describe 실행 불가, unknown 으로 대체: ${e.message}")
return "unknown"
}
}
task generateVersionInfo {
doLast {
def gitVersion = describeGit(projectDir)
def sb = new StringBuilder()
sb.append("version=${gitVersion}\n")
sb.append("buildTime=${new Date().format("yyyy-MM-dd HH:mm:ss")}\n")
subprojects.sort { it.name }.each { sub ->
if (file("${sub.projectDir}/.git").exists()) {
sb.append("module.${sub.name}=${describeGit(sub.projectDir)}\n")
}
}
def versionInfoFile = file("$projectDir/src/main/resources/version.info")
versionInfoFile.parentFile.mkdirs()
versionInfoFile.write(sb.toString(), "UTF-8")
}
}
processResources.dependsOn generateVersionInfo
eclipse {
wtp {
component {
@@ -50,7 +50,8 @@ public class DJBApiAdapterController implements HttpAdapterServiceKey {
@Autowired
DJBApiAdapterService service;
EAIServerManager eaiServerManager;
/**
* DJErp OAuth 조기 적용을 위한 Controller
*
@@ -89,7 +90,13 @@ public class DJBApiAdapterController implements HttpAdapterServiceKey {
ResponseEntity<String> responseEntity = null;
Properties transactionProp = new Properties();
String uuid = UUIDGenerator.getUUID().toString().replaceAll("-", "");
if(eaiServerManager == null)
eaiServerManager = EAIServerManager.getInstance();
String instid = eaiServerManager.getGroupInstId();
String uuid = instid+UUIDGenerator.getUUID().toString().replaceAll("-", "");
transactionProp.setProperty(TransactionContextKeys.TRANSACTION_UUID, uuid);
transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeStr);
@@ -154,14 +161,14 @@ public class DJBApiAdapterController implements HttpAdapterServiceKey {
responseEntity = ResponseEntity.status(e1.getStatus()).contentType(mediaType).body(responseErrorMsg);
} else if (e instanceof JwtAuthException) {
responseErrorMsg = genErrorResponseMessage(adapterGroupName, adapterName,
transactionProp, MessageUtil.ERROR_CODE_AP_ERROR, e, adptMsgType, encode, errorResponseFormat);
transactionProp, MessageUtil.ERROR_CODE_AUTH_FAIL, e, adptMsgType, encode, errorResponseFormat);
JwtAuthException e1 = (JwtAuthException) e;
this.logError(servletRequest, adapterGroupName, e1.getCode(), responseErrorMsg, transactionProp, e);
logger.error("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e);
responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).contentType(mediaType).body(responseErrorMsg);
} else if (e instanceof HttpStatusException) {
responseErrorMsg = genErrorResponseMessage(adapterGroupName, adapterName,
transactionProp, MessageUtil.ERROR_CODE_AUTH_FAIL, e, adptMsgType, encode, errorResponseFormat);
transactionProp, MessageUtil.ERROR_CODE_AP_ERROR, e, adptMsgType, encode, errorResponseFormat);
logger.error("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage());
HttpStatusException e1 = (HttpStatusException) e;
responseEntity = ResponseEntity.status(e1.getStatus()).contentType(mediaType).body(responseErrorMsg);
@@ -6,7 +6,6 @@ import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.springframework.http.HttpStatus;
import com.eactive.eai.adapter.http.dynamic.filter.FilterException;
@@ -16,6 +15,7 @@ import com.eactive.eai.common.security.ARIACryptoModuleExtension;
import com.eactive.eai.common.security.CryptoModuleExtension;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.util.HexaConverter;
import com.eactive.eai.util.JsonPathUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -30,17 +30,8 @@ public class DecrytTestFilter implements HttpAdapterFilter {
public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop,
HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
ObjectNode rootNode = null;
String jsonStr = null;
if (message instanceof String) {
jsonStr = (String) message;
} else if (message instanceof JSONObject) {
jsonStr = ((JSONObject) message).toJSONString();
} else {
return message;
}
rootNode = (ObjectNode) OBJECT_MAPPER.readTree(jsonStr);
ObjectNode rootNode = (ObjectNode)JsonPathUtil.toTree(message);
JsonNode alg = rootNode.get("alg");
JsonNode mode = rootNode.get("mode");
JsonNode padding = rootNode.get("padding");
@@ -8,7 +8,6 @@ import javax.crypto.SecretKey;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.springframework.http.HttpStatus;
import com.eactive.eai.adapter.http.dynamic.filter.FilterException;
@@ -19,6 +18,7 @@ import com.eactive.eai.common.security.ARIACryptoModuleExtension;
import com.eactive.eai.common.security.CryptoModuleExtension;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.util.HexaConverter;
import com.eactive.eai.util.JsonPathUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -33,20 +33,8 @@ public class EncrytTestFilter implements HttpAdapterFilter {
public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop,
HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
ObjectNode rootNode = null;
String jsonStr = null;
if (message instanceof String) {
jsonStr = (String) message;
} else if (message instanceof ObjectNode) {
rootNode = (ObjectNode) message;
} else if (message instanceof JSONObject) {
jsonStr = ((JSONObject) message).toJSONString();
} else {
return message;
}
if(rootNode == null)
rootNode = (ObjectNode) OBJECT_MAPPER.readTree(jsonStr);
ObjectNode rootNode = (ObjectNode)JsonPathUtil.toTree(message);
// 1. HSM에서 키 가져오기
byte[] hsmKeyBytes = null;
JsonNode hsmKeyAlias = rootNode.get("hsmKeyAlias");
@@ -8,7 +8,6 @@ import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONObject;
import org.springframework.http.HttpStatus;
import com.eactive.eai.adapter.http.dynamic.filter.FilterException;
@@ -18,6 +17,7 @@ import com.eactive.eai.common.util.Logger;
import com.eactive.eai.custom.common.security.keyderiv.HsmContextSha256KeyDerivationStrategy;
import com.eactive.eai.custom.common.security.keyderiv.HsmKeyAndIvSliceDerivationStrategy;
import com.eactive.eai.util.HexaConverter;
import com.eactive.eai.util.JsonPathUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -32,17 +32,8 @@ public class GenKeyFilter implements HttpAdapterFilter {
public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop,
HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
ObjectNode rootNode = null;
String jsonStr = null;
if (message instanceof String) {
jsonStr = (String) message;
} else if (message instanceof JSONObject) {
jsonStr = ((JSONObject) message).toJSONString();
} else {
return message;
}
rootNode = (ObjectNode) OBJECT_MAPPER.readTree(jsonStr);
ObjectNode rootNode = (ObjectNode)JsonPathUtil.toTree(message);
JsonNode hsmKey = rootNode.get("hsmKey");
JsonNode hsmIv = rootNode.get("hsmIv");
JsonNode contextKey = rootNode.get("contextKey");
@@ -28,7 +28,7 @@ public final class GUIDGeneratorDJB {
static {
// 노드번호(2): 서버명 마지막 2자리, 없으면 "00"
String serverName = System.getProperty("server.key", "");
String serverName = System.getProperty(com.eactive.eai.common.server.Keys.SERVER_KEY, "");
if (serverName.length() >= 2) {
NODE_NO = serverName.substring(serverName.length() - 2);
} else {