2023-04-14 17:43 인터셉트 추가하여 로그남기기, IP 체크, 키검증(accessKey, mberId)을 공통으로

처리하도록 하였습니다.

추가로 API의 결과 형태를 json, plain 두가지를 지원하도록 샘플 개발 하였음
This commit is contained in:
myname 2023-04-14 17:45:45 +09:00
parent 4a3b517791
commit 24d392261d
25 changed files with 1483 additions and 12 deletions

21
pom.xml
View File

@ -66,6 +66,27 @@
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
<!-- 수정시 바로 재기동 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- DB Logback -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<!-- JSON Object -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,37 @@
package com.itn.mjonApi.cmn.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.itn.mjonApi.cmn.interceptor.CertificationInterceptor;
/**
* packageName : com.itn.mjonApi.mjon.send.web
* fileName : SendRestController
* author : hylee
* date : 2023-02-15
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-02-15 hylee 최초 생성
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public CertificationInterceptor certificationInterceptor(){
return new CertificationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(certificationInterceptor())
.addPathPatterns("/api/**");
//.excludePathPatterns("/css/**", "/images/**", "/js/**");
}
}

View File

@ -0,0 +1,32 @@
package com.itn.mjonApi.cmn.idgen.mapper.domain;
/*
table : mj_mymsg
comment : '내문자 보관함';
*/
import lombok.*;
import java.io.Serializable;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class AccessKeyVO implements Serializable {
private static final long serialVersionUID = -7865729705175845268L;
private String accessNo; //access_key 고유번호
private String mberId; //일반회원ID
private String accessKey; //access_key
private String useYn; //사용여부Y/N
private String frstRegistPnttm; //최초등록일시
private String frstRegisterId; //최초등록자ID
private String lastUpdtPnttm; //최종수정일시
private String lastUpdusrId; //최종수정자ID
//for access_token
private String accessToken; //access_token 고유번호
private String tokenObj; //access_token 고유번호
private String expirePnttm; //access_token 파기일시
}

View File

@ -0,0 +1,31 @@
package com.itn.mjonApi.cmn.idgen.mapper.domain;
/*
table : mj_mymsg
comment : '내문자 보관함';
*/
import lombok.*;
import java.io.Serializable;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class LettnLoginLogVO implements Serializable {
private static final long serialVersionUID = -7865729705175845268L;
private String logId; //log id
private String conectId; //접속ID
private String conectIp; //접속IP
private String userAt; //사용자 여부
private String deviceType; //device type
private String progrmFileNm; //프로그램파일명
private String menuNo; //메뉴번호
private String menuNm; //메뉴명
private String url; //접속URL
private String creatDt; //생성일자
private int cnt; //count
}

View File

@ -0,0 +1,56 @@
package com.itn.mjonApi.cmn.idgen.mapper.domain;
/*
table : mj_mymsg
comment : '내문자 보관함';
*/
import lombok.*;
import java.io.Serializable;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SendMsgVO implements Serializable {
private static final long serialVersionUID = -7865729705175845268L;
private String accessKey; //인증용 API Key O String
private String mberId; //사용자id O String
private String sender; //발신자 전화번호 (최대 16bytes) O String
private String receiver; //수신자 전화번호 - 컴마(,)분기 입력으로 최대 1천명 O String
private String msg; //메시지 내용 O String (1~2,000Byte)
private String msg_type; //SMS(단문) , LMS(장문), MMS(그림문자) 구분 X String
private String title; //문자제목(LMS,MMS만 허용) X String (1~44Byte)
private String destination; //%치환% 치환명 입력, 수신자 전화번호 수량 만큼 넣어야 한다. X String
private String rdate; //발송일 (현재일이상) X YYYYMMDD
private String rtime; //발송시간 - 현재시간기준 10분이내나 0 이면 바로 발송 X HHII
//private String image1; //첨부이미지 (image 또는 image1) X JPEG,PNG,GIF
//private String image2; //첨부이미지 X JPEG,PNG,GIF
//private String image3; //첨부이미지 X JPEG,PNG,GIF
private String testmodeYn; //연동테스트시 Y 적용 X String
//sendMsg 문자 발송 체크 사항
//step1.발신자 전화번호 사용 가능 여부 체크(해당 사용자의 등록된 번호만 발송 가능)
// 1010
//step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능)
// 1020
//step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 안됨
// 1030
//step4.치환명 정상 여부 확인
// 1040
//step5.발송일시 정상여부 확인
// 1050
//step6.문자 타입에 따른 비용 처리 가능 여부 확인
// 1060
}

View File

@ -0,0 +1,179 @@
package com.itn.mjonApi.cmn.interceptor;
//import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO;
import com.itn.mjonApi.mjon.api.service.AccessKeyService;
import com.itn.mjonApi.mjon.log.service.LettnLoginLogService;
/**
* packageName : com.itn.mjonApi.mjon.send.web
* fileName : SendRestController
* author : hylee
* date : 2023-02-15
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-02-15 hylee 최초 생성
*/
//@Component
public class CertificationInterceptor implements HandlerInterceptor{
@Autowired
private AccessKeyService accessKeyService;
@Autowired
private LettnLoginLogService lettnLoginLogService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//HttpSession session = request.getSession();
System.out.println("=====preHandle=4=apikey==");
System.out.println("=====preHandle=4=apikey=="+request.getRequestURI());
System.out.println("=====preHandle=4=apikey=="+request.getRemoteAddr());
System.out.println("=====preHandle=4=apikey=="+request.getRemoteHost());
System.out.println("=====preHandle=4=apikey=="+request.getRemotePort());
System.out.println("=====preHandle=4=apikey=="+request.getRemoteUser());
System.out.println("=====preHandle=4=apikey=="+request.getRequestedSessionId());
System.out.println("=====preHandle=4=apikey==");
//step0-1.log 남기기
//step0-2.IP 체크
{
try{
//step0-1.log 남기기
LettnLoginLogVO lettnLoginLogVO = new LettnLoginLogVO();
//ip
HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
String ip = req.getHeader("X-FORWARDED-FOR");
if (ip == null){ ip = req.getRemoteAddr();}
lettnLoginLogVO.setConectIp(ip);
//사용자 여부
lettnLoginLogVO.setUserAt("U");
//사용자 ID
lettnLoginLogVO.setConectId(request.getParameter("mberId"));
//device type
if(isMobile(request)){
lettnLoginLogVO.setDeviceType("M");
}else{
lettnLoginLogVO.setDeviceType("P");
}
//program_nm
lettnLoginLogVO.setProgrmFileNm("API");
lettnLoginLogVO.setMenuNm("API");
lettnLoginLogVO.setMenuNo("100");
//url
lettnLoginLogVO.setUrl(request.getRequestURI());
//IP 컬럼 길이를 늘려서 비교 조건 제거함 2023-04-05
if (lettnLoginLogVO.getUrl().length()>200){ //길이문제로 오류가 발생하는 경우도 처리하도록 수정
lettnLoginLogVO.setUrl(lettnLoginLogVO.getUrl().substring(0,199));
}
lettnLoginLogService.insert(lettnLoginLogVO);
//step0-2.IP 체크
lettnLoginLogVO = lettnLoginLogService.selectIgnoreIpCnt(lettnLoginLogVO);
int i_ignoreCnt = lettnLoginLogVO.getCnt();
if (i_ignoreCnt>0) {
//제한 아이피인 경우는 화면 안나옴 처리
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"resultCode\":\"403\",\"message\":\"Forbidden\"}");
return false;
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
//step1. 검증 - accessKey & mberId 검증을 위한 필수값
{
try{
AccessKeyVO accessKeyVO = new AccessKeyVO();
accessKeyVO.setAccessKey(request.getParameter("accessKey"));
accessKeyVO.setMberId(request.getParameter("mberId"));
accessKeyVO = accessKeyService.selectRKey(accessKeyVO);
if (accessKeyVO ==null) {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"resultCode\":\"401\",\"message\":\"Unauthorized\"}");
return false;
}
}catch(Exception ex) {
ex.printStackTrace();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"resultCode\":\"401\",\"message\":\"Unauthorized\"}");
return false;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("=====postHandle=4=apikey==");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("=====afterCompletion=4=apikey==");
}
/*모바일접속 유무*/
private boolean isMobile(HttpServletRequest request) {
String userAgent = request.getHeader("user-agent");
boolean mobile1 = userAgent.matches(".*(iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson).*");
boolean mobile2 = userAgent.matches(".*(LG|SAMSUNG|Samsung).*");
if(mobile1 || mobile2) {
return true;
}
return false;
}
}

View File

@ -0,0 +1,57 @@
package com.itn.mjonApi.cmn.msg;
import lombok.Getter;
import lombok.Setter;
import org.springframework.http.HttpStatus;
import java.time.LocalDateTime;
import java.util.List;
@Setter
@Getter
public class PlainResponse {
//private HttpStatus status;
private int resultCode;
private String message;
private LocalDateTime localDateTime;
private Object object;
private List<?> objectList;
/*
* 200-OK : 정상접속
* 401-Unauthorized : 인증실패
*
* */
public PlainResponse(HttpStatus status, String message, LocalDateTime timestamp) {
this.resultCode = status.value();
checkMessage(status, message);
this.localDateTime = timestamp;
}
public PlainResponse(HttpStatus status, String message, LocalDateTime timestamp, Object object) {
this.resultCode = status.value();
checkMessage(status, message);
this.object= object;
this.localDateTime = timestamp;
}
public PlainResponse(HttpStatus status, String message, LocalDateTime timestamp, List<?> objectList) {
this.resultCode = status.value();
checkMessage(status, message);
this.objectList = objectList;
this.localDateTime = timestamp;
}
private void checkMessage(HttpStatus status, String message) {
if ("".equals(message)){ this.message = status.name();
}else { this.message = message; }
}
}

View File

@ -11,26 +11,47 @@ import java.util.List;
@Getter
public class RestResponse {
private HttpStatus status;
//private HttpStatus status;
private int resultCode;
private String message;
private LocalDateTime localDateTime;
private Object object;
private List<?> objectList;
/*
* 200-OK : 정상접속
* 401-Unauthorized : 인증실패
*
* */
public RestResponse(HttpStatus status, String message, LocalDateTime timestamp) {
this.status = status;
this.message = message;
this.resultCode = status.value();
checkMessage(status, message);
this.localDateTime = timestamp;
}
public RestResponse(HttpStatus status, String message, List<?> objectList, LocalDateTime timestamp) {
this.status = status;
this.message = message;
public RestResponse(HttpStatus status, String message, LocalDateTime timestamp, Object object) {
this.resultCode = status.value();
checkMessage(status, message);
this.object= object;
this.localDateTime = timestamp;
}
public RestResponse(HttpStatus status, String message, LocalDateTime timestamp, List<?> objectList) {
this.resultCode = status.value();
checkMessage(status, message);
this.objectList = objectList;
this.localDateTime = timestamp;
}
private void checkMessage(HttpStatus status, String message) {
if ("".equals(message)){ this.message = status.name();
}else { this.message = message; }
}
}

View File

@ -0,0 +1,21 @@
package com.itn.mjonApi.mjon.api.service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
public interface AccessKeyService {
RestResponse insert(AccessKeyVO accessKeyVO);
RestResponse selectR(AccessKeyVO accessKeyVO);
RestResponse selectL(AccessKeyVO accessKeyVO);
//AccessKeyVO selectR(AccessKeyVO accessKeyVO);
AccessKeyVO selectRKey(AccessKeyVO accessKeyVO);
RestResponse update(AccessKeyVO accessKeyVO);
RestResponse delete(AccessKeyVO accessKeyVO);
}

View File

@ -0,0 +1,23 @@
package com.itn.mjonApi.mjon.api.service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
public interface AccessTokenService {
RestResponse findAll();
RestResponse insert(AccessKeyVO accessKeyVO);
RestResponse selectR(AccessKeyVO accessKeyVO);
RestResponse selectL(AccessKeyVO accessKeyVO);
//AccessKeyVO selectR(AccessKeyVO accessKeyVO);
AccessKeyVO selectRKey(AccessKeyVO accessKeyVO);
RestResponse update(AccessKeyVO accessKeyVO);
RestResponse delete(AccessKeyVO accessKeyVO);
}

View File

@ -0,0 +1,69 @@
package com.itn.mjonApi.mjon.api.service.impl;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.mjon.api.service.AccessKeyService;
import com.itn.mjonApi.mjon.api.service.mapper.AccessKeyMapper;
@Service
public class AccessKeyServiceImpl implements AccessKeyService {
@Autowired
AccessKeyMapper accessKeyMapper;
@Override
public RestResponse insert(AccessKeyVO accessKeyVO) {
int i_ret = accessKeyMapper.insert(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse selectR(AccessKeyVO accessKeyVO) {
AccessKeyVO MyMsgListVO = accessKeyMapper.selectR(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
@Override
public RestResponse selectL(AccessKeyVO accessKeyVO) {
List<AccessKeyVO> MyMsgListVO = accessKeyMapper.selectL(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
/*
@Override
public AccessKeyVO selectR(AccessKeyVO p_accessKeyVO) {
AccessKeyVO accessKeyVO = accessKeyMapper.selectR(p_accessKeyVO);
return accessKeyVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
*/
@Override
public AccessKeyVO selectRKey(AccessKeyVO p_accessKeyVO) {
AccessKeyVO accessKeyVO = accessKeyMapper.selectRKey(p_accessKeyVO);
return accessKeyVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
@Override
public RestResponse update(AccessKeyVO accessKeyVO) {
int i_ret = accessKeyMapper.update(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse delete(AccessKeyVO accessKeyVO) {
int i_ret = accessKeyMapper.delete(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
}

View File

@ -0,0 +1,75 @@
package com.itn.mjonApi.mjon.api.service.impl;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.mjon.api.service.AccessTokenService;
import com.itn.mjonApi.mjon.api.service.mapper.AccessTokenMapper;
@Service
public class AccessTokenServiceImpl implements AccessTokenService {
@Autowired
AccessTokenMapper accessTokenMapper;
@Override
public RestResponse findAll() {
List<IdgenVO> MyMsgListVO = accessTokenMapper.findAll();
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
@Override
public RestResponse insert(AccessKeyVO accessKeyVO) {
int i_ret = accessTokenMapper.insert(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse selectR(AccessKeyVO accessKeyVO) {
AccessKeyVO MyMsgListVO = accessTokenMapper.selectR(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
@Override
public RestResponse selectL(AccessKeyVO accessKeyVO) {
List<AccessKeyVO> MyMsgListVO = accessTokenMapper.selectL(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
/*
@Override
public AccessKeyVO selectR(AccessKeyVO p_accessKeyVO) {
AccessKeyVO accessKeyVO = accessKeyMapper.selectR(p_accessKeyVO);
return accessKeyVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
*/
@Override
public AccessKeyVO selectRKey(AccessKeyVO p_accessKeyVO) {
AccessKeyVO accessKeyVO = accessTokenMapper.selectRKey(p_accessKeyVO);
return accessKeyVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
@Override
public RestResponse update(AccessKeyVO accessKeyVO) {
int i_ret = accessTokenMapper.update(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse delete(AccessKeyVO accessKeyVO) {
int i_ret = accessTokenMapper.delete(accessKeyVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
}

View File

@ -0,0 +1,25 @@
package com.itn.mjonApi.mjon.api.service.mapper;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface AccessKeyMapper {
int insert(AccessKeyVO accessKeyVO);
AccessKeyVO selectR(AccessKeyVO accessKeyVO);
List<AccessKeyVO> selectL(AccessKeyVO accessKeyVO);
AccessKeyVO selectRKey(AccessKeyVO accessKeyVO);
int update(AccessKeyVO accessKeyVO);
int delete(AccessKeyVO accessKeyVO);
}

View File

@ -0,0 +1,28 @@
package com.itn.mjonApi.mjon.api.service.mapper;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface AccessTokenMapper {
/**/
List<IdgenVO> findAll();
int insert(AccessKeyVO accessKeyVO);
AccessKeyVO selectR(AccessKeyVO accessKeyVO);
List<AccessKeyVO> selectL(AccessKeyVO accessKeyVO);
AccessKeyVO selectRKey(AccessKeyVO accessKeyVO);
int update(AccessKeyVO accessKeyVO);
int delete(AccessKeyVO accessKeyVO);
}

View File

@ -0,0 +1,263 @@
package com.itn.mjonApi.mjon.api.web;
import java.time.LocalDateTime;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RestController;
import com.itn.mjonApi.cmn.idgen.mapper.domain.SendMsgVO;
import com.itn.mjonApi.cmn.msg.PlainResponse;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.mjon.api.service.AccessKeyService;
import com.itn.mjonApi.mjon.api.service.AccessTokenService;
/**
* @author User
*
* access key( + user_id) 방식의 STEP1 api 구현
*
*/
@RestController
public class AccessKeyRestController {
@Autowired
private AccessKeyService accessKeyService;
@Autowired
private AccessTokenService accessTokenService;
//
/**
* @param p_name_1
* @param p_name_2
* @return
*
* 동일 내용을 1천명(?) 까지 보내기 가능
*
* grp_id, 결과코드, 결과msg
*
* 3가지 형태로 제공 가능
* 1.json
* 2.plain text
*
*/
@GetMapping("/api/accessKey/SendMsg")
public ResponseEntity<RestResponse> apiaccessKeysendMsg(
@ModelAttribute SendMsgVO sendMsgVO
){
//step2.api 처리
//단문 문자 발송 처리
//step3.결과 전달
System.out.println("name_1");
System.out.println(sendMsgVO.getAccessKey());
System.out.println(sendMsgVO.getMberId());
System.out.println(sendMsgVO.getSender());
System.out.println(sendMsgVO.getReceiver());
System.out.println(sendMsgVO.getMsg());
System.out.println(sendMsgVO.getMsg_type());
System.out.println(sendMsgVO.getTitle());
System.out.println(sendMsgVO.getRdate());
System.out.println(sendMsgVO.getRtime());
System.out.println(sendMsgVO.getTestmodeYn());
System.out.println("name_12");
//System.out.println(p_name_1);
//System.out.println(p_name_2);
//sendMsg 문자 발송 체크 사항
//step1.발신자 전화번호 사용 가능 여부 체크(해당 사용자의 등록된 번호만 발송 가능)
// 1010
//step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능)
// 1020
//step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 안됨
// 1030
//step4.치환명 정상 여부 확인
// 1040
//step5.발송일시 정상여부 확인
// 1050
//step6.문자 타입에 따른 비용 처리 가능 여부 확인
// 1060
return ResponseEntity.ok(
new RestResponse(
HttpStatus.OK
, ""
, LocalDateTime.now()
, "grp100"
)
);
//AccessKeyVO
}
@GetMapping("/api/accessKey/SendMsgPlain")
public String apiaccessKeysendMsgPlain(
@ModelAttribute SendMsgVO sendMsgVO
){
//step2.api 처리
//단문 문자 발송 처리
//step3.결과 전달
System.out.println("name_1");
System.out.println(sendMsgVO.getAccessKey());
System.out.println(sendMsgVO.getMberId());
System.out.println(sendMsgVO.getSender());
System.out.println(sendMsgVO.getReceiver());
System.out.println(sendMsgVO.getMsg());
System.out.println(sendMsgVO.getMsg_type());
System.out.println(sendMsgVO.getTitle());
System.out.println(sendMsgVO.getRdate());
System.out.println(sendMsgVO.getRtime());
System.out.println(sendMsgVO.getTestmodeYn());
System.out.println("name_12");
//System.out.println(p_name_1);
//System.out.println(p_name_2);
//sendMsg 문자 발송 체크 사항
//step1.발신자 전화번호 사용 가능 여부 체크(해당 사용자의 등록된 번호만 발송 가능)
// 1010
//step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능)
// 1020
//step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 안됨
// 1030
//step4.치환명 정상 여부 확인
// 1040
//step5.발송일시 정상여부 확인
// 1050
//step6.문자 타입에 따른 비용 처리 가능 여부 확인
// 1060
return this.MakePlainResponseResult(
new PlainResponse(
HttpStatus.OK
, ""
, LocalDateTime.now()
)
, "grp100"
);
}
//
/**
* @param p_name_1
* @param p_name_2
* @return
*
* 잔액 확인
* 2가지 형태로 제공 가능
* 1.json
* 2.plain text
*
*/
@GetMapping("/api/accessKey/Remain")
public ResponseEntity<RestResponse> apiaccessKeysendRemain(
@ModelAttribute SendMsgVO sendMsgVO
){
//step2.api 처리
//단문 문자 발송 처리
//step3.결과 전달
System.out.println("name_1");
System.out.println(sendMsgVO.getAccessKey());
System.out.println(sendMsgVO.getMberId());
System.out.println("name_12");
//System.out.println(p_name_1);
//System.out.println(p_name_2);
//remain 체크 사항
//step1.잔액 확인 여부 체크
// 2010
JSONObject jsonObject = new JSONObject();
jsonObject.put("SMS", "50");
jsonObject.put("LMS", "30");
jsonObject.put("MMS", "20");
return ResponseEntity.ok(
new RestResponse(
HttpStatus.OK
, ""
, LocalDateTime.now()
, jsonObject
)
);
//AccessKeyVO
}
//
/**
* @param p_name_1
* @param p_name_2
* @return
*
* 잔액 확인
*
*/
@GetMapping("/api/accessKey/RemainPlain")
public String apiaccessKeysendRemainPlain(
@ModelAttribute SendMsgVO sendMsgVO
){
//step2.api 처리
//단문 문자 발송 처리
//step3.결과 전달
System.out.println("name_1");
System.out.println(sendMsgVO.getAccessKey());
System.out.println(sendMsgVO.getMberId());
System.out.println("name_12");
//System.out.println(p_name_1);
//System.out.println(p_name_2);
//remain 체크 사항
//step1.잔액 확인 여부 체크
// 2010
return this.MakePlainResponseResult(
new PlainResponse(
HttpStatus.OK
, ""
, LocalDateTime.now()
)
, "50|30|20"
);
//AccessKeyVO
}
/////////////////////////////////////////////////////////////////////////////////////
//
//
// private function
//
//
private String MakePlainResponseResult(PlainResponse plainResponse, String p_code) {
String v_ret = "";
v_ret = Integer.toString(plainResponse.getResultCode())
+ "|" + plainResponse.getMessage()
+ "|" + p_code;
return v_ret;
}
}

View File

@ -0,0 +1,30 @@
package com.itn.mjonApi.mjon.log.service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
public interface LettnLoginLogService {
//기본 insert 구문
RestResponse insert(LettnLoginLogVO lettnLoginLogVO);
//기본 select R 구문
RestResponse selectR(LettnLoginLogVO lettnLoginLogVO);
//기본 select LIST 구문
RestResponse selectL(LettnLoginLogVO lettnLoginLogVO);
//AccessKeyVO selectR(AccessKeyVO accessKeyVO);
//기본 select with key 구문
LettnLoginLogVO selectRKey(LettnLoginLogVO lettnLoginLogVO);
//기본 update구문
RestResponse update(LettnLoginLogVO lettnLoginLogVO);
//기본 delete 구문
RestResponse delete(LettnLoginLogVO lettnLoginLogVO);
//IP 제어 select 구문
LettnLoginLogVO selectIgnoreIpCnt(LettnLoginLogVO lettnLoginLogVO);
}

View File

@ -0,0 +1,78 @@
package com.itn.mjonApi.mjon.log.service.impl;
import java.time.LocalDateTime;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO;
import com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO;
import com.itn.mjonApi.cmn.msg.RestResponse;
import com.itn.mjonApi.mjon.log.service.LettnLoginLogService;
import com.itn.mjonApi.mjon.log.service.mapper.LettnLoginLogMapper;
@Service
public class LettnLoginLogServiceImpl implements LettnLoginLogService {
@Autowired
LettnLoginLogMapper lettnLoginLogMapper;
@Override
public RestResponse insert(LettnLoginLogVO lettnLoginLogVO) {
int i_ret = lettnLoginLogMapper.insert(lettnLoginLogVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse selectR(LettnLoginLogVO lettnLoginLogVO) {
LettnLoginLogVO MyMsgListVO = lettnLoginLogMapper.selectR(lettnLoginLogVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
@Override
public RestResponse selectL(LettnLoginLogVO lettnLoginLogVO) {
List<LettnLoginLogVO> MyMsgListVO = lettnLoginLogMapper.selectL(lettnLoginLogVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
/*
@Override
public AccessKeyVO selectR(AccessKeyVO p_accessKeyVO) {
AccessKeyVO accessKeyVO = accessKeyMapper.selectR(p_accessKeyVO);
return accessKeyVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
*/
@Override
public LettnLoginLogVO selectRKey(LettnLoginLogVO p_lettnLoginLogVO) {
LettnLoginLogVO lettnLoginLogVO = lettnLoginLogMapper.selectRKey(p_lettnLoginLogVO);
return lettnLoginLogVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
@Override
public RestResponse update(LettnLoginLogVO lettnLoginLogVO) {
int i_ret = lettnLoginLogMapper.update(lettnLoginLogVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public RestResponse delete(LettnLoginLogVO lettnLoginLogVO) {
int i_ret = lettnLoginLogMapper.delete(lettnLoginLogVO);
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now());
}
@Override
public LettnLoginLogVO selectIgnoreIpCnt(LettnLoginLogVO p_lettnLoginLogVO) {
LettnLoginLogVO lettnLoginLogVO = lettnLoginLogMapper.selectIgnoreIpCnt(p_lettnLoginLogVO);
return lettnLoginLogVO;
//return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
}
}

View File

@ -0,0 +1,27 @@
package com.itn.mjonApi.mjon.log.service.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO;
@Mapper
public interface LettnLoginLogMapper {
int insert(LettnLoginLogVO lettnLoginLogVO);
LettnLoginLogVO selectR(LettnLoginLogVO lettnLoginLogVO);
List<LettnLoginLogVO> selectL(LettnLoginLogVO lettnLoginLogVO);
LettnLoginLogVO selectRKey(LettnLoginLogVO lettnLoginLogVO);
int update(LettnLoginLogVO lettnLoginLogVO);
int delete(LettnLoginLogVO lettnLoginLogVO);
LettnLoginLogVO selectIgnoreIpCnt(LettnLoginLogVO lettnLoginLogVO);
}

View File

@ -21,12 +21,12 @@ public class MemberServiceImpl implements MemberService {
@Override
public RestResponse findAll() {
List<IdgenVO> MyMsgListVO = myMsgMapper.findAll();
return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
@Override
public RestResponse findAll2() {
List<IdgenVO> MyMsgListVO = myMsgMapper.findAll_2();
return new RestResponse(HttpStatus.OK, "성공", MyMsgListVO, LocalDateTime.now());
return new RestResponse(HttpStatus.OK, "성공", LocalDateTime.now(), MyMsgListVO);
}
}

View File

@ -2,10 +2,14 @@
# DB INFO
#spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.125:3306/mjon?serverTimezone=Asia/Seoul
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://192.168.0.125:3306/mjon?serverTimezone=Asia/Seoul
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.username=mjonUr
spring.datasource.password=mjon!@#$
server.port=8088

View File

@ -7,4 +7,10 @@ spring.profiles.active=dev
mybatis.mapper-locations=classpath:mapper/**/*.xml
# model camel case set
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.jdbc.sqlonly=info
#sql \ucd9c\ub825 log \uc124\uc815
logging.level.jdbc.sqlonly=off
logging.level.jdbc.sqltiming=info
logging.level.jdbc.audit=off
logging.level.jdbc.resultset=off
logging.level.jdbc.resultsettable=off

View File

@ -0,0 +1,2 @@
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

View File

@ -0,0 +1,129 @@
<?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.api.service.mapper.AccessKeyMapper">
<select id="findAll" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
*
FROM lettngnrlmber_access_key
</select>
<!-- 공통 테이블 명 -->
<!-- <sql id="AccessKeyDAO.table_name"> -->
<sql id="table_name">
lettngnrlmber_access_key
</sql>
<!-- 저장용 공통 컬럼 명 -->
<!-- <sql id="AccessKeyDAO.column_name"> -->
<sql id="column_name">
access_no,
mber_id,
access_key,
use_yn,
frst_regist_pnttm,
frst_register_id,
last_updt_pnttm,
last_updusr_id
</sql>
<!-- 조회용 공통 컬럼 명 -->
<!-- <sql id="AccessKeyDAO.select_column_name"> -->
<sql id="select_column_name">
a.access_no AS accessNo,
a.mber_id AS mberId,
a.access_key AS accessKey,
a.use_yn AS useYn,
DATE_FORMAT(a.frst_regist_pnttm,'%Y-%m-%d') AS frstRegistPnttm,
a.frst_register_id AS frstRegisterId,
DATE_FORMAT(a.last_updt_pnttm,'%Y-%m-%d') AS lastUpdtPnttm,
a.last_updusr_id AS lastUpdusrId
</sql>
<!-- access_key 정보 등록 C -->
<insert id="insert">
<!-- INSERT INTO <include refid="AccessKeyDAO.table_name"/> ( -->
<!-- <include refid="AccessKeyDAO.column_name"/> -->
INSERT INTO <include refid="table_name"/> (
<include refid="column_name"/>
)VALUES(
#{accessNo},
#{mberId},
#{accessKey},
#{useYn},
NOW(),
#{frstRegisterId},
NOW(),
#{lastUpdusrId}
)
</insert>
<!-- access_key 정보 R -->
<!-- <include refid="AccessKeyDAO.select_column_name"/> -->
<!-- <include refid="AccessKeyDAO.table_name"/> a -->
<select id="selectR" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
a.ACCESS_NO = #{accessNo}
</select>
<select id="selectRKey" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
1=1
AND a.ACCESS_KEY = #{accessKey}
AND a.MBER_ID = #{mberId}
</select>
<!-- access_key 정보 U -->
<update id="update">
UPDATE
<include refid="table_name"/>
SET
LAST_UPDT_PNTTM = NOW()
,LAST_UPDUSR_ID = #lastUpdusrId#
<if test="mberId ne null">
,mber_id=#{mberId}
</if><if test="accessKey ne null">
,access_key=#{accessKey}
</if><if test="useYn ne null">
,use_yn=#{useYn}
</if>
WHERE
ACCESS_NO = #{accessNo}
</update>
<!-- access_key 정보 U -->
<delete id="delete">
DELETE FROM
<include refid="table_name"/>
WHERE
ACCESS_NO = #{accessNo}
</delete>
</mapper>

View File

@ -0,0 +1,130 @@
<?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.api.service.mapper.AccessTokenMapper">
<select id="findAll" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
*
FROM lettngnrlmber_access_token
</select>
<!-- 공통 테이블 명 -->
<!-- <sql id="AccessKeyDAO.table_name"> -->
<sql id="table_name">
lettngnrlmber_access_token
</sql>
<!-- 저장용 공통 컬럼 명 -->
<!-- <sql id="AccessKeyDAO.column_name"> -->
<sql id="column_name">
access_no,
access_token,
token_obj,
expire_pnttm,
frst_regist_pnttm,
frst_register_id,
last_updt_pnttm,
last_updusr_id
</sql>
<!-- 조회용 공통 컬럼 명 -->
<!-- <sql id="AccessKeyDAO.select_column_name"> -->
<sql id="select_column_name">
a.access_no AS accessNo,
a.access_token AS accessToken,
a.token_obj AS tokenObj,
a.expire_pnttm AS expirePnttm,
DATE_FORMAT(a.frst_regist_pnttm,'%Y-%m-%d') AS frstRegistPnttm,
a.frst_register_id AS frstRegisterId,
DATE_FORMAT(a.last_updt_pnttm,'%Y-%m-%d') AS lastUpdtPnttm,
a.last_updusr_id AS lastUpdusrId
</sql>
<!-- access_key 정보 등록 C -->
<insert id="insert">
<!-- INSERT INTO <include refid="AccessKeyDAO.table_name"/> ( -->
<!-- <include refid="AccessKeyDAO.column_name"/> -->
INSERT INTO <include refid="table_name"/> (
<include refid="column_name"/>
)VALUES(
#{accessNo},
#{accessToken},
#{tokenObj},
#{expirePnttm},
NOW(),
#{frstRegisterId},
NOW(),
#{lastUpdusrId}
)
</insert>
<!-- access_key 정보 R -->
<!-- <include refid="AccessKeyDAO.select_column_name"/> -->
<!-- <include refid="AccessKeyDAO.table_name"/> a -->
<select id="selectR" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
a.ACCESS_NO = #{accessNo}
AND a.ACCESS_TOKEN = #{accessToken}
</select>
<select id="selectRToken" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.AccessKeyVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
a.ACCESS_TOKEN = #{accessToken}
</select>
<!-- access_key 정보 U -->
<update id="update">
UPDATE
<include refid="table_name"/>
SET
LAST_UPDT_PNTTM = NOW()
,LAST_UPDUSR_ID = #lastUpdusrId#
<if test="mberId ne null">
,mber_id=#{mberId}
</if><if test="accessKey ne null">
,access_key=#{accessKey}
</if><if test="useYn ne null">
,use_yn=#{useYn}
</if>
WHERE
ACCESS_NO = #{accessNo}
AND ACCESS_TOKEN = #{accessToken}
</update>
<!-- access_key 정보 U -->
<delete id="delete">
DELETE FROM
<include refid="table_name"/>
WHERE
ACCESS_NO = #{accessNo}
AND ACCESS_TOKEN = #{accessToken}
</delete>
</mapper>

View File

@ -0,0 +1,127 @@
<?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.LettnLoginLogMapper">
<!-- 공통 테이블 명 -->
<sql id="table_name">
lettnLoginLog
</sql>
<!-- 저장용 공통 컬럼 명 -->
<sql id="column_name">
LOG_ID
, CONECT_ID
, CONECT_IP
, USER_AT
, DEVICE_TYPE /**인터넷,모바일 */
, PROGRM_FILE_NM
, MENU_NO
, MENU_NM
, URL
, CREAT_DT
</sql>
<!-- 조회용 공통 컬럼 명 -->
<sql id="select_column_name">
a.LOG_ID AS logId
, a.CONECT_ID AS conectId
, a.CONECT_IP AS conectIp
, a.USER_AT AS userAt
, a.DEVICE_TYPE AS deviceType /**인터넷,모바일 */
, a.PROGRM_FILE_NM AS progrmFileNm
, a.MENU_NO AS menuNo
, a.MENU_NM AS menuNm
, a.URL AS url
, a.CREAT_DT AS creatDt
</sql>
<!-- access_key 정보 등록 C -->
<insert id="insert">
INSERT INTO <include refid="table_name"/> (
<include refid="column_name"/>
)
SELECT concat('API_',lpad(ifnull(replace(MAX(log_id),'API_',''),0)+1,16,'0'))
, #{conectId}
, #{conectIp}
, #{userAt} /**A:관리자, U:홈페이지 */
, #{deviceType}
, #{progrmFileNm}
, #{menuNo}
, #{menuNm}
, #{url}
, now()
FROM LETTNLOGINLOG
WHERE log_id LIKE 'API_%'
</insert>
<!-- access_key 정보 R -->
<select id="selectR" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
a.LOG_ID = #{logId}
</select>
<select id="selectRKey" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO">
SELECT
<include refid="select_column_name"/>
FROM
<include refid="table_name"/> a
WHERE
1=1
AND a.LOG_ID = #{logId}
</select>
<!-- access_key 정보 U -->
<update id="update">
UPDATE
<include refid="table_name"/>
SET
LAST_UPDT_PNTTM = NOW()
,LAST_UPDUSR_ID = #{lastUpdusrId}
<if test="mberId ne null">
,mber_id=#{mberId}
</if><if test="accessKey ne null">
,access_key=#{accessKey}
</if><if test="useYn ne null">
,use_yn=#{useYn}
</if>
WHERE
LOG_ID = #{logId}
</update>
<!-- access_key 정보 U -->
<delete id="delete">
DELETE FROM
<include refid="table_name"/>
WHERE
LOG_ID = #{logId}
</delete>
<select id="selectIgnoreIpCnt" resultType="com.itn.mjonApi.cmn.idgen.mapper.domain.LettnLoginLogVO">
SELECT
COUNT(A.IGNORE_NO) AS CNT
FROM mj_ignore_ip A
WHERE 1=1
AND A.IGNORE_IP = #{conectIp}
LIMIT 1
</select>
</mapper>