diff --git a/mens-api/src/main/java/kr/xit/biz/ktgbs/service/BizKtGbsService.java b/mens-api/src/main/java/kr/xit/biz/ktgbs/service/BizKtGbsService.java index 4e768b3..9c6ec07 100644 --- a/mens-api/src/main/java/kr/xit/biz/ktgbs/service/BizKtGbsService.java +++ b/mens-api/src/main/java/kr/xit/biz/ktgbs/service/BizKtGbsService.java @@ -2,15 +2,19 @@ package kr.xit.biz.ktgbs.service; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import kr.xit.biz.cmm.service.ICmmEnsCacheService; import kr.xit.biz.common.ApiConstants; +import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO; +import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO; import kr.xit.biz.ens.model.kt.KtCommonDTO; import kr.xit.biz.ens.model.kt.KtCommonDTO.ErrorMsg; -import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO; +import kr.xit.biz.ens.model.ktgbs.KtGbsDTO; import kr.xit.biz.ktgbs.mapper.IBizKtGbsMapper; +import kr.xit.core.exception.BizRuntimeException; import kr.xit.core.service.AbstractService; import kr.xit.core.spring.annotation.TraceLogging; import kr.xit.core.support.utils.Checks; @@ -52,10 +56,9 @@ public class BizKtGbsService extends AbstractService implements IBizKtGbsService * @return KtTokenResponse * */ - /* @Override - public KtTokenResponse requestToken(final KtMnsRequest paramDTO) { - KtTokenResponse resDTO = ktMmsService.requestToken(paramDTO); + public KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO) { + KtGbsDTO.TokenResponse resDTO = ktGbsService.requestToken(paramDTO); if(StringUtils.isEmpty(resDTO.getAccessToken())){ throw BizRuntimeException.create("fail.api.kt.token.request"); @@ -68,7 +71,6 @@ public class BizKtGbsService extends AbstractService implements IBizKtGbsService .ktAccessToken(resDTO.getAccessToken()) .ktTokenExpiresIn(resDTO.getExpiresIn()) .ktScope(resDTO.getScope()) - .ktTokenJti(resDTO.getJti()) .build() ); cacheService.removeRlaybsnmInfoCache( @@ -80,7 +82,7 @@ public class BizKtGbsService extends AbstractService implements IBizKtGbsService ); return resDTO; } -*/ + /** *
      * 사전/본 문자 발송/수신 결과 전송
@@ -99,12 +101,12 @@ public class BizKtGbsService extends AbstractService implements IBizKtGbsService
     @Override
     @TraceLogging
     @Transactional
-    public KtCommonDTO.KtCommonResponse messageResult(final KtGbsApiDTO.MsgRsltRequest reqDTO) {
+    public KtCommonDTO.KtCommonResponse messageResult(final KtGbsDTO.MsgRsltRequest reqDTO) {
         List errors = CmmEnsUtils.getValidateErrors(reqDTO);
 
         if(!errors.isEmpty())   return throwError(errors);
 
-        for(KtGbsApiDTO.MsgRsltReqsData dto : reqDTO.getReqs()){
+        for(KtGbsDTO.MsgRsltReqsData dto : reqDTO.getReqs()){
 
             // 결과코드가 '40' 이고 열람타임스탬프가 있는 경우 -> 결과코드 '열람확인:60'으로 reset
             if("40".equals(dto.getMmsRsltDvcd()) && Checks.isNotEmpty(dto.getMmsRdgTmst())){
diff --git a/mens-api/src/main/java/kr/xit/biz/ktgbs/service/IBizKtGbsService.java b/mens-api/src/main/java/kr/xit/biz/ktgbs/service/IBizKtGbsService.java
index a130ef0..aa8ef8b 100644
--- a/mens-api/src/main/java/kr/xit/biz/ktgbs/service/IBizKtGbsService.java
+++ b/mens-api/src/main/java/kr/xit/biz/ktgbs/service/IBizKtGbsService.java
@@ -2,7 +2,7 @@ package kr.xit.biz.ktgbs.service;
 
 
 import kr.xit.biz.ens.model.kt.KtCommonDTO;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 
 /**
  * 
@@ -21,6 +21,6 @@ import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
  */
 public interface IBizKtGbsService {
 
-    //KtTokenResponse requestToken(final KtMnsRequest paramDTO);
-    KtCommonDTO.KtCommonResponse messageResult(final KtGbsApiDTO.MsgRsltRequest reqDTO);
+    KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO);
+    KtCommonDTO.KtCommonResponse messageResult(final KtGbsDTO.MsgRsltRequest reqDTO);
 }
diff --git a/mens-api/src/main/java/kr/xit/biz/ktgbs/web/BizKtGbsController.java b/mens-api/src/main/java/kr/xit/biz/ktgbs/web/BizKtGbsController.java
new file mode 100644
index 0000000..3449e80
--- /dev/null
+++ b/mens-api/src/main/java/kr/xit/biz/ktgbs/web/BizKtGbsController.java
@@ -0,0 +1,75 @@
+package kr.xit.biz.ktgbs.web;
+
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import kr.xit.biz.ens.model.kt.KtCommonDTO.KtMnsRequest;
+import kr.xit.biz.ktgbs.service.IBizKtGbsService;
+import kr.xit.core.model.ApiResponseDTO;
+import kr.xit.core.model.IApiResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 
+ * description :
+ *
+ * packageName : kr.xit.biz.ktgbs.web
+ * fileName    : BizKtGbsController
+ * author      : limju
+ * date        : 2024-08-19
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2024-08-19    limju       최초 생성
+ *
+ * 
+ */ +@Tag(name = "BizKtGbsController", description = "KT GIBIS 업무처리 Controller") +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/api/biz/ktgbs/v1") +@Slf4j +public class BizKtGbsController { + private static final String PARAM1 = """ + { + "signguCode": "88328", + "ffnlgCode": "11", + "profile": "local" + } + """; + private static final String PARAM2 = """ + { + "signguCode": "88316", + "ffnlgCode": "11", + "profile": "local" + } + """; + + private final IBizKtGbsService service; + + @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = { + @Content( + mediaType = "application/json", + examples = { + @ExampleObject( + name = "교통시설운영처", + value = PARAM1), + @ExampleObject( + name = "승화원", + value = PARAM2) + }) + }) + @Operation(deprecated = true, summary = "기관용 토큰 발급 요청", description = "기관용 토큰 발급 요청") + @PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_JSON_VALUE) + public IApiResponse requestToken(@RequestBody final KtMnsRequest paramDTO) { + return ApiResponseDTO.success(service.requestToken(paramDTO)); + } +} diff --git a/mens-api/src/main/java/kr/xit/ens/ktgbs/service/IKtGbsService.java b/mens-api/src/main/java/kr/xit/ens/ktgbs/service/IKtGbsService.java index 802d485..ecd49ff 100644 --- a/mens-api/src/main/java/kr/xit/ens/ktgbs/service/IKtGbsService.java +++ b/mens-api/src/main/java/kr/xit/ens/ktgbs/service/IKtGbsService.java @@ -1,7 +1,7 @@ package kr.xit.ens.ktgbs.service; import kr.xit.biz.ens.model.kt.KtCommonDTO; -import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO; +import kr.xit.biz.ens.model.ktgbs.KtGbsDTO; /** *
@@ -22,10 +22,10 @@ public interface IKtGbsService {
     //------------------------------------------------------------------------------
     // mens 사용 API
     //------------------------------------------------------------------------------
-    // KtTokenDTO.KtTokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO);
-    KtCommonDTO.KtCommonResponse mainSend(final KtGbsApiDTO.MsgSendRequest reqDTO);
-    // KtTokenDTO.KtTokenConfirmResponse cfmToken(final KtTokenDTO.KtTokenConfirmRequest reqDTO);
-    // KtCommonDTO.KtCommonResponse readToken(final KtTokenDTO.KtTokenReadRequest reqDTO);
+    KtCommonDTO.KtCommonResponse mainSend(final KtGbsDTO.MsgSendRequest reqDTO);
+    KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO);
+    KtCommonDTO.KtCommonResponse cfmToken(final KtGbsDTO.TokenConfirmRequest reqDTO);
+    KtCommonDTO.KtCommonResponse readToken(final KtGbsDTO.TokenReadRequest reqDTO);
     //------------------------------------------------------------------------------
 
 }
diff --git a/mens-api/src/main/java/kr/xit/ens/ktgbs/service/KtGbsService.java b/mens-api/src/main/java/kr/xit/ens/ktgbs/service/KtGbsService.java
index d73b0d9..1f52f5a 100644
--- a/mens-api/src/main/java/kr/xit/ens/ktgbs/service/KtGbsService.java
+++ b/mens-api/src/main/java/kr/xit/ens/ktgbs/service/KtGbsService.java
@@ -1,16 +1,24 @@
 package kr.xit.ens.ktgbs.service;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 
+import kr.xit.biz.cmm.service.ICmmEnsCacheService;
 import kr.xit.biz.common.ApiConstants;
+import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
 import kr.xit.biz.ens.model.cmm.CmmEnsRlaybsnmDTO;
 import kr.xit.biz.ens.model.kt.KtCommonDTO;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 import kr.xit.core.service.AbstractService;
 import kr.xit.core.spring.annotation.TraceLogging;
 import kr.xit.core.spring.util.ApiWebClientUtil;
+import kr.xit.core.support.utils.DateUtils;
 import kr.xit.core.support.utils.JsonUtils;
 import kr.xit.ens.cmm.CmmEnsUtils;
 import lombok.RequiredArgsConstructor;
@@ -35,18 +43,102 @@ public class KtGbsService extends AbstractService implements IKtGbsService {
     @Value("${app.contract.ktgbs.host}")
     private String HOST;
 
+    @Value("${app.contract.ktgbs.api.access-token}")
+    private String API_ACCESS_TOKEN;
+
+    /**
+     * 토큰인증확인조회 : BC-AG-SN-008
+     */
+    @Value("${app.contract.ktgbs.api.cfm-token}")
+    private String API_CFM_TOKEN;
+
+    /**
+     * 토큰열람확인결과전송 : BC-AG-SN-009
+     */
+    @Value("${app.contract.ktgbs.api.read-token}")
+    private String API_READ_TOKEN;
+
     /**
-     * 본문자수신등록 : BC-AG-SN-002
+     * 본문자수신등록
      */
     @Value("${app.contract.ktgbs.api.main-send}")
     private String API_MAIN_SEND;
 
     private final ApiWebClientUtil webClient;
+    private final ICmmEnsCacheService cacheService;
+
+    @Override
+    @TraceLogging
+    public KtGbsDTO.TokenResponse requestToken(final KtCommonDTO.KtMnsRequest paramDTO) {
+        final CmmEnsRlaybsnmDTO ktMnsInfo = cacheService.getRlaybsnmInfoCache(CmmEnsRequestDTO.builder()
+            .signguCode(paramDTO.getSignguCode())
+            .ffnlgCode(paramDTO.getFfnlgCode())
+            .profile(ApiConstants.PROFILE)
+            .build());
+
+        final KtGbsDTO.TokenRequest reqDTO = KtGbsDTO.TokenRequest.builder()
+            .clientId(ktMnsInfo.getKtSvcClientId())
+            .clientSecret(ktMnsInfo.getKtSvcClientSecret())
+            .build();
+        CmmEnsUtils.validate(reqDTO);
+
+        final Map headerMap = new HashMap<>();
+        headerMap.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
+        headerMap.put(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", ktMnsInfo.getKtAccessToken()));
+
+
+        return webClient.exchangeFormData(
+            HOST + API_ACCESS_TOKEN,
+            HttpMethod.POST,
+            reqDTO,
+            KtGbsDTO.TokenResponse.class,
+            headerMap
+        );
+    }
+
+    @Override
+    @TraceLogging
+    public KtCommonDTO.KtCommonResponse cfmToken(final KtGbsDTO.TokenConfirmRequest reqDTO) {
+        final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
+        reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
+        reqDTO.setSignguCode(null);
+        reqDTO.setFfnlgCode(null);
+        reqDTO.setProfile(null);
+        CmmEnsUtils.validate(reqDTO);
+
+        return webClient.exchangeKtGbs(
+            HOST + API_CFM_TOKEN,
+            HttpMethod.POST,
+            JsonUtils.toJson(reqDTO),
+            KtCommonDTO.KtCommonResponse.class,
+            ktMnsInfo
+        );
+    }
+
+    @Override
+    @TraceLogging
+    public KtCommonDTO.KtCommonResponse readToken(final KtGbsDTO.TokenReadRequest reqDTO) {
+        final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
+        reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
+        reqDTO.setMmsRdgTmst(DateUtils.getTodayAndNowTime("yyyyMMddHHmmss"));
+        reqDTO.setSignguCode(null);
+        reqDTO.setFfnlgCode(null);
+        reqDTO.setProfile(null);
+        CmmEnsUtils.validate(reqDTO);
+
+        return webClient.exchangeKtGbs(
+            HOST + API_READ_TOKEN,
+            HttpMethod.POST,
+            JsonUtils.toJson(reqDTO),
+            KtCommonDTO.KtCommonResponse.class,
+            ktMnsInfo
+        );
+    }
 
     // FIXME : KT GIBIS 적용 안됨
     @Override
     @TraceLogging
-    public KtCommonDTO.KtCommonResponse mainSend(final KtGbsApiDTO.MsgSendRequest reqDTO) {
+    public KtCommonDTO.KtCommonResponse mainSend(final KtGbsDTO.MsgSendRequest reqDTO) {
         final CmmEnsRlaybsnmDTO ktMnsInfo = getRlaybsnmInfo(reqDTO);
         reqDTO.setServiceCd(ktMnsInfo.getKtServiceCode());
         reqDTO.setServiceCd(ktMnsInfo.getKtSvcCerfKey());
diff --git a/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsController.java b/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsController.java
index f9f8e0f..4c1e378 100644
--- a/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsController.java
+++ b/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsController.java
@@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RestController;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import kr.xit.biz.ens.model.kt.KtCommonDTO;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 import kr.xit.core.model.ApiResponseDTO;
 import kr.xit.core.model.IApiResponse;
 import kr.xit.ens.ktgbs.service.IKtGbsService;
@@ -36,11 +36,53 @@ import lombok.RequiredArgsConstructor;
 public class KtGbsController {
     private final IKtGbsService service;
 
+
+
     // FIXME : KT GIBIS 적용 안됨
     @Operation(summary = "본문자 수신 등록 요청", description = "본문자 수신 등록 요청")
     @PostMapping(value = "/mainSend", produces = MediaType.APPLICATION_JSON_VALUE)
-    public IApiResponse mainSend(@RequestBody final KtGbsApiDTO.MsgSendRequest reqDTO) {
+    public IApiResponse mainSend(@RequestBody final KtGbsDTO.MsgSendRequest reqDTO) {
         KtCommonDTO.KtCommonResponse dto = service.mainSend(reqDTO);
         return ApiResponseDTO.success(dto);
     }
+
+    @Operation(deprecated = true, summary = "기관용 토큰 발급 요청 -> 업무(Biz)단 API 에서 처리", description = "KT 문서 중개자 정보 DB update가 필요하여 업무단의 API를 사용하여야 함")
+    @PostMapping(value = "/requestToken", produces = MediaType.APPLICATION_JSON_VALUE)
+    public IApiResponse requestToken(@RequestBody final KtCommonDTO.KtMnsRequest paramDTO) {
+        return ApiResponseDTO.success(service.requestToken(paramDTO));
+    }
+
+    /**
+     * 
+     * - 본문자 수신 등록 요청 API 호출시 set한 url
+     *   -> OTT token get
+     * - 토큰인증확인조회요청 API call
+     * - 토큰열람확인결과 전송 API call
+     * @param reqDTO TokenConfirmRequest
+     * @return KtCommonResponse
+     * 
+ */ + @Operation(deprecated = true, summary = "토큰인증확인 조회 -> KT GIBIS 모바일 데이타 요청(모바일 페이지에서 호출)에서 처리", description = "토큰인증확인조회요청(BC-AG-SN-008)
전자문서중개자모바일페이지") + @PostMapping(value = "/cfmToken", produces = MediaType.APPLICATION_JSON_VALUE) + public IApiResponse cfmToken(@RequestBody final KtGbsDTO.TokenConfirmRequest reqDTO) { + KtCommonDTO.KtCommonResponse dto = service.cfmToken(reqDTO); + return ApiResponseDTO.success(dto); + } + + /** + *
+     * - 본문자 수신 등록 요청(BC-AG-SN-002) API 호출시 set한 url
+     *   -> OTT token get
+     * - 토큰인증확인조회요청(BC-AG-SN-008) API call
+     * - 토큰열람확인결과 전송(BC-AG-SN-009) API call
+     * @param reqDTO KtTokenReadRequest
+     * @return KtCommonResponse
+     * 
+ */ + @Operation(deprecated = true, summary = "토큰열람확인결과 전송 -> KT GIBIS 모바일 데이타 요청(모바일 페이지에서 호출)에서 처리", description = "토큰열람확인결과 전송(BC-AG-SN-009)
전자문서중개자모바일페이지") + @PostMapping(value = "/readToken", produces = MediaType.APPLICATION_JSON_VALUE) + public IApiResponse readToken(@RequestBody final KtGbsDTO.TokenReadRequest reqDTO) { + KtCommonDTO.KtCommonResponse dto = service.readToken(reqDTO); + return ApiResponseDTO.success(dto); + } } diff --git a/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsInboundController.java b/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsInboundController.java index 37ec74a..c77f5bb 100644 --- a/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsInboundController.java +++ b/mens-api/src/main/java/kr/xit/ens/ktgbs/web/KtGbsInboundController.java @@ -10,7 +10,8 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.tags.Tag; import kr.xit.biz.ens.model.kt.KtCommonDTO; -import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO; +import kr.xit.biz.ens.model.ktgbs.KtGbsDTO; +import kr.xit.biz.ktgbs.service.IBizKtGbsService; import lombok.RequiredArgsConstructor; /** @@ -31,6 +32,8 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @RestController public class KtGbsInboundController { + private final IBizKtGbsService bizService; + /** *
      * 메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출
@@ -73,7 +76,7 @@ public class KtGbsInboundController {
     @Operation(summary = "메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출", description = "메세지 발송/수신 결과 전송 -> KT GIBIS에서 호출")
     //@PostMapping(value = "/goji/kt/gibis/stat/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
     @PostMapping(value = "/api/msg/result", produces = MediaType.APPLICATION_JSON_VALUE)
-    public KtCommonDTO.KtCommonResponse messageResult(@RequestBody final KtGbsApiDTO.MsgRsltRequest reqDTO) {
-        return null; //bizService.messageResult(reqDTO);
+    public KtCommonDTO.KtCommonResponse messageResult(@RequestBody final KtGbsDTO.MsgRsltRequest reqDTO) {
+        return bizService.messageResult(reqDTO);
     }
 }
diff --git a/mens-api/src/main/resources/config/application-ens.yml b/mens-api/src/main/resources/config/application-ens.yml
index cf5adeb..a81687e 100644
--- a/mens-api/src/main/resources/config/application-ens.yml
+++ b/mens-api/src/main/resources/config/application-ens.yml
@@ -83,9 +83,13 @@ app:
         # 전자문서유통정보수치확인서 발급처리 : BC-AG-HS-002
         cfm-acmd: /api/acmdinfocfm
     ktgbs:
-      host: http://172.16.0.13:10210/ONLWeb
+      host: http://108.1.143.27:8080
       api:
         # 본문자수신등록 : BC-AG-SN-002
         main-send: /api/msg/send
-        # 사전/본 문자 발송/수신 결과 전송 : BC-AG-SN-010
-        result-message: /api/msg/result
+        # 토큰발행
+        access-token: /api/oauth/token
+        # 토큰인증확인조회
+        cfm-token: /api/msg/token
+        # 토큰열람확인결과전송
+        read-token: /api/msg/read
diff --git a/mens-batch/src/main/java/kr/xit/biz/ens/mapper/IEnsBatchMapper.java b/mens-batch/src/main/java/kr/xit/biz/ens/mapper/IEnsBatchMapper.java
index d87abf4..be85fcb 100644
--- a/mens-batch/src/main/java/kr/xit/biz/ens/mapper/IEnsBatchMapper.java
+++ b/mens-batch/src/main/java/kr/xit/biz/ens/mapper/IEnsBatchMapper.java
@@ -16,7 +16,7 @@ import kr.xit.biz.ens.model.kakao.v1.KkopayDocBulkDTO;
 import kr.xit.biz.ens.model.kakao.v1.KkopayDocDTO;
 import kr.xit.biz.ens.model.kakao.v2.KkotalkDTO;
 import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 
 /**
  * 
@@ -331,7 +331,7 @@ public interface IEnsBatchMapper {
     int updateKtBcMst(final SndngMssageParam dto);
 
     Optional selectKtGbsMstTgtInfo(final SndngMssageParam dto);
-    List selectKtGbsSendTgts(final SndngMssageParam dto);
+    List selectKtGbsSendTgts(final SndngMssageParam dto);
 
     //----------------------------------------------------------------------
     // send
diff --git a/mens-batch/src/main/java/kr/xit/biz/ens/model/EnsKtGbsDTO.java b/mens-batch/src/main/java/kr/xit/biz/ens/model/EnsKtGbsDTO.java
index be4db88..94ce857 100644
--- a/mens-batch/src/main/java/kr/xit/biz/ens/model/EnsKtGbsDTO.java
+++ b/mens-batch/src/main/java/kr/xit/biz/ens/model/EnsKtGbsDTO.java
@@ -1,7 +1,7 @@
 package kr.xit.biz.ens.model;
 
 import kr.xit.biz.common.ApiConstants;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -29,7 +29,7 @@ import lombok.experimental.SuperBuilder;
 @AllArgsConstructor
 @SuperBuilder
 @EqualsAndHashCode(callSuper = true)
-public class EnsKtGbsDTO extends KtGbsApiDTO.MsgSendRequest {
+public class EnsKtGbsDTO extends KtGbsDTO.MsgSendRequest {
 
     @Builder.Default
     private String sndngTyCode = "ENS";
diff --git a/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchExtractService.java b/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchExtractService.java
index 5925553..cc6c04e 100644
--- a/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchExtractService.java
+++ b/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchExtractService.java
@@ -23,7 +23,7 @@ import kr.xit.biz.ens.model.cntc.CntcDTO;
 import kr.xit.biz.ens.model.kakao.v1.KkopayDocBulkDTO;
 import kr.xit.biz.ens.model.kakao.v2.KkotalkDTO;
 import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 import kr.xit.core.exception.BizRuntimeException;
 import kr.xit.core.service.AbstractService;
 import kr.xit.core.support.utils.Checks;
@@ -153,7 +153,7 @@ public class EnsBatchExtractService extends AbstractService implements
 
     @Override
     @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public void saveKtGbsResult(final SndngMssageParam dto, final List sendReqs) {
+    public void saveKtGbsResult(final SndngMssageParam dto, final List sendReqs) {
         // 성공처리
         // mobile page create
         // FIXME : KT GIBIS 적용 안됨
diff --git a/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchSendService.java b/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchSendService.java
index 6dc21a8..4dd4976 100644
--- a/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchSendService.java
+++ b/mens-batch/src/main/java/kr/xit/biz/ens/service/EnsBatchSendService.java
@@ -41,7 +41,7 @@ import kr.xit.biz.ens.model.kakao.v2.KkotalkDTO;
 import kr.xit.biz.ens.model.kt.KtCommonDTO.ErrorMsg;
 import kr.xit.biz.ens.model.kt.KtCommonDTO.KtCommonResponse;
 import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 import kr.xit.core.exception.BizRuntimeException;
 import kr.xit.core.model.ApiResponseDTO;
 import kr.xit.core.service.AbstractService;
@@ -614,7 +614,7 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
 
         final String mstId = dto.getSndngMastrId();
         final String unitySndMstId = dto.getUnitySndngMastrId();
-        final List sendReqs = mapper.selectKtGbsSendTgts(dto);
+        final List sendReqs = mapper.selectKtGbsSendTgts(dto);
 
         // validation check
         try {
@@ -624,7 +624,7 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
             throw e;
         }
 
-        final List> partitions = ListUtils.partition(sendReqs, bulkKtMaxCnt);
+        final List> partitions = ListUtils.partition(sendReqs, bulkKtMaxCnt);
         @SuppressWarnings("rawtypes")
         List apiResults = partitions.stream()
             .map(bulkSendList -> {
@@ -709,12 +709,12 @@ public class EnsBatchSendService extends AbstractService implements IEnsBatchSen
         }
     }
 
-    private void validatedKtGbsSendBulks(List sendReqs) {
+    private void validatedKtGbsSendBulks(List sendReqs) {
         List errors = new ArrayList<>();
         int idx = 0;
 
-        for (KtGbsApiDTO.MsgSendReqsData dto : sendReqs) {
-            Set> errList = validator.validate(dto);
+        for (KtGbsDTO.MsgSendReqsData dto : sendReqs) {
+            Set> errList = validator.validate(dto);
 
             if (!errList.isEmpty()) {
                 int finalIdx = idx;
diff --git a/mens-batch/src/main/java/kr/xit/biz/ens/service/IEnsBatchExtractService.java b/mens-batch/src/main/java/kr/xit/biz/ens/service/IEnsBatchExtractService.java
index 6eca080..cd6c183 100644
--- a/mens-batch/src/main/java/kr/xit/biz/ens/service/IEnsBatchExtractService.java
+++ b/mens-batch/src/main/java/kr/xit/biz/ens/service/IEnsBatchExtractService.java
@@ -7,7 +7,7 @@ import kr.xit.biz.ens.model.cmm.SndngMssageParam;
 import kr.xit.biz.ens.model.kakao.v1.KkopayDocBulkDTO;
 import kr.xit.biz.ens.model.kakao.v2.KkotalkDTO;
 import kr.xit.biz.ens.model.kt.KtMmsSendDTO.KtMainSendReqData;
-import kr.xit.biz.ens.model.ktgbs.KtGbsApiDTO;
+import kr.xit.biz.ens.model.ktgbs.KtGbsDTO;
 
 /**
  * 
@@ -35,7 +35,7 @@ public interface IEnsBatchExtractService {
     void saveKkotalkSendResult(final String mstId, String unitySndMstId, final List resList);
 
     void saveKtBcResult(final SndngMssageParam dto, final List sendReqs);
-    void saveKtGbsResult(final SndngMssageParam dto, final List sendReqs);
+    void saveKtGbsResult(final SndngMssageParam dto, final List sendReqs);
 
 
     void updateSndngMstFailStatus(final String mstId, final SndngSeCode seCode, final String errCode, final String errMsg, final String stsErrMsg);
diff --git a/mens-batch/src/main/resources/egovframework/mapper/biz/ens-oracle-mapper.xml b/mens-batch/src/main/resources/egovframework/mapper/biz/ens-oracle-mapper.xml
index 8b6abce..b9e64c1 100644
--- a/mens-batch/src/main/resources/egovframework/mapper/biz/ens-oracle-mapper.xml
+++ b/mens-batch/src/main/resources/egovframework/mapper/biz/ens-oracle-mapper.xml
@@ -794,7 +794,7 @@
 		ORDER BY tesm.unity_sndng_mastr_id
 	
 
-	
 		/** ens-oracle-mapper|selectKtGbsSendTgts-Kt GIBIS 수신 대상 목록 조회|julim  */
 		SELECT tekbm.sndng_mastr_id							/* 발송마스터 ID */
 			 , tekbm.signgu_code									/* 시군구 코드 */
diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsApiDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsApiDTO.java
deleted file mode 100644
index 7bde11c..0000000
--- a/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsApiDTO.java
+++ /dev/null
@@ -1,425 +0,0 @@
-package kr.xit.biz.ens.model.ktgbs;
-
-import java.util.List;
-
-import javax.validation.Valid;
-import javax.validation.constraints.Digits;
-import javax.validation.constraints.Size;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.PropertyNamingStrategies;
-import com.fasterxml.jackson.databind.annotation.JsonNaming;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
-import kr.xit.biz.ens.model.kt.KtCommonDTO;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.experimental.SuperBuilder;
-
-/**
- * 
- * description : 
- * packageName : kr.xit.biz.ens.model.ktgbs
- * fileName    : KtGbsApiDTO
- * author      : limju
- * date        : 2024-08-19
- * ======================================================================
- * 변경일         변경자        변경 내용
- * ----------------------------------------------------------------------
- * 2024-08-19   limju       최초 생성
- *
- * 
- */ -public class KtGbsApiDTO { - - //------------------------------------------------------------------- - // 메세지 발송 - //------------------------------------------------------------------- - @Schema(name = "MsgSendRequest DTO", description = "메세지 발송 요청 request DTO") - @Data - @NoArgsConstructor - @AllArgsConstructor - @SuperBuilder - @EqualsAndHashCode(callSuper = false) - @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) - public static class MsgSendRequest extends KtCommonDTO.KtMnsRequest { - /** - * 기관코드 - 필수(5자리) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "기관코드", example = "51110") - @Size(min = 5, max = 5, message = "기관코드는 필수 입니다(5자리)") - private String serviceCd; - - /** - * 문서코드 - 필수(5자리) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서코드", example = "DP112") - @Size(min = 5, max = 5, message = "기관코드는 필수 입니다(5자리)") - private String msgCd; - - /** - * 생성일시 - 필수(14자리) : yyyymmddHHmiss - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "생성일시", example = "20240819123456") - @Size(min = 5, max = 5, message = "생성일시는 필수 입니다(14자리)") - private String makeDt; - - /** - * 회차전체데이터건수 - 필수(max:8자리) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "회차전체데이터건수", example = " ") - @Digits(integer = 8, fraction = 0, message = "회차전체데이터건수(max:8자리)") - private Integer dataCnt; - - /** - * 발송마감시간 - 필수(yyyyMMddHHmiss : 14자리) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송마감시간(yyyyMMddHHmiss)", example = " ") - @Size(min = 14, max = 14, message = "발송마감시간(yyyyMMddHHmiss)") - private String sendExTime; - - /** - * 열람마감시간 - 필수(yyyyMMddHHmiss : 14자리) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "열람마감시간(yyyyMMddHHmiss)", example = " ") - @Size(min = 14, max = 14, message = "열람마감시간(yyyyMMddHHmiss)") - private String exTime; - - /** - * 문서종류 - 필수(3자리 : sms|lms|mms) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서종류(sms|lms|mms)", example = " ", allowableValues = { - "sms", "lms", "mms"}) - @Size(min = 3, max = 3, message = "문서종류(sms|lms|mms)") - @JsonProperty("m_type") - private String mType; - - /** - * 발송메세지타입 - 필수(1자리 : 1-RCS, 2-xMS) - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송메세지타입(1-RCS, 2-xMS)", example = " ", allowableValues = { - "1", "2"}) - @Size(min = 1, max = 1, message = "발송메세지타입(1-RCS, 2-xMS)") - private String msgType; - - @Schema(requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - private List reqs; - - /** - * 발신번호(서비스기관발송전화번호) - */ - @Schema(title = "발신번호", example = " ") - @Size(max = 20, message = "발신번호(max:20)") - private String sndTelNo; - - /** - * 메세지발송구분 - */ - @Schema(title = "메세지발송구분", example = " ") - @Digits(integer = 8, fraction = 0, message = "메세지발송구분(max:1자리)") - private Integer optType; - } - - - @Schema(name = "MsgSendReqsData", description = "메세지 발송 요청 reqs DTO") - @Getter - @NoArgsConstructor - @AllArgsConstructor - @SuperBuilder - @JsonInclude(JsonInclude.Include.NON_NULL) - @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) - public static class MsgSendReqsData { - //------------------------------------------------------------------- - // 필수 - //------------------------------------------------------------------- - /** - * 관리키 : 고객메시지 건별 Unique key - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000011") - @NotEmpty(message = "관리키는 필수 입니다(max:50)") - @Size(max = 50) - private String srcKey; - - /** - * 리스트순번 : max 8자리 - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "리스트순번", example = "1") - @NotEmpty(message = "리스트 순번은 필수 입니다(max:8)") - @Size(max = 8) - private String srcSeq; - - /** - * 개인식별코드 : 128 자리 - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "개인식별코드", example = "vMtqVxJX56lBgbf9heK3QTc+jVndTfK77i/UJKAzPmBG4n9CazCdd/8YytlFZnN4qofIqgxHpSoiG0yYzgEpJg==") - @Size(min = 128, max = 128, message = "개인식별코드는 필수 입니다(128자리)") - private String sci; - - /** - *
-         * MMS 상세내용 : max 4000
-         * URL 없음
-         * {#INFO_CFRM_STR}, {#RCVE_RF_STR} 문자열이 없는 경우 요청 거부 처리 함.
-         * 단, 유통정보미생성여부가 'Y'인 경우 {#RCVE_RF_STR} 문자열만 체크.
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 상세내용", example = "{#INFO_CFRM_STR}, {#RCVE_RF_STR}") - @Size(min = 1, max = 4000, message = "MMS 상세내용 필수입니다(max:4000)") - private String mmsDtlCnts; - - /** - *
-         * MMS 제목 : max 40
-         * utf-8 한글20자
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 제목(max:40)", example = "공유재산사용료 정기분") - @Size(min = 1, max = 40, message = "MMS 제목은 필수 입니다(max:40)") - private String mmsTitle; - //------------------------------------------------------------------- - - /** - *
-         * RCS 메세지 상세내용 : max 4000 - RCS|Binary 전송시 필수
-         * RCS 메시지 fallback 시 mms_dtl_cnts를 사용하며
-         * RCS title은 mms_title 항목을 함께 사용한다.
-         * 
- */ - @Schema(title = "RCS 메세지 상세내용(max:4000)", example = " ") - @Size(max = 4000, message = "RCS 메세지 상세내용은 4000자를 넘을 수 없습니다.") - private String rcsDtlCnts; - - - /** - *
-         * 연결 URL
-         * 
- */ - @Schema(title = "연결 URL", example = "http://localhost:8081/api/biz/kt/v1/cfmToken") - private String url; - - /** - * 문서해시 : max 64 - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서해시(max:64)", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") - @Size(max = 64, message = "문서해시 64자를 넘을 수 없습니다.") - private String docHash; - - /** - *
-         * 개인휴대전화번호 : 11 자리
-         * 특정 MDN으로 발송할 경우
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "개인휴대전화번호(max:11)", example = "01093414345") - @Size(max = 11, message = "개인 휴대 전화번호는 11자리 입니다") - private String mdn; - } - //------------------------------------------------------------------- - // 메세지 발송 - //------------------------------------------------------------------- - - - //------------------------------------------------------------------- - // 메세지 발송 및 수신결과 전송 - //------------------------------------------------------------------- - @Schema(name = "MsgRsltRequest", description = "메세지 발송 및 수신결과 전송 요청 DTO") - @Data - @NoArgsConstructor - @AllArgsConstructor - @SuperBuilder - @JsonInclude(JsonInclude.Include.NON_NULL) - @EqualsAndHashCode(callSuper = false) - @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) - public static class MsgRsltRequest { - /** - *
-         * 기관코드 : 필수 - 5
-         * BizCenter에서 발행한 기관의 서비스 코드
-         * 
> - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "서비스코드", example = " ") - @Size(min = 5, max = 5, message = "서비스코드는 필수 입니다(5자리)") - private String serviceCd; - - @Schema(requiredMode = Schema.RequiredMode.REQUIRED) - @Valid - private List reqs; - } - - @Schema(name = "MsgRsltReqsData", description = "메세지 발송 및 수신결과 전송 reqs DTO") - @Data - @NoArgsConstructor - @AllArgsConstructor - @SuperBuilder - @JsonInclude(JsonInclude.Include.NON_NULL) - @EqualsAndHashCode(callSuper = false) - @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) - public static class MsgRsltReqsData extends CmmEnsRequestDTO { - //------------------------------------------------------------------- - // 필수 - //------------------------------------------------------------------- - /** - * 관리키 : 고객메시지 건별 Unique key - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000001") - @Size(min = 1, max = 50, message = "관리키는 필수 입니다(max:50)") - private String srcKey; - - /** - *
-         * MMS 발송결과 상태 순번 : 필수 - max 8
-         * 1:수신(결과), 열람(결과):2
-         * 
> - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 발송결과 상태 순번", example = " ", allowableValues = { - "1", "2"}) - @Digits(integer = 8, fraction = 0, message = "MMS 발송결과 상태 순번(1|2)") - private Integer mmsSndgRsltSqno; - - /** - *
-         * 처리일자 : 필수 - 8
-         * 이통사 처리일자
-         * 
> - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "처리일자", example = "20231210") - @Size(min = 8, max = 8, message = "처리일자는 필수 입니다(YYYYMMDD)") - private String prcsDt; - - /** - * 문서코드 : 필수 - 5자리 - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서코드", example = "00001") - @Size(min = 5, max = 5, message = "문서코드는 필수 입니다(5자리)") - private String mmsBsnsDvcd; - - /** - *
-         * 모바일사업자구분 : 필수 - 2자리
-         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "모바일사업자구분", example = "01", allowableValues = {"01","02","03"}) - @Size(min = 2, max = 2, message = "모바일 사업자 구분은 필수 입니다(01|02|03)") - private String mblBzowrDvcd; - - /** - *
-         * TODO::결과코드에 따른 메세지 처리 필요
-         * 발송결과코드 : 필수 - 2자리
-         * 40	MMS/RCS 발송	수신성공
-         * 41	MMS발송	메시지 내용 스팸
-         * 42	MMS발송	착신자 스팸
-         * 43	MMS발송	레포트 수신 시간 만료(메시지전송후 24시간 레포트 못받는 경우 )
-         * 47	MMS발송	비가입자, 결번, 서비스정지
-         * 48	MMS발송	단말기 전원 꺼짐
-         * 49	MMS발송	기타
-         * 4A	MMS발송	UNKNOWN/단말기형식오류(스팸설정)
-         * 4D	MMS발송	전송 실패(무선망), 단말기 일시정지
-         * 4J	MMS발송	비가용폰 오류
-         * 4N	MMS발송	수신거부
-         * 4O	MMS발송	LMS발송오류(시간초과)
-         * 4P	MMS발송	LMS발송오류(기타)
-         * 4T	MMS발송	가입자미존재(미동의포함)
-         * 4Q	MMS발송	수신대기
-         * 4R	MMS발송	다회선 제외
-         * 4V	MMS발송	수신등록 휴대폰번호 미존재
-         * 4W	MMS발송	기동의 사전문자 제외
-         * 50	수신확인	수신성공
-         * 60	열람확인	열람확인 (MMS발송결과순번=2, 열람타임스탬프가 있는 경우)
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송결과코드", example = "40") - @Size(min = 2, max = 2, message = "발송결과코드는 필수 입니다") - private String mmsRsltDvcd; - //private String mmsSndgRsltDvcd; - - /** - *
-         * 발송타임스탬프 : 필수 - 14
-         * YYYYMMDDHHMISS
-         * 
> - */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송타임스탬프", example = "20241030121000") - @Size(min = 14, max = 14, message = "발송타임스탬프는 필수 입니다(YYYYMMDDHHMISS)") - private String mmsSndgTmst; - - /** - *
-         * 문발송 메시지 타입: 필수 - 1
-         * RCS/xMS (RCS :1, xMS: 2)
-         * 
- */ - @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송 메시지 타입", example = "2", allowableValues = {"1", - "2"}) - @Size(min = 1, max = 1, message = "발송 메시지 타입은 필수 입니다") - private String msgType; - //------------------------------------------------------------------- - - /** - *
-         * 실제발송번호(일부) : max 20
-         * 고객휴대폰번호 일부 (****0323)
-         * 
- */ - @Schema(title = "실제발송번호(일부)", example = " ") - @Size(max = 20, message = "실제발송번호(일부)는 20자를 넘을 수 없습니다.") - private String rlMmsSndgTelno; - - /** - *
-         * 수신타임스탬프 : 14
-         * 수신시(mms_sndg_rslt_sqno 코드값이 1인 경우) 필수
-         * 
> - */ - @Schema(title = "수신타임스탬프", example = " ") - @Size(max = 14, message = "수신타임스탬프는 14자리 입니다") - private String mmsRcvTmst; - - /** - *
-         * 열람타임스탬프 : 14
-         * 열람시(mms_sndg_rslt_sqno 코드값이 2인 경우) 필수
-         * 
> - */ - @Schema(title = "열람타임스탬프", example = " ") - @Size(max = 14, message = "열람타임스탬프는 14자리 입니다") - private String mmsRdgTmst; - - /** - *
-         * 기동의발송여부: 1
-         * Y: 기동의(발송 시점 전 수신동의 및 전자주소가 생성되어있는 고객)
-         * N: 미동의(발송 시점까지 수신동의 및 전자주소가 생성되어있지 않은 고객)
-         * 
- */ - @Schema(title = "기동의발송여부", example = "2", allowableValues = {"Y", "N"}) - @Size(max = 1, message = "기동의발송여부는 1자리 입니다(Y|N)") - private String prevApproveYn; - - /** - * API 정의서에 없는 필드 : 업무 편의를 위해 추가 - */ - @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "발송결과코드메세지", example = "MMS/RCS 발송 수신성공") - @Size(max = 100, message = "발송결과코드메세지는 100자를 넘을 수 없습니다") - private String mmsRsltDvcdMsg; - - /** - * MENS 업무처리를 위한 추가 항목 - */ - @Schema(title = "발송구분코드", example = " ") - private String sndngSeCode; - } - //------------------------------------------------------------------- - // 메세지 발송/수신결과 전송 - //------------------------------------------------------------------- -} diff --git a/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsDTO.java b/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsDTO.java index 6025dc2..0b8bd67 100644 --- a/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsDTO.java +++ b/mens-core/src/main/java/kr/xit/biz/ens/model/ktgbs/KtGbsDTO.java @@ -1,10 +1,35 @@ package kr.xit.biz.ens.model.ktgbs; +import java.util.List; + +import javax.validation.Valid; +import javax.validation.constraints.Digits; +import javax.validation.constraints.Size; + +import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +import io.swagger.v3.oas.annotations.media.Schema; +import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO; +import kr.xit.biz.ens.model.kt.KtCommonDTO; +import kr.xit.core.model.IApiResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + /** *
  * description : 
  * packageName : kr.xit.biz.ens.model.ktgbs
- * fileName    : KtGbsDTO
+ * fileName    : KtGbsApiDTO
  * author      : limju
  * date        : 2024-08-19
  * ======================================================================
@@ -15,4 +40,579 @@ package kr.xit.biz.ens.model.ktgbs;
  * 
*/ public class KtGbsDTO { + + //------------------------------------------------------------------- + // 메세지 발송 + //------------------------------------------------------------------- + @Schema(name = "MsgSendRequest DTO", description = "메세지 발송 요청 request DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @EqualsAndHashCode(callSuper = false) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class MsgSendRequest extends KtCommonDTO.KtMnsRequest { + /** + * 기관코드 - 필수(5자리) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "기관코드", example = "51110") + @Size(min = 5, max = 5, message = "기관코드는 필수 입니다(5자리)") + private String serviceCd; + + /** + * 문서코드 - 필수(5자리) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서코드", example = "DP112") + @Size(min = 5, max = 5, message = "기관코드는 필수 입니다(5자리)") + private String msgCd; + + /** + * 생성일시 - 필수(14자리) : yyyymmddHHmiss + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "생성일시", example = "20240819123456") + @Size(min = 5, max = 5, message = "생성일시는 필수 입니다(14자리)") + private String makeDt; + + /** + * 회차전체데이터건수 - 필수(max:8자리) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "회차전체데이터건수", example = " ") + @Digits(integer = 8, fraction = 0, message = "회차전체데이터건수(max:8자리)") + private Integer dataCnt; + + /** + * 발송마감시간 - 필수(yyyyMMddHHmiss : 14자리) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송마감시간(yyyyMMddHHmiss)", example = " ") + @Size(min = 14, max = 14, message = "발송마감시간(yyyyMMddHHmiss)") + private String sendExTime; + + /** + * 열람마감시간 - 필수(yyyyMMddHHmiss : 14자리) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "열람마감시간(yyyyMMddHHmiss)", example = " ") + @Size(min = 14, max = 14, message = "열람마감시간(yyyyMMddHHmiss)") + private String exTime; + + /** + * 문서종류 - 필수(3자리 : sms|lms|mms) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서종류(sms|lms|mms)", example = "mms", allowableValues = { + "sms", "lms", "mms"}) + @Size(min = 3, max = 3, message = "문서종류(sms|lms|mms)") + @JsonProperty("m_type") + private String mType; + + /** + * 발송메세지타입 - 필수(1자리 : 1-RCS, 2-xMS) + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송메세지타입(1-RCS, 2-xMS)", example = " ", allowableValues = { + "1", "2"}) + @Size(min = 1, max = 1, message = "발송메세지타입(1-RCS, 2-xMS)") + private String msgType; + + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) + @Valid + private List reqs; + + /** + * 발신번호(서비스기관발송전화번호) + */ + @Schema(title = "발신번호", example = " ") + @Size(max = 20, message = "발신번호(max:20)") + private String sndTelNo; + + /** + * 메세지발송구분 + */ + @Schema(title = "메세지발송구분", example = " ") + @Digits(integer = 8, fraction = 0, message = "메세지발송구분(max:1자리)") + private Integer optType; + } + + + @Schema(name = "MsgSendReqsData", description = "메세지 발송 요청 reqs DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class MsgSendReqsData { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + * 관리키 : 고객메시지 건별 Unique key + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000011") + @NotEmpty(message = "관리키는 필수 입니다(max:50)") + @Size(max = 50) + private String srcKey; + + /** + * 리스트순번 : max 8자리 + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "리스트순번", example = "1") + @NotEmpty(message = "리스트 순번은 필수 입니다(max:8)") + @Size(max = 8) + private String srcSeq; + + /** + * 개인식별코드 : 128 자리 + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "개인식별코드", example = "vMtqVxJX56lBgbf9heK3QTc+jVndTfK77i/UJKAzPmBG4n9CazCdd/8YytlFZnN4qofIqgxHpSoiG0yYzgEpJg==") + @Size(min = 128, max = 128, message = "개인식별코드는 필수 입니다(128자리)") + private String sci; + + /** + *
+         * MMS 상세내용 : max 4000
+         * URL 없음
+         * {#INFO_CFRM_STR}, {#RCVE_RF_STR} 문자열이 없는 경우 요청 거부 처리 함.
+         * 단, 유통정보미생성여부가 'Y'인 경우 {#RCVE_RF_STR} 문자열만 체크.
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 상세내용", example = "{#INFO_CFRM_STR}, {#RCVE_RF_STR}") + @Size(min = 1, max = 4000, message = "MMS 상세내용 필수입니다(max:4000)") + private String mmsDtlCnts; + + /** + *
+         * MMS 제목 : max 40
+         * utf-8 한글20자
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 제목(max:40)", example = "공유재산사용료 정기분") + @Size(min = 1, max = 40, message = "MMS 제목은 필수 입니다(max:40)") + private String mmsTitle; + //------------------------------------------------------------------- + + /** + *
+         * RCS 메세지 상세내용 : max 4000 - RCS|Binary 전송시 필수
+         * RCS 메시지 fallback 시 mms_dtl_cnts를 사용하며
+         * RCS title은 mms_title 항목을 함께 사용한다.
+         * 
+ */ + @Schema(title = "RCS 메세지 상세내용(max:4000)", example = " ") + @Size(max = 4000, message = "RCS 메세지 상세내용은 4000자를 넘을 수 없습니다.") + private String rcsDtlCnts; + + + /** + *
+         * 연결 URL
+         * 
+ */ + @Schema(title = "연결 URL", example = "http://localhost:8081/api/biz/kt/v1/cfmToken") + private String url; + + /** + * 문서해시 : max 64 + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서해시(max:64)", example = "gdlIa53FZGQz5aKa3wLk33nW57N3mDpcwHytWlWMhzxHKulk7EZs143442394326642342364238648423864237") + @Size(max = 64, message = "문서해시 64자를 넘을 수 없습니다.") + private String docHash; + + /** + *
+         * 개인휴대전화번호 : 11 자리
+         * 특정 MDN으로 발송할 경우
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "개인휴대전화번호(max:11)", example = "01093414345") + @Size(max = 11, message = "개인 휴대 전화번호는 11자리 입니다") + private String mdn; + } + //------------------------------------------------------------------- + // 메세지 발송 + //------------------------------------------------------------------- + + + //------------------------------------------------------------------- + // 메세지 발송 및 수신결과 전송 + //------------------------------------------------------------------- + @Schema(name = "MsgRsltRequest", description = "메세지 발송 및 수신결과 전송 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @EqualsAndHashCode(callSuper = false) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class MsgRsltRequest { + /** + *
+         * 기관코드 : 필수 - 5
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "서비스코드", example = " ") + @Size(min = 5, max = 5, message = "서비스코드는 필수 입니다(5자리)") + private String serviceCd; + + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) + @Valid + private List reqs; + } + + @Schema(name = "MsgRsltReqsData", description = "메세지 발송 및 수신결과 전송 reqs DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @EqualsAndHashCode(callSuper = false) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class MsgRsltReqsData extends CmmEnsRequestDTO { + //------------------------------------------------------------------- + // 필수 + //------------------------------------------------------------------- + /** + * 관리키 : 고객메시지 건별 Unique key + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "관리키", example = "S20211229102000001") + @Size(min = 1, max = 50, message = "관리키는 필수 입니다(max:50)") + private String srcKey; + + /** + *
+         * MMS 발송결과 상태 순번 : 필수 - max 8
+         * 1:수신(결과), 열람(결과):2
+         * 
> + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "MMS 발송결과 상태 순번", example = " ", allowableValues = { + "1", "2"}) + @Digits(integer = 8, fraction = 0, message = "MMS 발송결과 상태 순번(1|2)") + private Integer mmsSndgRsltSqno; + + /** + *
+         * 처리일자 : 필수 - 8
+         * 이통사 처리일자
+         * 
> + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "처리일자", example = "20231210") + @Size(min = 8, max = 8, message = "처리일자는 필수 입니다(YYYYMMDD)") + private String prcsDt; + + /** + * 문서코드 : 필수 - 5자리 + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "문서코드", example = "00001") + @Size(min = 5, max = 5, message = "문서코드는 필수 입니다(5자리)") + private String mmsBsnsDvcd; + + /** + *
+         * 모바일사업자구분 : 필수 - 2자리
+         * 발송 통신사 구분(01:KT, 02:SKT, 03:LGT)
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "모바일사업자구분", example = "01", allowableValues = {"01","02","03"}) + @Size(min = 2, max = 2, message = "모바일 사업자 구분은 필수 입니다(01|02|03)") + private String mblBzowrDvcd; + + /** + *
+         * TODO::결과코드에 따른 메세지 처리 필요
+         * 발송결과코드 : 필수 - 2자리
+         * 40	MMS/RCS 발송	수신성공
+         * 41	MMS발송	메시지 내용 스팸
+         * 42	MMS발송	착신자 스팸
+         * 43	MMS발송	레포트 수신 시간 만료(메시지전송후 24시간 레포트 못받는 경우 )
+         * 47	MMS발송	비가입자, 결번, 서비스정지
+         * 48	MMS발송	단말기 전원 꺼짐
+         * 49	MMS발송	기타
+         * 4A	MMS발송	UNKNOWN/단말기형식오류(스팸설정)
+         * 4D	MMS발송	전송 실패(무선망), 단말기 일시정지
+         * 4J	MMS발송	비가용폰 오류
+         * 4N	MMS발송	수신거부
+         * 4O	MMS발송	LMS발송오류(시간초과)
+         * 4P	MMS발송	LMS발송오류(기타)
+         * 4T	MMS발송	가입자미존재(미동의포함)
+         * 4Q	MMS발송	수신대기
+         * 4R	MMS발송	다회선 제외
+         * 4V	MMS발송	수신등록 휴대폰번호 미존재
+         * 4W	MMS발송	기동의 사전문자 제외
+         * 50	수신확인	수신성공
+         * 60	열람확인	열람확인 (MMS발송결과순번=2, 열람타임스탬프가 있는 경우)
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송결과코드", example = "40") + @Size(min = 2, max = 2, message = "발송결과코드는 필수 입니다") + private String mmsRsltDvcd; + //private String mmsSndgRsltDvcd; + + /** + *
+         * 발송타임스탬프 : 필수 - 14
+         * YYYYMMDDHHMISS
+         * 
> + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송타임스탬프", example = "20241030121000") + @Size(min = 14, max = 14, message = "발송타임스탬프는 필수 입니다(YYYYMMDDHHMISS)") + private String mmsSndgTmst; + + /** + *
+         * 문발송 메시지 타입: 필수 - 1
+         * RCS/xMS (RCS :1, xMS: 2)
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송 메시지 타입", example = "2", allowableValues = {"1", + "2"}) + @Size(min = 1, max = 1, message = "발송 메시지 타입은 필수 입니다") + private String msgType; + //------------------------------------------------------------------- + + /** + *
+         * 실제발송번호(일부) : max 20
+         * 고객휴대폰번호 일부 (****0323)
+         * 
+ */ + @Schema(title = "실제발송번호(일부)", example = " ") + @Size(max = 20, message = "실제발송번호(일부)는 20자를 넘을 수 없습니다.") + private String rlMmsSndgTelno; + + /** + *
+         * 수신타임스탬프 : 14
+         * 수신시(mms_sndg_rslt_sqno 코드값이 1인 경우) 필수
+         * 
> + */ + @Schema(title = "수신타임스탬프", example = " ") + @Size(max = 14, message = "수신타임스탬프는 14자리 입니다") + private String mmsRcvTmst; + + /** + *
+         * 열람타임스탬프 : 14
+         * 열람시(mms_sndg_rslt_sqno 코드값이 2인 경우) 필수
+         * 
> + */ + @Schema(title = "열람타임스탬프", example = " ") + @Size(max = 14, message = "열람타임스탬프는 14자리 입니다") + private String mmsRdgTmst; + + /** + *
+         * 기동의발송여부: 1
+         * Y: 기동의(발송 시점 전 수신동의 및 전자주소가 생성되어있는 고객)
+         * N: 미동의(발송 시점까지 수신동의 및 전자주소가 생성되어있지 않은 고객)
+         * 
+ */ + @Schema(title = "기동의발송여부", example = "2", allowableValues = {"Y", "N"}) + @Size(max = 1, message = "기동의발송여부는 1자리 입니다(Y|N)") + private String prevApproveYn; + + /** + * API 정의서에 없는 필드 : 업무 편의를 위해 추가 + */ + @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "발송결과코드메세지", example = "MMS/RCS 발송 수신성공") + @Size(max = 100, message = "발송결과코드메세지는 100자를 넘을 수 없습니다") + private String mmsRsltDvcdMsg; + + /** + * MENS 업무처리를 위한 추가 항목 + */ + @Schema(title = "발송구분코드", example = " ") + private String sndngSeCode; + } + //------------------------------------------------------------------- + // 메세지 발송/수신결과 전송 + //------------------------------------------------------------------- + + + //------------------------------------------------------------------- + // token + //------------------------------------------------------------------- + /** + *
+     * KT GIBIS Token 발행
+     * Request : TokenRequest
+     * Response : TokenResponse
+     * 
+ */ + @Schema(name = "TokenRequest", description = "KT GIBIS 토큰발행 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class TokenRequest { + /** + * 과태료 코드 + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "클라이언트 ID", example = " ") + @NotEmpty(message = "클라이언트 ID는 필수 입니다") + @Size(max = 500) + private String clientId; + + /** + * 클라이언트 secret + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "클라이언트 secret", example = " ") + @NotEmpty(message = "클라이언트 secret는 필수 입니다") + @Size(max = 500) + private String clientSecret; + } + + @Schema(name = "TokenResponse", description = "KT GIBIS 토큰발행 요청 결과 DTO") + @Getter + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + public static class TokenResponse implements IApiResponse { + //------------------------------------------------------------------- + // 토큰 발행 성공시 필수 + //------------------------------------------------------------------- + /** + * 접근토큰 : 성공시 필수 + */ + @Size(max = 1000) + private String accessToken; + + /** + *
+         * 접근 토큰 유형 : 성공시 필수
+         * bearer 고정
+         * 
+ */ + @Size(max = 100) + private String tokenType; + + /** + * 접근 토큰 유효 기간(초) : 성공시 필수수 + */ + @Size(max = 100) + private String expiresIn; + + /** + *
+         * 접근토큰 권한범위 : 성공시 필수
+         * 또는, 실패시 scope에러인 경우 발생
+         * 
+ */ + @Size(max = 100) + private String scope; + //------------------------------------------------------------------- + + //------------------------------------------------------------------- + // 토큰 발행 실패시 필수 + //------------------------------------------------------------------- + private String timestamp; + + /** + * 에러코드: 실패시 필수 + */ + @Size(max = 100) + private String status; + + /** + *
+         * 에러명
+         * 
+ */ + @Size(max = 100) + private String error; + + /** + * 에러메세지 + */ + @Size(max = 1000) + private String message; + + /** + * 경로 + */ + @Size(max = 1000) + private String path; + } + + /** + *
+     * KT GIBIS Token 인증 확인 조회 : BC-AG-SN-008
+     * Request : KtTokenConfirmRequest
+     * Response : KtTokenConfirmResponse
+     * 
+ */ + @Schema(name = "TokenConfirmRequest", description = "KT GIBIS 토큰 인증 확인 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + @EqualsAndHashCode(callSuper = false) + public static class TokenConfirmRequest extends KtCommonDTO.KtMnsRequest { + /** + *
+         * 기관코드 : 필수 - 5
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "기관코드", example = " ") + @NotEmpty(message = "기관코드는 필수 입니다(max:5)") + private String serviceCd; + + /** + *
+         * 관리키 : 필수 - max:50
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "관리키", example = " ") + @Size(min = 1, max = 50, message = "관리키는 필수 입니다(max:50)") + private String srcKey; + + /** + *
+         * 토큰 : 필수 - max 128
+         * 
+ */ + @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "토큰", example = " ") + @NotEmpty(message = "토큰은 필수 입니다") + private String token; + } + + @Schema(name = "TokenReadRequest", description = "KT GIBIS 열람확인 결과 전송 요청 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) + @EqualsAndHashCode(callSuper = true) + public static class TokenReadRequest extends KtCommonDTO.KtMnsRequest { + /** + *
+         * 기관코드 : 필수 - 5
+         * BizCenter에서 발행한 기관의 서비스 코드
+         * 
> + */ + private String serviceCd; + + /** + *
+         * 토큰 : 필수 - max 150
+         * 
+ */ + private String accessToken; + + /** + *
+         * 열람일시 : 14자 필수
+         * 
> + */ + private String mmsRdgTmst; + } + //------------------------------------------------------------------- + // token + //------------------------------------------------------------------- + }