From 87249a621c6d66e82269d7508c5ce3a9bdcdc339 Mon Sep 17 00:00:00 2001 From: jade Date: Tue, 25 Aug 2026 17:42:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ersonalCustomerDetailInquiryConverter.java | 19 ----- ...RecruitmentFeeDisclosureDataConverter.java | 18 +++++ .../PersonalCustomerDetailInquiryRequest.java | 26 ------- ...PersonalCustomerDetailInquiryResponse.java | 35 ---------- .../RecruitmentFeeDisclosureDataRequest.java | 32 +++++++++ .../RecruitmentFeeDisclosureDataResponse.java | 40 +++++++++++ .../PersonalCustomerDetailInquiryUseCase.java | 41 ----------- .../RecruitmentFeeDisclosureDataUseCase.java | 41 +++++++++++ ...sonalCustomerDetailInquiryUseCaseImpl.java | 8 --- ...cruitmentFeeDisclosureDataUseCaseImpl.java | 69 +++++++++++++++++++ .../i/MciNbtiClient.java} | 8 +-- .../infra/itrf/mci/nbt/i/io/ONBTI2370_I.java | 30 ++++++++ .../infra/itrf/mci/nbt/i/io/ONBTI2370_O.java | 39 +++++++++++ .../itrf/mci/ncs/c/io/DATNCSO00001_I.java | 24 ------- .../itrf/mci/ncs/c/io/DATNCSO00001_O.java | 33 --------- .../mock-responses/pro_recruitment_data.json | 6 ++ ...sonalCustomerDetailInquiryUseCaseTest.java | 2 - ...cruitmentFeeDisclosureDataUseCaseTest.java | 16 +++++ 18 files changed, 295 insertions(+), 192 deletions(-) delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/PersonalCustomerDetailInquiryConverter.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/RecruitmentFeeDisclosureDataConverter.java delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryRequest.java delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryResponse.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataRequest.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataResponse.java delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCase.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCase.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/RecruitmentFeeDisclosureDataUseCaseImpl.java rename dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/{ncs/c/MciNcscClient.java => nbt/i/MciNbtiClient.java} (82%) create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_I.java create mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_O.java delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_I.java delete mode 100644 dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_O.java create mode 100644 dat-was-pro/src/main/resources/mock-responses/pro_recruitment_data.json create mode 100644 dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCaseTest.java diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/PersonalCustomerDetailInquiryConverter.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/PersonalCustomerDetailInquiryConverter.java deleted file mode 100644 index 699e97671..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/PersonalCustomerDetailInquiryConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.shinhanlife.dat.mcc.biz.pro.converter; - -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryRequest; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryResponse; -import io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io. DATNCSO00001_I; -import io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io. DATNCSO00001_O; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; - -@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) -public interface PersonalCustomerDetailInquiryConverter { - // Field names differ? Add mappings like this before the method. - @Mapping(source = "customerId", target = "customerId") - DATNCSO00001_I toLegacyRequest(PersonalCustomerDetailInquiryRequest request); - - - PersonalCustomerDetailInquiryResponse toResponse( DATNCSO00001_O mciRes); -} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/RecruitmentFeeDisclosureDataConverter.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/RecruitmentFeeDisclosureDataConverter.java new file mode 100644 index 000000000..2866e8598 --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/converter/RecruitmentFeeDisclosureDataConverter.java @@ -0,0 +1,18 @@ +package io.shinhanlife.dat.mcc.biz.pro.converter; + +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataRequest; +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataResponse; +import io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io.ONBTI2370_I; +import io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io.ONBTI2370_O; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface RecruitmentFeeDisclosureDataConverter { + // Field names differ? Add mappings like this before the method. + // @Mapping(source = "sourceField", target = "targetField") + ONBTI2370_I toLegacyRequest(RecruitmentFeeDisclosureDataRequest request); + RecruitmentFeeDisclosureDataRequest toRequest(ONBTI2370_I mciRequest); + RecruitmentFeeDisclosureDataResponse toResponse(ONBTI2370_O mciRes); +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryRequest.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryRequest.java deleted file mode 100644 index 5b4be65e8..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.shinhanlife.dat.mcc.biz.pro.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import jakarta.validation.constraints.Pattern; - - -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class PersonalCustomerDetailInquiryRequest { - @Schema(description = "조회할 고객의 고유 ID (형식: ^[A-Za-z0-9-]{1,20}$) (예시: 12345, CUST-00123)", example = "12345", requiredMode = Schema.RequiredMode.REQUIRED) - @Pattern(regexp = "^[A-Za-z0-9-]{1,20}$") - private String customerId; - - @Schema(description = "고객 이름 (선택적 확인용) (형식: ^[가-힣a-zA-Z\s]{2,20}$) (예시: 김철수, Lee Chul-soo)", example = "김철수") - @Pattern(regexp = "^[가-힣a-zA-Z\s]{2,20}$") - private String name; - - @Schema(description = "고객 전화번호 (선택적 확인용) (형식: $) (예시: 010-1234-5678, +821012345678)", example = "010-1234-5678") - private String phoneNumber; - - @Schema(description = "고객 이메일 주소 (선택적 확인용) (형식: $) (예시: customer@example.com, user@test.co.kr)", example = "customer@example.com") - private String email; - -} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryResponse.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryResponse.java deleted file mode 100644 index fd93782b8..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/PersonalCustomerDetailInquiryResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.shinhanlife.dat.mcc.biz.pro.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - - -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class PersonalCustomerDetailInquiryResponse { - private String resultCode; - - private String resultMessage; - @Schema(description = "조회된 고객의 고유 ID (예시: 12345, CUST-00123)", example = "12345", requiredMode = Schema.RequiredMode.REQUIRED) - private String customerId; - - @Schema(description = "고객의 전체 이름 (예시: 김철수, Lee Chul-soo)", example = "김철수", requiredMode = Schema.RequiredMode.REQUIRED) - private String name; - - @Schema(description = "고객의 전화번호 (예시: 010-1234-5678)", example = "010-1234-5678", requiredMode = Schema.RequiredMode.REQUIRED) - private String phoneNumber; - - @Schema(description = "고객의 이메일 주소 (예시: customer@example.com)", example = "customer@example.com", requiredMode = Schema.RequiredMode.REQUIRED) - private String email; - - @Schema(description = "고객의 주소 정보 (예시: 서울시 강남구 테헤란로 123)", example = "서울시 강남구 테헤란로 123") - private String address; - - @Schema(description = "고객의 생년월일 (예시: 1990-01-15)", example = "1990-01-15") - private String birthDate; - - @Schema(description = "고객의 멤버십 등급 (예시: GOLD, SILVER, BRONZE)", example = "GOLD") - private String membershipLevel; - -} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataRequest.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataRequest.java new file mode 100644 index 000000000..c85aca3d0 --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataRequest.java @@ -0,0 +1,32 @@ +package io.shinhanlife.dat.mcc.biz.pro.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import jakarta.validation.constraints.Pattern; + + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class RecruitmentFeeDisclosureDataRequest { + @Schema(description = "조회할 회사의 코드 (형식: ^[0-9]{6}$) (예시: 005930, 035420)", example = "005930", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{6}$") + private String companyCode; + + @Schema(description = "조회할 연도 (형식: ^[0-9]{4}$) (예시: 2023, 2024)", example = "2023", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{4}$") + private Integer year; + + @Schema(description = "조회할 분기 (1-4) (형식: ^[1-4]$) (예시: 1, 2, 3, 4)", example = "1") + @Pattern(regexp = "^[1-4]$") + private Integer quarter; + + @Schema(description = "조회 시작일 (YYYY-MM-DD) (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-01-01, 2024-04-01)", example = "2024-01-01") + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String startDate; + + @Schema(description = "조회 종료일 (YYYY-MM-DD) (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-03-31, 2024-06-30)", example = "2024-03-31") + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String endDate; + +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataResponse.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataResponse.java new file mode 100644 index 000000000..f625bf841 --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/dto/RecruitmentFeeDisclosureDataResponse.java @@ -0,0 +1,40 @@ +package io.shinhanlife.dat.mcc.biz.pro.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.List; +import jakarta.validation.constraints.Pattern; + + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class RecruitmentFeeDisclosureDataResponse { + private String resultCode; + + private String resultMessage; + @Schema(description = "모집수수료 공시 데이터 목록", requiredMode = Schema.RequiredMode.REQUIRED) + private List data; + + @Schema(description = "조회된 총 데이터 건수 (형식: ^[0-9]+$) (예시: 10, 25)", example = "10", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]+$") + private Integer totalCount; + + @Schema(description = "처리 결과 메시지 (예시: 조회 성공, 데이터가 없습니다)", example = "조회 성공", requiredMode = Schema.RequiredMode.REQUIRED) + private String message; + + + @Data + public static class DataItem { + @Schema(description = "회사명 (예시: 삼성전자, 카카오)", example = "삼성전자", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + + @Schema(description = "공시일 (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-01-15, 2024-04-20)", example = "2024-01-15", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String disclosureDate; + + @Schema(description = "공시 유형 (예시: 신규공시, 정정공시)", example = "신규공시", requiredMode = Schema.RequiredMode.REQUIRED) + private String disclosureType; + + } +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCase.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCase.java deleted file mode 100644 index 4070d48fc..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCase.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.shinhanlife.dat.mcc.biz.pro.usecase; - -import org.springaicommunity.mcp.annotation.McpTool; -import io.shinhanlife.dat.lib.annotation.GrowToolHint; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryRequest; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryResponse; - -/** - * @package io.shinhanlife.dat.mcc.biz.pro.usecase - * @className PersonalCustomerDetailInquiryUseCase - * @description AX HUB 시스템 처리 클래스 - * @author jade - * @create 2026.08.25 - *
- * ---------- 개정이력 ----------
- * 수정일       수정자     수정내용
- * ---------- -------- ---------------------------
- * 2026.08.25  jade    최초생성
- *
- * 
- */ -public interface PersonalCustomerDetailInquiryUseCase { - - @McpTool(name = "pro_personal_inquiry", title = "개인고객 상세 정보 조회", description = "개인고객의 상세 정보를 조회하는 도구로, 고객 ID 또는 기본 정보를 통해 이름, 연락처, 주소, 생년월일, 멤버십 등급 등 개인 고객 정보를 안전하게 조회할 수 있습니다.") - @GrowToolHint( - requiresApproval = false, - categoryKey = "pro", - mappingId = " DATNCSO00001", - functionDescription = "고객 ID 또는 기본 정보를 기반으로 개인 고객의 상세 정보를 조회하고 반환하는 핵심 비즈니스 함수입니다.", - whenToUse = "개인 고객의 상세 정보가 필요한 경우, 예를 들어 고객 ID, 이름, 전화번호, 이메일 등을 입력하여 고객 정보를 조회하고자 할 때 이 도구를 선택해야 합니다.", - whenNotToUse = "개인 고객이 아닌 법인 고객 정보 조회, 익명 또는 비개인 정보 요청, 또는 개인 정보 보호 정책상 정보 조회가 제한된 경우 이 도구를 선택하지 않아야 합니다.", - ioLimits = "입력 필드는 고객 ID(필수) 및 선택적 이름, 전화번호, 이메일을 허용하며, 최대 10개의 필드를 포함할 수 있습니다. 출력 필드는 결과 코드, 고객 ID, 이름, 전화번호, 이메일, 주소, 생년월일, 멤버십 등급 등을 포함하며, 최대 10개의 필드를 반환할 수 있습니다.", - displayDescription = "개인 고객의 상세 정보를 조회하는 포털용 간략한 설명으로, 이름, 연락처, 주소, 생년월일, 멤버십 등급 등을 확인할 수 있습니다.", - exampleQueries = {"고객 ID 12345로 개인 고객 정보를 조회해줘", "김철수 고객의 상세 정보를 알려줘", "010-1234-5678로 등록된 개인 고객 정보를 조회해줘", "lee@example.com 이메일로 가입된 개인 고객 정보를 조회해줘"}, - destructive = false, - idempotent = true, - tags = {"고객관리", "조회"}, - ownerOrg = "MCP_TOOL" - ) - PersonalCustomerDetailInquiryResponse execute(PersonalCustomerDetailInquiryRequest req); -} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCase.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCase.java new file mode 100644 index 000000000..505c5ec98 --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCase.java @@ -0,0 +1,41 @@ +package io.shinhanlife.dat.mcc.biz.pro.usecase; + +import org.springaicommunity.mcp.annotation.McpTool; +import io.shinhanlife.dat.lib.annotation.GrowToolHint; +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataRequest; +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataResponse; + +/** + * @package io.shinhanlife.dat.mcc.biz.pro.usecase + * @className RecruitmentFeeDisclosureDataUseCase + * @description AX HUB 시스템 처리 클래스 + * @author jade + * @create 2026.08.25 + *
+ * ---------- 개정이력 ----------
+ * 수정일       수정자     수정내용
+ * ---------- -------- ---------------------------
+ * 2026.08.25  jade    최초생성
+ *
+ * 
+ */ +public interface RecruitmentFeeDisclosureDataUseCase { + + @McpTool(name = "pro_recruitment_data", title = "모집수수료 공시", description = "금융감독원 공시 시스템에서 모집수수료 관련 공시 정보를 조회하고 관리하는 도구입니다.") + @GrowToolHint( + requiresApproval = false, + categoryKey = "pro", + mappingId = "DATNBTO00001", + functionDescription = "모집수수료 공시 데이터를 조회하고 관리하는 핵심 비즈니스 함수입니다.", + whenToUse = "모집수수료 공시 정보, 금융감독원 공시 데이터, 수수료 공시 내역이 필요한 경우", + whenNotToUse = "모집수수료와 무관한 다른 유형의 금융 데이터, 비공시 정보, 내부 데이터가 필요한 경우", + ioLimits = "연도별, 분기별, 기간별 모집수수료 공시 데이터를 조회할 수 있으며, 최대 1000건의 결과를 반환합니다.", + displayDescription = "모집수수료 공시 정보를 간편하게 조회할 수 있는 포털 서비스입니다.", + exampleQueries = {"2023년 모집수수료 공시 데이터 조회", "상반기 모집수수료 공시 정보 요청", "특정 회사의 2024년 3분기 모집수수료 공시", "모집수수료 공시 기간별 검색"}, + destructive = false, + idempotent = true, + tags = {"finance", "disclosure"}, + ownerOrg = "MCP_TOOL" + ) + RecruitmentFeeDisclosureDataResponse execute(RecruitmentFeeDisclosureDataRequest req); +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/PersonalCustomerDetailInquiryUseCaseImpl.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/PersonalCustomerDetailInquiryUseCaseImpl.java index a7d06058c..1643c8230 100644 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/PersonalCustomerDetailInquiryUseCaseImpl.java +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/PersonalCustomerDetailInquiryUseCaseImpl.java @@ -1,17 +1,9 @@ package io.shinhanlife.dat.mcc.biz.pro.usecase.impl; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryRequest; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryResponse; -import io.shinhanlife.dat.mcc.biz.pro.usecase.PersonalCustomerDetailInquiryUseCase; -import io.shinhanlife.dat.lib.integration.mci.component.AxhubMciComponent; import io.shinhanlife.glow.communication.dto.Transfer; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import io.shinhanlife.dat.mcc.biz.pro.converter.PersonalCustomerDetailInquiryConverter; -import io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io. DATNCSO00001_I; -import io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io. DATNCSO00001_O; -import io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.MciNcscClient; /** diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/RecruitmentFeeDisclosureDataUseCaseImpl.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/RecruitmentFeeDisclosureDataUseCaseImpl.java new file mode 100644 index 000000000..6e05b6fb2 --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/biz/pro/usecase/impl/RecruitmentFeeDisclosureDataUseCaseImpl.java @@ -0,0 +1,69 @@ +package io.shinhanlife.dat.mcc.biz.pro.usecase.impl; + +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataRequest; +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataResponse; +import io.shinhanlife.dat.mcc.biz.pro.usecase.RecruitmentFeeDisclosureDataUseCase; +import io.shinhanlife.dat.lib.integration.mci.component.AxhubMciComponent; +import io.shinhanlife.glow.communication.dto.Transfer; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import io.shinhanlife.dat.mcc.biz.pro.converter.RecruitmentFeeDisclosureDataConverter; +import io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io.ONBTI2370_I; +import io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io.ONBTI2370_O; +import io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.MciNbtiClient; + + +/** + * @package io.shinhanlife.dat.mcc.biz.pro.usecase.impl + * @className RecruitmentFeeDisclosureDataUseCaseImpl + * @description AX HUB 시스템 처리 클래스 + * @author jade + * @create 2026.08.25 + *
+ * ---------- 개정이력 ----------
+ * 수정일       수정자     수정내용
+ * ---------- -------- ---------------------------
+ * 2026.08.25  jade    최초생성
+ *
+ * 
+ */ +@Slf4j +@Service +@RequiredArgsConstructor +public class RecruitmentFeeDisclosureDataUseCaseImpl implements RecruitmentFeeDisclosureDataUseCase { + + private final MciNbtiClient mci; + private final RecruitmentFeeDisclosureDataConverter converter; + + @Override + public RecruitmentFeeDisclosureDataResponse execute(RecruitmentFeeDisclosureDataRequest req) { + log.info("[MCI Tool] {} 요청 수신.", "pro_recruitment_data"); + try { + // MapStruct를 이용한 자동 매핑 (AI DTO -> MCI DTO) + ONBTI2370_I mciReq = converter.toLegacyRequest(req); + + Transfer resTransfer = mci.callTo( + "DATNBTO00001", + null, + mciReq, + ONBTI2370_O.class + ); + RecruitmentFeeDisclosureDataResponse response = new RecruitmentFeeDisclosureDataResponse(); + if (resTransfer.getBody() != null) { + response = converter.toResponse(resTransfer.getBody()); + } + response.setResultCode("SUCCESS"); + response.setResultMessage(resTransfer.getBody() != null + ? "MCI call completed." + : "MCI call completed without a response body."); + return response; + } catch (Exception e) { + log.error("[MCI Tool] 연동 중 오류 발생: {}", e.getMessage(), e); + RecruitmentFeeDisclosureDataResponse response = new RecruitmentFeeDisclosureDataResponse(); + response.setResultCode("ERROR"); + response.setResultMessage(e.getMessage() != null ? e.getMessage() : "Unknown error"); + return response; + } + } +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/MciNcscClient.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/MciNbtiClient.java similarity index 82% rename from dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/MciNcscClient.java rename to dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/MciNbtiClient.java index b1a142132..1d96f91d5 100644 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/MciNcscClient.java +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/MciNbtiClient.java @@ -1,4 +1,4 @@ -package io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c; +package io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i; import org.springframework.stereotype.Component; import lombok.RequiredArgsConstructor; @@ -6,8 +6,8 @@ import io.shinhanlife.dat.lib.integration.mci.component.AxhubMciComponent; import io.shinhanlife.glow.communication.dto.Transfer; /** - * @package io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c - * @className MciNcscClient + * @package io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i + * @className MciNbtiClient * @description AX HUB 시스템 처리 클래스 * @author jade * @create 2026.08.25 @@ -21,7 +21,7 @@ import io.shinhanlife.glow.communication.dto.Transfer; */ @Component @RequiredArgsConstructor -public class MciNcscClient { +public class MciNbtiClient { private final AxhubMciComponent mci; public Transfer callTo(String interfaceId, String dummy, Object mciReq, Class resType) throws Exception { diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_I.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_I.java new file mode 100644 index 000000000..d3f45bc1d --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_I.java @@ -0,0 +1,30 @@ +package io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import jakarta.validation.constraints.Pattern; + + +@Data +public class ONBTI2370_I { + @Schema(description = "조회할 회사의 코드 (형식: ^[0-9]{6}$) (예시: 005930, 035420)", example = "005930", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{6}$") + private String companyCode; + + @Schema(description = "조회할 연도 (형식: ^[0-9]{4}$) (예시: 2023, 2024)", example = "2023", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{4}$") + private Integer year; + + @Schema(description = "조회할 분기 (1-4) (형식: ^[1-4]$) (예시: 1, 2, 3, 4)", example = "1") + @Pattern(regexp = "^[1-4]$") + private Integer quarter; + + @Schema(description = "조회 시작일 (YYYY-MM-DD) (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-01-01, 2024-04-01)", example = "2024-01-01") + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String startDate; + + @Schema(description = "조회 종료일 (YYYY-MM-DD) (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-03-31, 2024-06-30)", example = "2024-03-31") + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String endDate; + +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_O.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_O.java new file mode 100644 index 000000000..66c3a705d --- /dev/null +++ b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/nbt/i/io/ONBTI2370_O.java @@ -0,0 +1,39 @@ +package io.shinhanlife.dat.mcc.infra.itrf.mci.nbt.i.io; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.List; +import jakarta.validation.constraints.Pattern; + + +@Data +public class ONBTI2370_O { + @Schema(description = "결과 코드 (예시: SUCCESS, ERROR)", example = "SUCCESS", requiredMode = Schema.RequiredMode.REQUIRED) + private String resultCode; + + @Schema(description = "모집수수료 공시 데이터 목록", requiredMode = Schema.RequiredMode.REQUIRED) + private List data; + + @Schema(description = "조회된 총 데이터 건수 (형식: ^[0-9]+$) (예시: 10, 25)", example = "10", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]+$") + private Integer totalCount; + + @Schema(description = "처리 결과 메시지 (예시: 조회 성공, 데이터가 없습니다)", example = "조회 성공", requiredMode = Schema.RequiredMode.REQUIRED) + private String message; + + + @Data + public static class DataItem { + @Schema(description = "회사명 (예시: 삼성전자, 카카오)", example = "삼성전자", requiredMode = Schema.RequiredMode.REQUIRED) + private String companyName; + + @Schema(description = "공시일 (형식: ^[0-9]{4}-[0-9]{2}-[0-9]{2}$) (예시: 2024-01-15, 2024-04-20)", example = "2024-01-15", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") + private String disclosureDate; + + + @Schema(description = "공시 유형 (예시: 신규공시, 정정공시)", example = "신규공시", requiredMode = Schema.RequiredMode.REQUIRED) + private String disclosureType; + + } +} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_I.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_I.java deleted file mode 100644 index c92cd261e..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_I.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import jakarta.validation.constraints.Pattern; - - -@Data -public class DATNCSO00001_I { - @Schema(description = "조회할 고객의 고유 ID (형식: ^[A-Za-z0-9-]{1,20}$) (예시: 12345, CUST-00123)", example = "12345", requiredMode = Schema.RequiredMode.REQUIRED) - @Pattern(regexp = "^[A-Za-z0-9-]{1,20}$") - private String customerId; - - @Schema(description = "고객 이름 (선택적 확인용) (형식: ^[가-힣a-zA-Z\s]{2,20}$) (예시: 김철수, Lee Chul-soo)", example = "김철수") - @Pattern(regexp = "^[가-힣a-zA-Z\s]{2,20}$") - private String name; - - @Schema(description = "고객 전화번호 (선택적 확인용) (형식: {4}$) (예시: 010-1234-5678, +821012345678)", example = "010-1234-5678") - private String phoneNumber; - - @Schema(description = "고객 이메일 주소 (선택적 확인용) (형식: $) (예시: customer@example.com, user@test.co.kr)", example = "customer@example.com") - private String email; - -} diff --git a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_O.java b/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_O.java deleted file mode 100644 index 114749660..000000000 --- a/dat-was-pro/src/main/java/io/shinhanlife/dat/mcc/infra/itrf/mci/ncs/c/io/DATNCSO00001_O.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.shinhanlife.dat.mcc.infra.itrf.mci.ncs.c.io; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - - -@Data -public class DATNCSO00001_O { - @Schema(description = "조회 결과 상태 코드 (예시: SUCCESS, ERROR_001)", example = "SUCCESS", requiredMode = Schema.RequiredMode.REQUIRED) - private String resultCode; - - @Schema(description = "조회된 고객의 고유 ID (예시: 12345, CUST-00123)", example = "12345", requiredMode = Schema.RequiredMode.REQUIRED) - private String customerId; - - @Schema(description = "고객의 전체 이름 (예시: 김철수, Lee Chul-soo)", example = "김철수", requiredMode = Schema.RequiredMode.REQUIRED) - private String name; - - @Schema(description = "고객의 전화번호 (예시: 010-1234-5678)", example = "010-1234-5678", requiredMode = Schema.RequiredMode.REQUIRED) - private String phoneNumber; - - @Schema(description = "고객의 이메일 주소 (예시: customer@example.com)", example = "customer@example.com", requiredMode = Schema.RequiredMode.REQUIRED) - private String email; - - @Schema(description = "고객의 주소 정보 (예시: 서울시 강남구 테헤란로 123)", example = "서울시 강남구 테헤란로 123") - private String address; - - @Schema(description = "고객의 생년월일 (예시: 1990-01-15)", example = "1990-01-15") - private String birthDate; - - @Schema(description = "고객의 멤버십 등급 (예시: GOLD, SILVER, BRONZE)", example = "GOLD") - private String membershipLevel; - -} diff --git a/dat-was-pro/src/main/resources/mock-responses/pro_recruitment_data.json b/dat-was-pro/src/main/resources/mock-responses/pro_recruitment_data.json new file mode 100644 index 000000000..4c9133793 --- /dev/null +++ b/dat-was-pro/src/main/resources/mock-responses/pro_recruitment_data.json @@ -0,0 +1,6 @@ +{ + "resultCode" : "SUCCESS", + "data" : [{"companyName" : "삼성전자", "disclosureDate" : "2024-01-15", "feeAmount" : 1000000.50, "disclosureType" : "신규공시"], + "totalCount" : 10, + "message" : "조회 성공" +} diff --git a/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCaseTest.java b/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCaseTest.java index 224aec626..26c8830a9 100644 --- a/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCaseTest.java +++ b/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/PersonalCustomerDetailInquiryUseCaseTest.java @@ -2,8 +2,6 @@ package io.shinhanlife.dat.mcc.biz.pro.usecase; import static org.junit.jupiter.api.Assertions.assertNotNull; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryRequest; -import io.shinhanlife.dat.mcc.biz.pro.dto.PersonalCustomerDetailInquiryResponse; import org.junit.jupiter.api.Test; class PersonalCustomerDetailInquiryUseCaseTest { diff --git a/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCaseTest.java b/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCaseTest.java new file mode 100644 index 000000000..6c8a33a0c --- /dev/null +++ b/dat-was-pro/src/test/java/io/shinhanlife/dat/mcc/biz/pro/usecase/RecruitmentFeeDisclosureDataUseCaseTest.java @@ -0,0 +1,16 @@ +package io.shinhanlife.dat.mcc.biz.pro.usecase; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataRequest; +import io.shinhanlife.dat.mcc.biz.pro.dto.RecruitmentFeeDisclosureDataResponse; +import org.junit.jupiter.api.Test; + +class RecruitmentFeeDisclosureDataUseCaseTest { + + @Test + void createsToolRequestAndResponseDtos() { + assertNotNull(new RecruitmentFeeDisclosureDataRequest()); + assertNotNull(new RecruitmentFeeDisclosureDataResponse()); + } +}