From c95b946449fe764f7b961d660c4366cca31ce06b Mon Sep 17 00:00:00 2001 From: jade Date: Tue, 11 Aug 2026 18:10:01 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=84=EC=9A=94=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=ED=91=B8=EC=89=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connector/ExternalApiConnector.java | 72 ------------------ .../connector/InternalSystemConnector.java | 74 ------------------- .../adapter/connector/LegacyDbConnector.java | 58 --------------- .../ThirdPartySecurityConnector.java | 71 ------------------ 4 files changed, 275 deletions(-) delete mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ExternalApiConnector.java delete mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/InternalSystemConnector.java delete mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/LegacyDbConnector.java delete mode 100644 dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ThirdPartySecurityConnector.java diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ExternalApiConnector.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ExternalApiConnector.java deleted file mode 100644 index cf8b0bb0..00000000 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ExternalApiConnector.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.shinhanlife.dap.lib.adapter.connector; - -import io.shinhanlife.dap.lib.adapter.support.DynamicPayloadBuilder; -import io.shinhanlife.dap.lib.adapter.support.DynamicSchemaValidator; -import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; -import io.github.resilience4j.ratelimiter.annotation.RateLimiter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestClient; -import java.util.Map; -import java.util.List; - -/** - * @package io.shinhanlife.dap.lib.adapter.connector - * @className ExternalApiConnector - * @description AX HUB 시스템 처리 클래스 - * @author 0986406 - * @create 2026.09.01 - *
- * ---------- 개정이력 ----------
- * 수정일      수정자    수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01  0986406    최초생성
- * 
- * 
- */ -@Slf4j -@Service -public class ExternalApiConnector { - - private final RestClient restClient; - private final DynamicSchemaValidator schemaValidator; - private final DynamicPayloadBuilder payloadBuilder; - - public ExternalApiConnector(DynamicSchemaValidator schemaValidator, DynamicPayloadBuilder payloadBuilder) { - this.restClient = RestClient.create(); - this.schemaValidator = schemaValidator; - this.payloadBuilder = payloadBuilder; - } - - @RateLimiter(name = "externalApi", fallbackMethod = "fallbackForExternalApi") - @CircuitBreaker(name = "externalApi", fallbackMethod = "fallbackForExternalApi") - public String callExternalApi(String apiName, String endpoint, Map data, List> spec, boolean isFixedLength) throws Exception { - - // 1. 요청 데이터 검증 (errorLog 전달하여 구체적 에러 포착) - StringBuilder errorLog = new StringBuilder(); - if (!schemaValidator.validate(spec, data, errorLog)) { - String errorMsg = "API 요청 데이터 스키마 불일치 [" + apiName + "]: " + errorLog.toString(); - log.error(" {}", errorMsg); - throw new IllegalArgumentException(errorMsg); - } - - // 2. 페이로드 빌드 - Object payload = isFixedLength ? payloadBuilder.buildFixedLengthString(spec, data) : data; - String contentType = isFixedLength ? "application/x-www-form-urlencoded;charset=EUC-KR" : "application/json"; - - log.info(" 외부 API 호출 [{}] 시작 (FixedLength: {})", apiName, isFixedLength); - - return restClient.post() - .uri(endpoint) - .contentType(MediaType.parseMediaType(contentType)) - .body(payload) - .retrieve() - .body(String.class); - } - - public String fallbackForExternalApi(String apiName, String endpoint, Map data, List> spec, boolean isFixedLength, Throwable t) { - log.error(" [외부 API 장애] {} 호출 실패: {}", apiName, t.getMessage()); - return String.format("{\"status\":\"EXTERNAL_API_ERROR\", \"message\":\"외부 서비스 연동 중 오류 발생: %s\"}", t.getMessage()); - } -} \ No newline at end of file diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/InternalSystemConnector.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/InternalSystemConnector.java deleted file mode 100644 index 17a7144d..00000000 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/InternalSystemConnector.java +++ /dev/null @@ -1,74 +0,0 @@ -package io.shinhanlife.dap.lib.adapter.connector; - -import io.shinhanlife.dap.lib.adapter.support.DynamicPayloadBuilder; -import io.shinhanlife.dap.lib.adapter.support.DynamicSchemaValidator; -import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; -import io.github.resilience4j.ratelimiter.annotation.RateLimiter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestClient; -import java.util.Map; -import java.util.List; - -/** - * @package io.shinhanlife.dap.lib.adapter.connector - * @className InternalSystemConnector - * @description AX HUB 시스템 처리 클래스 - * @author 0986406 - * @create 2026.09.01 - *
- * ---------- 개정이력 ----------
- * 수정일      수정자    수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01  0986406    최초생성
- * 
- * 
- */ -@Slf4j -@Service -public class InternalSystemConnector { - - private final RestClient restClient; - private final DynamicSchemaValidator schemaValidator; - private final DynamicPayloadBuilder payloadBuilder; - - // 생성자를 통한 의존성 주입 (Spring이 알아서 Validator와 Builder를 넣어줍니다) - public InternalSystemConnector(DynamicSchemaValidator schemaValidator, DynamicPayloadBuilder payloadBuilder) { - this.restClient = RestClient.create(); - this.schemaValidator = schemaValidator; - this.payloadBuilder = payloadBuilder; - } - - @RateLimiter(name = "internalSystem", fallbackMethod = "fallbackForInternal") - @CircuitBreaker(name = "internalSystem", fallbackMethod = "fallbackForInternal") - public String callInternalSystem(String targetName, String endpoint, Map data, List> spec, boolean isFixedLength) throws Exception { - - // 1. 요청 데이터 검증 (errorLog 전달하여 구체적 에러 포착) - StringBuilder errorLog = new StringBuilder(); - if (!schemaValidator.validate(spec, data, errorLog)) { - String errorMsg = "대내외 시스템 연계 데이터 스키마 불일치 [" + targetName + "]: " + errorLog.toString(); - log.error(" {}", errorMsg); - throw new IllegalArgumentException(errorMsg); - } - - // 2. 페이로드 빌드 (고정장 vs JSON) - Object payload = isFixedLength ? payloadBuilder.buildFixedLengthString(spec, data) : data; - String contentType = isFixedLength ? "application/x-www-form-urlencoded;charset=EUC-KR" : "application/json"; - - log.info(" 대내외 시스템 호출 [{}] 시작 (FixedLength: {})", targetName, isFixedLength); - - return restClient.post() - .uri(endpoint) - .contentType(MediaType.parseMediaType(contentType)) - .body(payload) - .retrieve() - .body(String.class); - } - - // 통신 장애(CircuitBreaker) 또는 허용량 초과(RateLimiter) 시 처리 로직 - public String fallbackForInternal(String targetName, String endpoint, Map data, List> spec, boolean isFixedLength, Throwable t) { - log.error(" [대내외 시스템 장애/지연] {} 연계 실패: {}", targetName, t.getMessage()); - return String.format("{\"status\":\"INTERNAL_SYSTEM_ERROR\", \"message\":\"대내외 연계 시스템 호출 중 오류가 발생했거나 요청이 지연되었습니다. 사유: %s\"}", t.getMessage()); - } -} \ No newline at end of file diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/LegacyDbConnector.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/LegacyDbConnector.java deleted file mode 100644 index d572c8c6..00000000 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/LegacyDbConnector.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.shinhanlife.dap.lib.adapter.connector; - -import io.shinhanlife.dap.lib.adapter.support.ResultStandardizer; -import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; -import io.github.resilience4j.ratelimiter.annotation.RateLimiter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @package io.shinhanlife.dap.lib.adapter.connector - * @className LegacyDbConnector - * @description AX HUB 시스템 처리 클래스 - * @author 0986406 - * @create 2026.09.01 - *
- * ---------- 개정이력 ----------
- * 수정일      수정자    수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01  0986406    최초생성
- * 
- * 
- */ -@Slf4j -@Service -@RequiredArgsConstructor -public class LegacyDbConnector { - - private final NamedParameterJdbcTemplate jdbcTemplate; // 동적 파라미터 바인딩을 위한 템플릿 - private final ResultStandardizer resultStandardizer; - - @RateLimiter(name = "legacyDb", fallbackMethod = "fallbackForDb") - @CircuitBreaker(name = "legacyDb", fallbackMethod = "fallbackForDb") - public List> executeDynamicQuery(String queryId, String sql, Map params) { - log.info(" Legacy DB 조회 시작 [QueryID: {}]", queryId); - - // 1. SQL 쿼리 실행 (오라클 등) - List> rawResults = jdbcTemplate.queryForList(sql, params); - - // 2. 스키마 매핑 및 결과 정형화 (대문자 -> 카멜케이스 변환) - List> standardResults = rawResults.stream() - .map(resultStandardizer::standardize) - .collect(Collectors.toList()); - - log.info(" Legacy DB 조회 완료 ({}건 반환)", standardResults.size()); - return standardResults; - } - - public List> fallbackForDb(String queryId, String sql, Map params, Throwable t) { - log.error(" [Legacy DB 장애/지연] 쿼리 실행 실패 [{}]: {}", queryId, t.getMessage()); - throw new RuntimeException("레거시 DB 연동 중 오류가 발생했습니다. (QueryID: " + queryId + ")"); - } -} \ No newline at end of file diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ThirdPartySecurityConnector.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ThirdPartySecurityConnector.java deleted file mode 100644 index 3c70a697..00000000 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/connector/ThirdPartySecurityConnector.java +++ /dev/null @@ -1,71 +0,0 @@ -package io.shinhanlife.dap.lib.adapter.connector; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - * @package io.shinhanlife.dap.lib.adapter.connector - * @className ThirdPartySecurityConnector - * @description AX HUB 시스템 처리 클래스 - * @author 0986406 - * @create 2026.09.01 - *
- * ---------- 개정이력 ----------
- * 수정일      수정자    수정내용
- * ---------- -------- ---------------------------
- * 2026.09.01  0986406    최초생성
- * 
- * 
- */ -@Slf4j -@Service -@RequiredArgsConstructor -public class ThirdPartySecurityConnector { - - private final ObjectMapper jsonMapper; - - /** - * 3rd Party 보안 모듈(DRM, BM 등)과 연동하기 위한 전용 메서드입니다. - */ - public String executeSecurityModule(String interfaceId, Map data) throws Exception { - log.info(" [3rd Party Security] 보안 모듈 연동 시작 - Interface: {}", interfaceId); - - // 보안 모듈 통신을 위한 특수 페이로드 조립 (예시) - // 실제로는 RestClient나 WebClient를 통해 보안 VM의 전용 엔드포인트로 호출합니다. - - String resultJson; - - if (interfaceId.startsWith("DRM_")) { - log.info(" [DRM 처리] 내부 문서 암/복호화 모듈과 통신 중..."); - resultJson = jsonMapper.writeValueAsString(Map.of( - "status", "SUCCESS", - "module", "DRM", - "message", "문서 보안 처리가 완료되었습니다.", - "interfaceId", interfaceId, - "data", data != null ? data : Map.of() - )); - } else if (interfaceId.startsWith("BM_")) { - log.info(" [BM 처리] 바이오 인증 모듈과 통신 중..."); - resultJson = jsonMapper.writeValueAsString(Map.of( - "status", "SUCCESS", - "module", "Bio-Metric", - "message", "바이오 인증이 완료되었습니다.", - "interfaceId", interfaceId, - "data", data != null ? data : Map.of() - )); - } else { - log.warn(" 알 수 없는 보안 모듈 연동 요청: {}", interfaceId); - resultJson = jsonMapper.writeValueAsString(Map.of( - "status", "UNKNOWN_MODULE", - "message", "알 수 없는 보안 모듈 인터페이스입니다." - )); - } - - log.info(" [3rd Party Security] 보안 모듈 처리 완료"); - return resultJson; - } -} \ No newline at end of file