feat: lettngnrlmber_api_send_msg_log 처리 완료

This commit is contained in:
hylee 2023-06-15 11:36:43 +09:00
parent 1f0e5f9769
commit ecc7e0042f
10 changed files with 265 additions and 63 deletions

View File

@ -5,15 +5,19 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.itn.mjonApi.cmn.idgen.service.IdgenService;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.msg.SendSucRestResponse;
import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.mjon.api.inqry.service.mapper.domain.HstryResponse;
import com.itn.mjonApi.mjon.log.service.mapper.LettnAccessLogMapper;
import com.itn.mjonApi.mjon.log.service.mapper.LettnApiSendMsgLogMapper;
import com.itn.mjonApi.mjon.log.service.mapper.domain.LettnAccessLogVO;
import com.itn.mjonApi.mjon.log.service.mapper.domain.LettnApiSendMsgLogVO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
@ -23,6 +27,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.stream.Collectors;
/**
* packageName : com.itn.mjonApi.cmn.aop
@ -44,9 +49,15 @@ public class LogAspect {
@Autowired
LettnAccessLogMapper lettnAccessLogMapper;
@Autowired
LettnApiSendMsgLogMapper lettnApiSendMsgLogMapper;
@Resource(name = "apiAccessLog")
private IdgenService idgenApiAccessLogId;
@Resource(name = "apiSendLog")
private IdgenService idgenApiSendLogId;
/**
* @description com.itn.mjonApi.mjon.api 패키지 하위에 모든 *Impl 클래스의 모든 메소드 실행
* @param joinPoint
@ -55,7 +66,6 @@ public class LogAspect {
* - accessKey
*/
@Before(value = "execution(* com.itn.mjonApi.mjon.api.*..*Impl.*(..))" )
// @Before(value = "execution(* com.itn.mjonApi.mjon.api.send.service.impl.SendServiceImpl.*(..))" )
public void before(JoinPoint joinPoint) throws IllegalAccessException {
log.info(" :: AOP before :: ");
@ -64,6 +74,8 @@ public class LogAspect {
// VO 객체를 가져옴
Object objectVO = joinPoint.getArgs()[0];
// VO 객체의 필드값을 가져옴
// 각각 메소드들의 매개변수VO가 다름으로
// 필드명으로 구분하여 값을 가져옴
@ -75,6 +87,7 @@ public class LogAspect {
if("accessKey".equals(field.getName())){ accessKey=field.get(objectVO).toString(); }
}
String nextStringId = idgenApiAccessLogId.getNextStringId();
LettnAccessLogVO lettnAccessLogVO = new LettnAccessLogVO()
.builder()
@ -114,6 +127,8 @@ public class LogAspect {
String logId = (String) request.getAttribute("logId");
// lettngnrlmber_access_log 응답값 Udpate
LettnAccessLogVO lettnAccessLogVO = new LettnAccessLogVO()
.builder()
@ -121,6 +136,91 @@ public class LogAspect {
.resCn(this.getJsonToString(returnValue))
.build();
lettnAccessLogMapper.update(lettnAccessLogVO);
String methodNm = getMethodSignature(joinPoint);
if("sendMsgData".equals(methodNm) || "sendMsgsData".equals(methodNm)){
String resultCode = this.getResultCodeString(returnValue);
// resultCode == 0 : 문자 발송이 성공일
if("0".equals(resultCode)){
LettnApiSendMsgLogVO apiSendMsgLogVO = this.makeApiSendMsgLogVO(returnValue, logId, methodNm);
lettnApiSendMsgLogMapper.insert(apiSendMsgLogVO);
}
}
}
/**
* @description lettngnrlmber_api_send_msg_log 테이블에 저장할 데이터 만들기
* @param returnValue
* @param logId
* @param methodNm
* @return
*/
private LettnApiSendMsgLogVO makeApiSendMsgLogVO(Object returnValue, String logId, String methodNm) {
RestResponse restResponse = (RestResponse) returnValue;
SendSucRestResponse SendSucRestResponse = (SendSucRestResponse) restResponse.getData();
String msgGroupId = null;
String msgSendType = null;
if("sendMsgData".equals(methodNm)){
msgSendType = "msg";
msgGroupId = SendSucRestResponse.getMsgGroupId();
}
else if("sendMsgsData".equals(methodNm)){
msgSendType = "msgs";
// msgGroupId = SendSucRestResponse.getMsgGroupIdList().toString();
// list to String
msgGroupId = SendSucRestResponse.getMsgGroupIdList().stream()
.map(n -> String.valueOf(n))
.collect(Collectors.joining("," ));
}
return LettnApiSendMsgLogVO.builder()
.logNo(idgenApiSendLogId.getNextStringId())
.mberId(logId)
.msgSendType(msgSendType)
.msgGroupId(msgGroupId)
.build();
}
/**
* @description returnCode 가져옴
* @param returnValue
* @return
* @throws IllegalAccessException
*/
private static String getResultCodeString(Object returnValue) throws IllegalAccessException {
RestResponse restResponse = (RestResponse) returnValue;
Object data = restResponse.getData();
String resultCode = "";
for(Field field : data.getClass().getDeclaredFields()){
field.setAccessible(true);
if("resultCode".equals(field.getName())){ resultCode =field.get(data).toString(); }
}
return resultCode;
}
/**
* @description JoinPoint에서 method name 가져옴
* @param joinPoint
* @return
*/
@NotNull
private static String getMethodSignature(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
return signature.getMethod().getName();
}
@ -167,11 +267,7 @@ public class LogAspect {
// .registerModule(new JavaTimeModule()) : LocalDateTime을 json으로 변환하기 위함
return objectMapper.registerModule(new JavaTimeModule()).writeValueAsString(restResponse);
}
private static String getHstryResponseVOToJsonString(HstryResponse hstryResponse) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
// .registerModule(new JavaTimeModule()) : LocalDateTime을 json으로 변환하기 위함
return objectMapper.registerModule(new JavaTimeModule()).writeValueAsString(hstryResponse);
}
/**
* @description : VO를 json으로 변환
* @param accessKeyVO

View File

@ -22,7 +22,7 @@ import org.springframework.context.annotation.Configuration;
public class ContextIdgen {
/**
* @discription apiLog Ids
* @discription apiLoginLog Ids
* @return
*/
@Bean(name="apiLoginLog")
@ -35,7 +35,7 @@ public class ContextIdgen {
return idgenServiceImpl;
}
/**
* @discription apiLog Ids
* @discription apiAccessLog Ids
* @return
*/
@Bean(name="apiAccessLog")
@ -43,10 +43,22 @@ public class ContextIdgen {
IdgenServiceImpl idgenServiceImpl = new IdgenServiceImpl();
idgenServiceImpl.setCipers(10); // cipers: prefix를 제외한 아이디의 길이 지정
idgenServiceImpl.setFillChar('0'); // fillChar: 0을 대신하여 표현되는 문자
// idgenServiceImpl.setPrefix("APILOG_"); // prefix: 아이디의 앞에 고정적으로 붙이고자 하는 설정값 지정
idgenServiceImpl.setPrefix("APIACCLOG_"); // prefix: 아이디의 앞에 고정적으로 붙이고자 하는 설정값 지정
idgenServiceImpl.setTableName("API_ACCESS_LOG_ID"); // tableName - dataSoure 설정된 DB에 SEQ 테이블에 tableName 컬럼에 참조할
return idgenServiceImpl;
}
/**
* @discription apiAccessLog Ids
* @return
*/
@Bean(name="apiSendLog")
public IdgenServiceImpl apiSendLog(){
IdgenServiceImpl idgenServiceImpl = new IdgenServiceImpl();
idgenServiceImpl.setCipers(9); // cipers: prefix를 제외한 아이디의 길이 지정
idgenServiceImpl.setFillChar('0'); // fillChar: 0을 대신하여 표현되는 문자
idgenServiceImpl.setPrefix("APISENDLOG_"); // prefix: 아이디의 앞에 고정적으로 붙이고자 하는 설정값 지정
idgenServiceImpl.setTableName("API_SEND_MSG_ID"); // tableName - dataSoure 설정된 DB에 SEQ 테이블에 tableName 컬럼에 참조할
return idgenServiceImpl;
}
}

View File

@ -27,14 +27,6 @@ public class RestResponse{
this.data=data;
}
/**
* 실패 생성자
* @param STAT_CODE
*/
public RestResponse(String STAT_CODE) {
this.resultCode=StatMsg.valueOf(STAT_CODE).getCode();
this.data=StatMsg.valueOf(STAT_CODE).getMsg();
}
}

View File

@ -0,0 +1,33 @@
package com.itn.mjonApi.cmn.msg;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SendFailRestResponse {
private String resultCode; // 오류 코드
private String msg; // 메세지
private String test_yn; // 메세지
/**
* 실패 생성자
* @param STAT_CODE
*/
public SendFailRestResponse(String STAT_CODE) {
this.resultCode=StatMsg.valueOf(STAT_CODE).getCode();
this.msg=StatMsg.valueOf(STAT_CODE).getMsg();
this.test_yn="YF";
}
}

View File

@ -13,12 +13,9 @@ import java.util.stream.Collectors;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SendSuccessRestResponse {
public class SendSucRestResponse {
//private HttpStatus status;
// private String resultCode; // 성공 코드
// private String message; // 메세지
private String resultCode="0"; // 성공 코드
private String msgGroupId; // 문자 전송 그룹 아이디
@ -32,11 +29,8 @@ public class SendSuccessRestResponse {
private String msgType; // 메세지 타입
// private LocalDateTime localDateTime;
private String test_yn; // 메세지 타입
/*
* 200-OK : 정상접속
* */
/**
@ -44,14 +38,15 @@ public class SendSuccessRestResponse {
* @param mjonResponseVO
* @return
*/
public static SendSuccessRestResponse convertMjonDataToApiResponse(MjonResponseVO mjonResponseVO) {
public static SendSucRestResponse convertMjonDataToApiResponse(MjonResponseVO mjonResponseVO) {
return SendSuccessRestResponse.builder()
return SendSucRestResponse.builder()
.resultCode("0")
.msgGroupId(mjonResponseVO.getMsgGroupId()) // 전송 메세지 그룹 ID
.successCnt(mjonResponseVO.getResultSts()) // 성공 건수
.blockCnt(mjonResponseVO.getResultBlockSts()) // 수신거부 건수
// .localDateTime(LocalDateTime.now()) // 현재 시간
.failCnt("0")
.msgType(StatMsg.valueOf("msgType"+mjonResponseVO.getMsgType()).getMsg())
.build();
@ -62,7 +57,7 @@ public class SendSuccessRestResponse {
* @param mjonResponseVOList
* @return
*/
public static SendSuccessRestResponse SendSuccessMsgsRestResponse(List<MjonResponseVO> mjonResponseVOList) {
public static SendSucRestResponse SendSuccessMsgsRestResponse(List<MjonResponseVO> mjonResponseVOList) {
// 실패 카운트
int failCnt = (int) mjonResponseVOList.stream()
@ -89,9 +84,8 @@ public class SendSuccessRestResponse {
return SendSuccessRestResponse.builder()
// .resultCode(StatMsg.valueOf(enumStr).getCode()) // 성공 코드 200 - StatMsg 참고
// .message(StatMsg.valueOf(enumStr).getMsg()) // 성공은 message가 없음 - StatMsg 참고
return SendSucRestResponse.builder()
.resultCode(StatMsg.valueOf("STAT_0").getCode()) // 성공 코드 0 - StatMsg 참고
.msgGroupIdList(msgGroupIdList) // 전송 메세지 그룹 ID
.successCnt(Integer.toString(successCnt)) // 성공 건수
.blockCnt(Integer.toString(blockCnt)) // 수신거부 건수

View File

@ -2,6 +2,7 @@ package com.itn.mjonApi.mjon.api.inqry.service.impl;
import com.itn.mjonApi.cmn.apiServer.ApiService;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.msg.SendFailRestResponse;
import com.itn.mjonApi.mjon.api.inqry.mapper.HstryMapper;
import com.itn.mjonApi.mjon.api.inqry.service.HstryService;
import com.itn.mjonApi.mjon.api.inqry.service.mapper.domain.HstryDetailVO;
@ -209,7 +210,7 @@ public class HstryServiceImpl implements HstryService {
}else{
// 실패 코드 랜덤으로 리턴
// return new RestResponse(StatMsg.randomErrorStatCode());
return new RestResponse("STAT_3099");
return new RestResponse(new SendFailRestResponse("STAT_3099"));
}
}
private RestResponse _getTestHstryListReturnData(String testYn)
@ -236,7 +237,7 @@ public class HstryServiceImpl implements HstryService {
}else{
// 실패 코드 랜덤으로 리턴
// return new RestResponse(StatMsg.randomErrorStatCode());
return new RestResponse("STAT_3099");
return new RestResponse(new SendFailRestResponse("STAT_3099"));
}
}
}

View File

@ -2,7 +2,8 @@ package com.itn.mjonApi.mjon.api.send.service.impl;
import com.itn.mjonApi.cmn.apiServer.ApiService;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.cmn.msg.SendSuccessRestResponse;
import com.itn.mjonApi.cmn.msg.SendFailRestResponse;
import com.itn.mjonApi.cmn.msg.SendSucRestResponse;
import com.itn.mjonApi.cmn.msg.StatMsg;
import com.itn.mjonApi.mjon.api.send.mapper.SendMapper;
import com.itn.mjonApi.mjon.api.send.mapper.domain.MjonResponseVO;
@ -99,7 +100,7 @@ public class SendServiceImpl implements SendService {
// convertMjonDataToApiResponse => MjonResponseVO 데이터를 ApiResponse 데이터로 변환하는 메소드
if(!munjaSendResponse.getResult().equals("fail")){ // 성공
return new RestResponse(SendSuccessRestResponse.convertMjonDataToApiResponse(munjaSendResponse));
return new RestResponse(SendSucRestResponse.convertMjonDataToApiResponse(munjaSendResponse));
}else{ // 실패
return new RestResponse(this.convertMjonDataToApiResponse(munjaSendResponse));
}
@ -118,10 +119,13 @@ public class SendServiceImpl implements SendService {
if("YF".equals(testYn))
{
// 실패 코드 랜덤으로 리턴
return new RestResponse(StatMsg.randomErrorStatCode());
return new RestResponse(new SendFailRestResponse(StatMsg.randomErrorStatCode()));
}else{
return new RestResponse(
SendSuccessRestResponse.builder()
SendSucRestResponse.builder()
.msgGroupId("MSGGID_0000000000000") // 전송 메세지 그룹 ID
.successCnt("5") // 성공 건수
.blockCnt("2") // 수신거부 건수
@ -137,16 +141,24 @@ public class SendServiceImpl implements SendService {
// YF => 실패 테스트 데이터
if("YF".equals(testYn))
{
// 실패 코드 랜덤으로 리턴
return new RestResponse(StatMsg.randomErrorStatCode());
}else{
return new RestResponse(new SendFailRestResponse(StatMsg.randomErrorStatCode()));
}else{ // YS => 성공 테스트 데이터
List<String> gIdList = new ArrayList<>();
gIdList.add("MSGGID_0000000000000");
gIdList.add("MSGGID_0000000000001");
gIdList.add("MSGGID_0000000000002");
return new RestResponse(
SendSuccessRestResponse.builder()
.msgGroupId("MSGGID_0000000000000") // 전송 메세지 그룹 ID
.successCnt("5") // 성공 건수
.blockCnt("2") // 수신거부 건수
SendSucRestResponse.builder()
.msgGroupIdList(gIdList) // 전송 메세지 그룹 ID
.successCnt("2") // 성공 건수
.blockCnt("1") // 수신거부 건수
.msgType("LMS")
.failCnt("0")
.test_yn("YS")
.build()
);
}
@ -206,17 +218,17 @@ public class SendServiceImpl implements SendService {
}
return new RestResponse(SendSuccessRestResponse.SendSuccessMsgsRestResponse(mjonResponseVOList));
return new RestResponse(SendSucRestResponse.SendSuccessMsgsRestResponse(mjonResponseVOList));
}
private static RestResponse callToErrorReturnData(MsgRequestVO msgRequestVO) {
RestResponse restResponse = new RestResponse("STAT_1020");
String errorMsg = restResponse.getData().toString();
SendFailRestResponse stat1020 = new SendFailRestResponse("STAT_1020");
String errorMsg = stat1020.getMsg();
errorMsg.replace("수신자", "수신자(" + msgRequestVO.getCallToList()[0] + ")");
restResponse.setData(errorMsg);
stat1020.setMsg(errorMsg);
return restResponse;
return new RestResponse(stat1020);
}
/**

View File

@ -0,0 +1,12 @@
package com.itn.mjonApi.mjon.log.service.mapper;
import com.itn.mjonApi.mjon.log.service.mapper.domain.LettnApiSendMsgLogVO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface LettnApiSendMsgLogMapper {
int insert(LettnApiSendMsgLogVO lettnApiSendMsgLogVO);
}

View File

@ -4,10 +4,7 @@ package com.itn.mjonApi.mjon.log.service.mapper.domain;
comment : '내문자 보관함';
*/
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;
import java.io.Serializable;
@ -15,16 +12,14 @@ import java.io.Serializable;
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LettnApiSendMsgLogVO implements Serializable {
private String LOG_NO; // access log 고유번호
private String MBER_ID; // 일반회원ID
private String MSG_GROUP_ID; // 문자 그룹 ID
private String REQ_REGIST_PNTTM; // 요청등록일시
private String REQ_REGISTER_ID; // 요청등록자ID
private String RES_UPDT_PNTTM; // 응답수정일시
private String RES_UPDUSR_ID;//응답수정자ID
private String logNo; // access log 고유번호
private String mberId; // 일반회원ID
private String msgSendType; // 문자 : msg 대량문자 : msgs
private String msgGroupId; // 문자 그룹 ID
}

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itn.mjonApi.mjon.log.service.mapper.LettnApiSendMsgLogMapper">
<!-- 공통 테이블 명 -->
<sql id="table_name">
lettngnrlmber_api_send_msg_log
</sql>
<!-- select용 공통 컬럼 명 -->
<sql id="select_column_name">
LOG_NO
, MBER_ID
, MSG_SEND_TYPE
, MSG_GROUP_ID
, REQ_REGIST_PNTTM
, REQ_REGISTER_ID
, RES_UPDT_PNTTM
, RES_UPDUSR_ID
</sql>
<!-- 저장용 공통 컬럼 명 -->
<sql id="insert_column_name">
LOG_NO
, MBER_ID
, MSG_SEND_TYPE
, MSG_GROUP_ID
, REQ_REGIST_PNTTM
, REQ_REGISTER_ID
</sql>
<!-- access_key 정보 등록 C -->
<insert id="insert">
INSERT INTO <include refid="table_name"/> (
<include refid="insert_column_name"/>
)
VALUE (
#{logNo}
, #{mberId}
, #{msgSendType}
, #{msgGroupId}
, now()
, #{mberId}
)
</insert>
</mapper>