diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml
index 371f6224..c6b095f9 100644
--- a/.gitea/workflows/deploy.yml
+++ b/.gitea/workflows/deploy.yml
@@ -22,7 +22,7 @@ jobs:
- name: Deploy Task on Host
run: |
- echo "Starting Standard CI/CD Deploy pipeline..."
+ echo "Starting Blue-Green CI/CD Deploy pipeline..."
# 1. gradle 공식 이미지로 바로 컴파일 빌드!
docker run --rm \
@@ -36,22 +36,59 @@ jobs:
# 2. 빌드 결과 plain jar 아카이브 정리
find /app -name "*-plain.jar" -delete
- # 3. 좀비 컨테이너 청소 (현재 우리가 쓸 포트를 점유 중인 옛날 컨테이너들만 정확히 색출해서 사살)
- echo "Finding and killing zombie containers holding our ports..."
- for port in 6379 8080 8089 8281 8282 8283 8284 8285 8288; do
- cid=$(docker ps -q --filter "publish=$port")
- if [ ! -z "$cid" ]; then
- echo "Force killing container $cid using port $port"
- docker rm -f $cid
- fi
- done
-
- # 4. 마운트된 /app 디렉토리로 이동하여 호스트의 도커 컴포즈 제어!
cd /app
- docker system prune -f
- ACTIVE_PROFILE=dev docker compose up -d --build gateway redis mci-mock dozzle tool-sms tool-email tool-other tool-payment
- # 4. 배포 후 대롱대롱 매달려 있는 가비지 이미지 자동 소거 청소!
+ # 3. 블루/그린 타겟 식별
+ IS_BLUE_RUNNING=$(docker ps --filter "name=ax_hub_mcp_tool-gateway-blue-1" --filter "status=running" -q)
+
+ if [ ! -z "$IS_BLUE_RUNNING" ]; then
+ echo "Current active color is BLUE. Deploying to GREEN..."
+ TARGET="green"
+ OLD_TARGET="blue"
+ else
+ echo "Current active color is GREEN (or none). Deploying to BLUE..."
+ TARGET="blue"
+ OLD_TARGET="green"
+ fi
+
+ # 공통 인프라 (DB, Redis 등) 띄우기
+ ACTIVE_PROFILE=dev docker compose up -d redis mci-mock dozzle nginx
+
+ # 4. 신규 버전(TARGET) 컨테이너 기동
+ echo "Building and starting $TARGET containers..."
+ ACTIVE_PROFILE=dev docker compose up -d --build \
+ gateway-$TARGET \
+ tool-sms-$TARGET \
+ tool-email-$TARGET \
+ tool-other-$TARGET \
+ tool-payment-$TARGET
+
+ # 5. 헬스 체크 대기 (Spring Boot 기동 시간 확보)
+ echo "Waiting 30 seconds for Spring Boot to start..."
+ sleep 30
+
+ # 신규 컨테이너가 죽지 않고 살아있는지 확인
+ IS_TARGET_ALIVE=$(docker ps --filter "name=ax_hub_mcp_tool-gateway-${TARGET}-1" --filter "status=running" -q)
+
+ if [ -z "$IS_TARGET_ALIVE" ]; then
+ echo "Health Check Failed! $TARGET container crashed. Rollback."
+ echo "Stopping failed $TARGET containers..."
+ docker compose stop gateway-$TARGET tool-sms-$TARGET tool-email-$TARGET tool-other-$TARGET tool-payment-$TARGET
+ exit 1 # 파이프라인 실패 처리 (구버전은 그대로 유지됨)
+ fi
+
+ # 6. 트래픽 전환 (Nginx 설정 스위칭)
+ echo "Health Check Passed! Switching traffic to $TARGET..."
+ mkdir -p ./nginx/conf.d
+ cp ./nginx/${TARGET}.conf ./nginx/conf.d/default.conf
+ docker compose exec -T nginx nginx -s reload
+
+ # 7. 구버전 종료
+ echo "Traffic switched. Stopping old $OLD_TARGET containers..."
+ docker compose stop gateway-$OLD_TARGET tool-sms-$OLD_TARGET tool-email-$OLD_TARGET tool-other-$OLD_TARGET tool-payment-$OLD_TARGET
+
+ # 가비지 청소
+ docker system prune -f
docker image prune -f
- echo "CI/CD Deploy Success!"
+ echo "Blue-Green CI/CD Deploy Success! Currently running: $TARGET"
diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java
index 5d431e20..05acd3e3 100644
--- a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java
+++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java
@@ -8,6 +8,7 @@ import io.shinhanlife.glow.communication.dto.HeaderDefaults;
import io.shinhanlife.glow.communication.dto.Transfer;
import io.shinhanlife.glow.communication.module.mci.component.GlowMciComponent;
import io.shinhanlife.glow.communication.util.CommonHeaderFactory;
+import io.shinhanlife.dap.common.integration.mci.enums.IndvCtinRoleTyp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -56,7 +57,7 @@ public class AxhubMciComponent {
commonHeaderMap.put(HeaderDefaults.SCRN_ID, sessionDto.getPrgrId());
}
- commonHeaderMap.put(HeaderDefaults.INDV_CTIN_ROLE_CD, io.shinhanlife.dap.common.integration.mci.enums.IndvCtinRoleTyp.CD_Z99.getCode());
+ commonHeaderMap.put(HeaderDefaults.INDV_CTIN_ROLE_CD, IndvCtinRoleTyp.CD_Z99.getCode());
commonHeaderMap.put(HeaderDefaults.TGRM_CREA_CHNN_TYPE_CD, TGRM_CREA_CHNN_TYPE_CD_1);
if (communicationProperties != null && communicationProperties.getCommon() != null) {
diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/infra/itrf/mci/cfp/a/io/MciCfpaClient.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/infra/itrf/mci/cfp/a/io/MciCfpaClient.java
new file mode 100644
index 00000000..5802e42c
--- /dev/null
+++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/dapmt/infra/itrf/mci/cfp/a/io/MciCfpaClient.java
@@ -0,0 +1,69 @@
+package io.shinhanlife.dap.dapmt.infra.itrf.mci.cfp.a.io;
+
+import io.shinhanlife.dap.common.integration.mci.component.AxhubMciComponent;
+import io.shinhanlife.dap.dapmt.dto.Onnba3011Req;
+import io.shinhanlife.glow.communication.dto.Transfer;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @package io.shinhanlife.dap.dapmt.infra.itrf.mci.cfp.a.io
+ * @className MciCfpaClient
+ * @description 보장분석결과조회 MCI 호출 클라이언트
+ * @author 0986406
+ * @create 2026.09.01
+ *
+ * ---------- 개정이력 ----------
+ * 수정일 수정자 수정내용
+ * ---------- -------- ---------------------------
+ * 2026.09.01 0986406 최초생성
+ *
+ *
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class MciCfpaClient {
+
+ private final AxhubMciComponent mci;
+
+ // 인터페이스 코드 상수
+ private static final String INTERFACE_CODE = "CLCNNB00001"; // CLCCFP00001 (Onnba용 코드 유지)
+
+ // 정상 응답 코드 상수
+ private static final String SUCCESS_CODE_COM = "COM00139";
+ private static final String SUCCESS_CODE_CFP = "CFP00000";
+ private static final String NO_DATA_CODE = "COM00150";
+
+ // 예외 코드 상수
+ private static final String ERROR_CODE_PROCESS = "CLC00007";
+ private static final String ERROR_CODE_MESSAGE = "CLC00043";
+
+ /**
+ * 보장분석결과조회
+ *
+ * @param inDto 입력 DTO
+ * @return 출력 객체
+ */
+ public Object callCfpa0001(Onnba3011Req inDto) throws Exception {
+ // 인터페이스 호출
+ Transfer