From bc09c23a0d2fde49c745804b533e9bd1bcdade51 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Tue, 26 Aug 2025 14:53:52 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=EC=86=A1=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8,=20=EC=83=81=EC=84=B8=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inqry/service/Impl/InqryServiceImpl.java | 3 + .../at/send/mapper/domain/VarListMapVO.java | 2 +- .../service/AtParameterProcessingService.java | 125 +++++++++ .../send/service/impl/SendAtServiceImpl.java | 18 +- .../java/com/itn/mjonApi/util/MunjaUtil.java | 2 +- src/main/resources/application-dev.properties | 11 +- src/main/resources/log4jdbc.log4j2.properties | 20 +- src/main/resources/logback-spring.xml | 17 ++ .../mapper/api/msg/inqry/HstryMapper.xml | 73 ++--- .../com/itn/mjonApi/common/TestUtils.java | 249 ++++++++++++++++++ 10 files changed, 471 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/AtParameterProcessingService.java create mode 100644 src/test/java/com/itn/mjonApi/common/TestUtils.java diff --git a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/inqry/service/Impl/InqryServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/inqry/service/Impl/InqryServiceImpl.java index 92560db..f25e10d 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/inqry/service/Impl/InqryServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/inqry/service/Impl/InqryServiceImpl.java @@ -152,6 +152,9 @@ public class InqryServiceImpl implements InqryService { private @Nullable RestResponse isSenderKeyChk(BizTemplateRequest bizTemplateRequest) { List chnlIdList = this.getChnlId(bizTemplateRequest.getMberId()); + log.info("bizTemplateRequest.getSenderKey() :: [{}]", bizTemplateRequest.getSenderKey()); + log.info("chnlIdList :: [{}]", chnlIdList.toString()); + boolean skErr = chnlIdList.stream() .anyMatch(p -> bizTemplateRequest.getSenderKey().equals(p.getSenderKey())); if(!skErr){ diff --git a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/mapper/domain/VarListMapVO.java b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/mapper/domain/VarListMapVO.java index b804a8b..76a4e96 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/mapper/domain/VarListMapVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/mapper/domain/VarListMapVO.java @@ -14,7 +14,7 @@ public class VarListMapVO { /** * @description : 수신자번호 */ - private String callTo; + private String callToList; /** * @description : 카카오 내용 diff --git a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/AtParameterProcessingService.java b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/AtParameterProcessingService.java new file mode 100644 index 0000000..69e5650 --- /dev/null +++ b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/AtParameterProcessingService.java @@ -0,0 +1,125 @@ +package com.itn.mjonApi.mjon.api.kakao.at.send.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.itn.mjonApi.cmn.domain.biz.template.BizTemplateRequest; +import com.itn.mjonApi.cmn.domain.biz.template.detail.TemplateDetailResponse; +import com.itn.mjonApi.cmn.msg.RestResponse; +import com.itn.mjonApi.mjon.api.kakao.at.inqry.mapper.domain.MjKakaoProfileInfoVO; +import com.itn.mjonApi.mjon.api.kakao.at.inqry.service.InqryService; +import com.itn.mjonApi.mjon.api.kakao.at.send.mapper.domain.MsgAtRequestVO; +import com.itn.mjonApi.mjon.api.kakao.at.send.mapper.domain.VarListMapVO; +import com.itn.mjonApi.util.MunjaUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +/** + * fileName : AtParameterProcessingService.java + * author : hylee + * date : 2025-08-18 + * description : 알림톡 파라미터 처리 서비스 + * MsgAtRequestVO의 비즈니스 로직을 담당 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-08-18 hylee 최초 생성 + */ +@Slf4j +@Service +public class AtParameterProcessingService { + + @Autowired + private IndexedParameterParserService indexedParameterParserService; + + @Autowired + private InqryService inqryService; + + /** + * HttpServletRequest에서 동적으로 인덱스된 파라미터들을 파싱하고 검증하여 + * MsgAtRequestVO의 varListMap에 설정 + * + * @param msgAtRequestVO 요청 VO 객체 + * @param request HTTP 요청 객체 + * @return 검증 실패 시 오류 코드, 성공 시 null + */ + public String processIndexedParameters(MsgAtRequestVO msgAtRequestVO, HttpServletRequest request) { + + // 기존 varListMap 초기화 + msgAtRequestVO.setVarListMap(new ArrayList<>()); + + + // 채널ID 확인 + String STAT_2010 = this.validateSenderKey(msgAtRequestVO.getMberId(), msgAtRequestVO.getSenderKey()); + if (STAT_2010 != null) return STAT_2010; + + // 템플릿 코드 확인 + String STAT_2030 = this.validateTemplateCode(msgAtRequestVO.getMberId(), msgAtRequestVO.getSenderKey(), msgAtRequestVO.getTemplateCode()); + if (STAT_2030 != null) return STAT_2030; + + // 파싱 로직을 IndexedParameterParserService에 위임 + List parsedList = indexedParameterParserService.parseIndexedParameters(msgAtRequestVO, request); + + // 파싱된 각 VO에 대해 검증 수행 + for (VarListMapVO vo : parsedList) { + String validationError = MunjaUtil.kakaoCmnValidate(vo, msgAtRequestVO.getSubMsgSendYn()); + + if (StringUtils.isNotEmpty(validationError)) { + return validationError; // 검증 실패 시 오류 코드 반환 + } + + // 검증 통과한 VO를 리스트에 추가 + msgAtRequestVO.getVarListMap().add(vo); + } + + return null; // 모든 검증 통과 + } + + private String validateTemplateCode(String mberId, String senderKey, String templateCode) { + try { + BizTemplateRequest request = BizTemplateRequest.builder() + .mberId(mberId) + .senderKey(senderKey) + .templateCode(templateCode) + .build(); + + RestResponse response = inqryService.getTemplateDetail(request); + JsonNode node = new ObjectMapper().valueToTree(response.getData()); + // 전체 출력 +// log.info("data 전체 :: {}", node.toPrettyString()); + // resultCode가 있으면 채널ID 오류 + inqryService.getTemplateDetail 참조 + if (node.has("resultCode")) { + return "STAT_"+node.get("resultCode").asText(); + } + + TemplateDetailResponse detail = (TemplateDetailResponse) + response.getData(); + + // 템플릿 상세 정보 활용 + log.info("template detail :: [{}]", detail); + return "200".equals(detail.getCode()) ? null : "STAT_2030"; + + } catch (Exception e) { + e.printStackTrace(); + return "STAT_2099"; + } + } + + public String validateSenderKey(String mberId, String senderKey) { + if (StringUtils.isEmpty(senderKey)) { + return "STAT_2010"; + } + List resultList = inqryService.getChnlId(mberId); + boolean ok = resultList.stream().anyMatch(p -> senderKey.equals(p.getSenderKey())); + return ok ? null : "STAT_2010"; + } + + + + +} \ No newline at end of file diff --git a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/impl/SendAtServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/impl/SendAtServiceImpl.java index 97d5c66..e188a68 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/impl/SendAtServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/kakao/at/send/service/impl/SendAtServiceImpl.java @@ -9,6 +9,8 @@ import com.itn.mjonApi.mjon.api.kakao.at.send.service.AtParameterProcessingServi import com.itn.mjonApi.mjon.api.kakao.at.send.service.SendAtService; import com.itn.mjonApi.mjon.api.msg.inqry.mapper.PriceMapper; import com.itn.mjonApi.mjon.api.msg.send.mapper.SendMapper; +import com.itn.mjonApi.mjon.api.msg.send.mapper.domain.MjonResponseVO; +import com.itn.mjonApi.mjon.api.msg.send.mapper.domain.SendSucRestResponse; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.Response; import org.apache.commons.lang3.StringUtils; @@ -70,24 +72,22 @@ public class SendAtServiceImpl implements SendAtService { // // // -// MjonResponseVO munjaSendResponse = apiService.postForEntity( -// "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do" -// , msgAtRequestVO -// , String.class -// ); + MjonResponseVO munjaSendResponse = apiService.postForEntity( + "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do" + , msgAtRequestVO + , String.class + ); // convertMjonDataToApiResponse => MjonResponseVO 데이터를 ApiResponse 데이터로 변환하는 메소드 -// log.info(" + munjaSendResponse :: [{}]", munjaSendResponse.toString()); - /* + log.info(" + munjaSendResponse :: [{}]", munjaSendResponse.toString()); if("OK".equals(munjaSendResponse.getResult())){ // 성공 return new RestResponse(SendSucRestResponse.convertMjonDataToApiResponse(munjaSendResponse)); }else{ // 실패 return new RestResponse(new FailRestResponse(munjaSendResponse.getStatCode(),"")); } - */ - return new RestResponse(msgAtRequestVO); +// return new RestResponse(msgAtRequestVO); } } diff --git a/src/main/java/com/itn/mjonApi/util/MunjaUtil.java b/src/main/java/com/itn/mjonApi/util/MunjaUtil.java index d99c011..ec5cb5b 100644 --- a/src/main/java/com/itn/mjonApi/util/MunjaUtil.java +++ b/src/main/java/com/itn/mjonApi/util/MunjaUtil.java @@ -108,7 +108,7 @@ public class MunjaUtil { public static String kakaoCmnValidate(VarListMapVO vo, String subMsgSendYn) { // 수신번호 검증 - String callTo = vo.getCallTo(); + String callTo = vo.getCallToList(); if (MunjaUtil.getCallToChk(callTo)) { return "STAT_1020"; // 수신자 전화번호 오류 } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 29d96a2..33fe245 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -2,7 +2,7 @@ # DB INFO spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.datasource.url=jdbc:log4jdbc:mysql://192.168.0.125:3306/mjon?serverTimezone=Asia/Seoul +spring.datasource.url=jdbc:log4jdbc:mysql://192.168.0.125:3306/mjon_advc?serverTimezone=Asia/Seoul #spring.datasource.url=jdbc:log4jdbc:mysql://139.150.72.157:3306/mjon?serverTimezone=Asia/Seoul spring.datasource.username=mjonUr @@ -10,7 +10,14 @@ spring.datasource.password=mjon!@#$ server.port=8088 -#logging.level.root=info +# Logging Configuration +logging.level.root=info +logging.level.jdbc.sqltiming=info +logging.level.jdbc.resultset=info +logging.level.jdbc.resultsettable=info +logging.level.jdbc.sqlonly=debug +logging.level.jdbc.audit=warn +logging.level.jdbc.connection=warn #??? ?? ?? api.root.url=http://localhost:8080/ diff --git a/src/main/resources/log4jdbc.log4j2.properties b/src/main/resources/log4jdbc.log4j2.properties index a48b3e9..48a146b 100644 --- a/src/main/resources/log4jdbc.log4j2.properties +++ b/src/main/resources/log4jdbc.log4j2.properties @@ -1,2 +1,20 @@ +# log4jdbc 설정 log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator -log4jdbc.dump.sql.maxlinelength=0 \ No newline at end of file + +# SQL 출력 설정 +log4jdbc.dump.sql.maxlinelength=0 +log4jdbc.trim.sql=true +log4jdbc.trim.sql.extrablanklines=false + +# ResultSet 출력 활성화 (가장 중요한 설정) +log4jdbc.dump.sql.select=true +log4jdbc.dump.sql.insert=true +log4jdbc.dump.sql.update=true +log4jdbc.dump.sql.delete=true + +# ResultSet 테이블 형태 출력을 위한 추가 설정 +log4jdbc.dump.fulldebugstacktrace=false +log4jdbc.suppress.generated.keys.exception=false + +# 에러 억제 설정 +log4jdbc.auto.load.popular.drivers=false \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index d2871ac..820b844 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -81,6 +81,23 @@ + + + + + + + + + + + + + + + + +