
--- build.gradle
+++ build.gradle
... | ... | @@ -86,6 +86,8 @@ |
86 | 86 |
implementation 'org.springframework.boot:spring-boot-starter-mail' |
87 | 87 |
//oauth2 |
88 | 88 |
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' |
89 |
+ // coolsms 문자발송용 라이브러리 |
|
90 |
+ implementation 'net.nurigo:sdk:4.2.7' |
|
89 | 91 |
|
90 | 92 |
testImplementation 'org.springframework.boot:spring-boot-starter-test' |
91 | 93 |
testImplementation 'org.springframework.security:spring-security-test' |
--- src/main/java/com/takensoft/cms/loginPolicy/web/LoginPolicyController.java
+++ src/main/java/com/takensoft/cms/loginPolicy/web/LoginPolicyController.java
... | ... | @@ -14,7 +14,6 @@ |
14 | 14 |
import com.takensoft.common.util.JWTUtil; |
15 | 15 |
import com.takensoft.common.util.ResponseUtil; |
16 | 16 |
import com.takensoft.common.util.SessionUtil; |
17 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
18 | 17 |
import jakarta.servlet.http.HttpServletRequest; |
19 | 18 |
import lombok.RequiredArgsConstructor; |
20 | 19 |
import lombok.extern.slf4j.Slf4j; |
--- src/main/java/com/takensoft/cms/mber/dao/AdmMbrDAO.java
+++ src/main/java/com/takensoft/cms/mber/dao/AdmMbrDAO.java
... | ... | @@ -86,6 +86,14 @@ |
86 | 86 |
public String lgnIdSearchByEml(AdmMbrDTO admMbrDTO); |
87 | 87 |
|
88 | 88 |
/** |
89 |
+ * @param admMbrDTO - 회원 정보 관련 DTO |
|
90 |
+ * @return String - 로그인 아이디 |
|
91 |
+ * |
|
92 |
+ * 휴대폰번호로 아이디 찾기 |
|
93 |
+ */ |
|
94 |
+ public String lgnIdSearchByMblTelno(AdmMbrDTO admMbrDTO); |
|
95 |
+ |
|
96 |
+ /** |
|
89 | 97 |
* @param admMbrDTO - 회원정보 관련 DTO |
90 | 98 |
* @return String - 회원 아이디 |
91 | 99 |
* |
--- src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
+++ src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
... | ... | @@ -82,6 +82,17 @@ |
82 | 82 |
MberVO findByEmail(HashMap<String, Object> params); |
83 | 83 |
|
84 | 84 |
/** |
85 |
+ * @param params |
|
86 |
+ * - mbrNm: 사용자 이름 |
|
87 |
+ * - mblTelno: 휴대폰번호 정보 |
|
88 |
+ * - mbrId: 회원 아이디 |
|
89 |
+ * @return MberVO - 사용자 정보 |
|
90 |
+ * |
|
91 |
+ * 휴대폰번호로 사용자 조회 (provider 무관) |
|
92 |
+ */ |
|
93 |
+ MberVO findByMblTelno(HashMap<String, Object> params); |
|
94 |
+ |
|
95 |
+ /** |
|
85 | 96 |
* @param email - 이메일 |
86 | 97 |
* @param mbrType - OAuth2 회원 유형 (K, N, G, F, S) |
87 | 98 |
* @return MberVO - OAuth2 사용자 정보 |
--- src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
... | ... | @@ -163,6 +163,14 @@ |
163 | 163 |
mbrService.findByCheckEmail(emlParams); |
164 | 164 |
} |
165 | 165 |
|
166 |
+ // 휴대폰번호 중복 검사 |
|
167 |
+ if (admMbrDTO.getMblTelno() != null || !admMbrDTO.getMblTelno().isEmpty()) { |
|
168 |
+ HashMap<String, Object> mblTelnoParams = new HashMap<>(); |
|
169 |
+ mblTelnoParams.put("mblTelno", admMbrDTO.getMblTelno()); |
|
170 |
+ mblTelnoParams.put("mbrId", admMbrDTO.getMbrId()); |
|
171 |
+ mbrService.findByCheckMblTelno(mblTelnoParams); |
|
172 |
+ } |
|
173 |
+ |
|
166 | 174 |
// 비밀번호 변경 |
167 | 175 |
if (admMbrDTO.getPswd() != null && !admMbrDTO.getPswd().equals("")) { |
168 | 176 |
PasswordDTO passwordDTO = new PasswordDTO(); |
... | ... | @@ -339,7 +347,8 @@ |
339 | 347 |
lgnId = admMbrDAO.lgnIdSearchByEml(admMbrDTO); |
340 | 348 |
} else if(admMbrDTO.getMblTelno() != null || !admMbrDTO.getMblTelno().isEmpty()) { |
341 | 349 |
// 휴대폰 번호로 아이디 찾기 |
342 |
-// lgnId = admMbrDAO.lgnIdSearchByMblTelno(mbrVO); |
|
350 |
+ admMbrDTO.setMblTelno(Secret.encrypt(admMbrDTO.getMblTelno())); // 휴대폰 번호 암호화 |
|
351 |
+ lgnId = admMbrDAO.lgnIdSearchByMblTelno(admMbrDTO); |
|
343 | 352 |
} |
344 | 353 |
return lgnId; |
345 | 354 |
} catch (DataAccessException dae) { |
--- src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
... | ... | @@ -127,6 +127,32 @@ |
127 | 127 |
} |
128 | 128 |
|
129 | 129 |
/** |
130 |
+ * @param params |
|
131 |
+ * - mblTelno: 휴대폰번호 정보 |
|
132 |
+ * - mbrId: 회원 아이디 |
|
133 |
+ * @return boolean - 휴대폰번호 중복 여부 |
|
134 |
+ * @throws CustomIdTakenException - 이메일 중복 예외 발생 시 |
|
135 |
+ * @throws DataAccessException - db 관련 예외 발생 시 |
|
136 |
+ * @throws Exception - 그 외 예외 발생 시 |
|
137 |
+ * |
|
138 |
+ * 휴대폰번호 중복 검사 |
|
139 |
+ */ |
|
140 |
+ @Override |
|
141 |
+ public boolean findByCheckMblTelno(HashMap<String, Object> params) { |
|
142 |
+ try { |
|
143 |
+ MberVO existingUser = mberDAO.findByMblTelno(params); |
|
144 |
+ if (existingUser != null) { |
|
145 |
+ throw new CustomMblTelnoTakenException("해당 휴대폰번호로 이미 계정이 등록되어 있습니다."); |
|
146 |
+ } |
|
147 |
+ return true; |
|
148 |
+ } catch (DataAccessException dae) { |
|
149 |
+ throw dae; |
|
150 |
+ } catch (Exception e) { |
|
151 |
+ throw e; |
|
152 |
+ } |
|
153 |
+ } |
|
154 |
+ |
|
155 |
+ /** |
|
130 | 156 |
* @param req - HTTP 요청 객체 |
131 | 157 |
* @param joinDTO -회원정보 |
132 | 158 |
* @return HashMap<String, Object> - 회원정보 등록 결과 |
... | ... | @@ -149,6 +175,13 @@ |
149 | 175 |
findByCheckEmail(params); // 이메일 중복 검사 |
150 | 176 |
} |
151 | 177 |
|
178 |
+ // 휴대폰번호로 기존 계정 확인 (기본 검사만 수행) |
|
179 |
+ if (joinDTO.getMblTelno() != null && !joinDTO.getMblTelno().isEmpty()) { |
|
180 |
+ HashMap<String, Object> params = new HashMap<>(); |
|
181 |
+ params.put("mblTelno", joinDTO.getMblTelno()); |
|
182 |
+ findByCheckMblTelno(params); // 휴대폰번호 중복 검사 |
|
183 |
+ } |
|
184 |
+ |
|
152 | 185 |
// 기존 회원가입 로직 실행 |
153 | 186 |
return performStandardJoin(req, joinDTO); |
154 | 187 |
|
--- src/main/java/com/takensoft/cms/mber/service/MberService.java
+++ src/main/java/com/takensoft/cms/mber/service/MberService.java
... | ... | @@ -38,6 +38,17 @@ |
38 | 38 |
*/ |
39 | 39 |
public boolean findByCheckEmail(HashMap<String, Object> params); |
40 | 40 |
|
41 |
+ |
|
42 |
+ /** |
|
43 |
+ * @param params |
|
44 |
+ * - mblTelno: 휴대폰번호 정보 |
|
45 |
+ * - mbrId: 회원 아이디 |
|
46 |
+ * @return boolean - 휴대폰번호 중복 여부 |
|
47 |
+ * |
|
48 |
+ * 휴대폰번호 중복 검사 |
|
49 |
+ */ |
|
50 |
+ public boolean findByCheckMblTelno(HashMap<String, Object> params); |
|
51 |
+ |
|
41 | 52 |
/** |
42 | 53 |
* @param req - HTTP 요청 객체 |
43 | 54 |
* @param joinDTO -회원정보 |
--- src/main/java/com/takensoft/cms/mber/web/MberController.java
+++ src/main/java/com/takensoft/cms/mber/web/MberController.java
... | ... | @@ -78,4 +78,19 @@ |
78 | 78 |
// 응답 처리 |
79 | 79 |
return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); |
80 | 80 |
} |
81 |
+ |
|
82 |
+ /** |
|
83 |
+ * @param params - 휴대폰번호 |
|
84 |
+ * @return ResponseEntity - 휴대폰번호 중복 검사 결과 |
|
85 |
+ * |
|
86 |
+ * 휴대폰번호 중복 검사 |
|
87 |
+ */ |
|
88 |
+ @PostMapping(value = "/findByCheckMblTelno.json") |
|
89 |
+ public ResponseEntity<?> findByCheckMblTelno(@RequestBody HashMap<String, Object> params){ |
|
90 |
+ // 상세 조회 |
|
91 |
+ boolean result = mberService.findByCheckMblTelno(params); |
|
92 |
+ |
|
93 |
+ // 응답 처리 |
|
94 |
+ return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); |
|
95 |
+ } |
|
81 | 96 |
}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/verify/dao/EmailDAO.java
+++ src/main/java/com/takensoft/common/certify/dao/EmailDAO.java
... | ... | @@ -1,10 +1,7 @@ |
1 |
-package com.takensoft.common.verify.dao; |
|
1 |
+package com.takensoft.common.certify.dao; |
|
2 | 2 |
|
3 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
4 | 3 |
import org.egovframe.rte.psl.dataaccess.mapper.Mapper; |
5 | 4 |
|
6 |
-import java.util.HashMap; |
|
7 |
-import java.util.List; |
|
8 | 5 |
/** |
9 | 6 |
* @author : 하석형 |
10 | 7 |
* @since : 2025.05.20 |
+++ src/main/java/com/takensoft/common/certify/dao/SMSDAO.java
... | ... | @@ -0,0 +1,16 @@ |
1 | +package com.takensoft.common.certify.dao; | |
2 | + | |
3 | +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; | |
4 | + | |
5 | +/** | |
6 | + * @author : 하석형 | |
7 | + * @since : 2025.06.27 | |
8 | + * @modification | |
9 | + * since | author | description | |
10 | + * 2025.06.27 | 하석형 | 최초 등록 | |
11 | + * | |
12 | + * SMS 관련 Mapper | |
13 | + */ | |
14 | +@Mapper("smsDAO") | |
15 | +public interface SMSDAO { | |
16 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/verify/service/EmailService.java
+++ src/main/java/com/takensoft/common/certify/service/EmailService.java
... | ... | @@ -1,10 +1,7 @@ |
1 |
-package com.takensoft.common.verify.service; |
|
1 |
+package com.takensoft.common.certify.service; |
|
2 | 2 |
|
3 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
4 |
-import org.springframework.web.multipart.MultipartFile; |
|
3 |
+import com.takensoft.common.certify.vo.EmailVO; |
|
5 | 4 |
|
6 |
-import java.util.HashMap; |
|
7 |
-import java.util.List; |
|
8 | 5 |
/** |
9 | 6 |
* @author 하석형 |
10 | 7 |
* @since 2025.05.20 |
... | ... | @@ -21,7 +18,7 @@ |
21 | 18 |
* |
22 | 19 |
* 이메일 인증코드 발송 |
23 | 20 |
*/ |
24 |
- public boolean sendEmailVerifyCode(EmailVO emailVO); |
|
21 |
+ public boolean sendEmailCertifyCode(EmailVO emailVO); |
|
25 | 22 |
|
26 | 23 |
/** |
27 | 24 |
* @param emailVO - 이메일 정보 |
... | ... | @@ -29,5 +26,5 @@ |
29 | 26 |
* |
30 | 27 |
* 이메일 인증코드 확인 |
31 | 28 |
*/ |
32 |
- public boolean checkEmailVerifyCode(EmailVO emailVO); |
|
29 |
+ public boolean checkEmailCertifyCode(EmailVO emailVO); |
|
33 | 30 |
}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/verify/service/Impl/EmailServiceImpl.java
+++ src/main/java/com/takensoft/common/certify/service/Impl/EmailServiceImpl.java
... | ... | @@ -1,23 +1,17 @@ |
1 |
-package com.takensoft.common.verify.service.Impl; |
|
1 |
+package com.takensoft.common.certify.service.Impl; |
|
2 | 2 |
|
3 |
-import com.fasterxml.jackson.core.JsonProcessingException; |
|
4 |
-import com.fasterxml.jackson.databind.ObjectMapper; |
|
5 | 3 |
import com.takensoft.common.exception.*; |
6 | 4 |
import com.takensoft.common.util.JWTUtil; |
7 |
-import com.takensoft.common.verify.dao.EmailDAO; |
|
8 |
-import com.takensoft.common.verify.service.EmailService; |
|
9 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
5 |
+import com.takensoft.common.certify.dao.EmailDAO; |
|
6 |
+import com.takensoft.common.certify.service.EmailService; |
|
7 |
+import com.takensoft.common.certify.vo.EmailVO; |
|
10 | 8 |
import lombok.RequiredArgsConstructor; |
11 | 9 |
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; |
12 |
-import org.springframework.beans.factory.annotation.Autowired; |
|
13 |
-import org.springframework.beans.factory.annotation.Qualifier; |
|
14 | 10 |
import org.springframework.beans.factory.annotation.Value; |
15 |
-import org.springframework.dao.DataAccessException; |
|
16 | 11 |
import org.springframework.data.redis.core.RedisTemplate; |
17 | 12 |
import org.springframework.mail.SimpleMailMessage; |
18 | 13 |
import org.springframework.mail.javamail.JavaMailSender; |
19 | 14 |
import org.springframework.stereotype.Service; |
20 |
-import org.springframework.transaction.annotation.Transactional; |
|
21 | 15 |
|
22 | 16 |
import java.time.Duration; |
23 | 17 |
|
... | ... | @@ -43,22 +37,22 @@ |
43 | 37 |
private final JavaMailSender mailSender; |
44 | 38 |
private final RedisTemplate<String, Object> redisTemplate; |
45 | 39 |
|
46 |
- @Value("${spring.mail.verifyTime}") |
|
47 |
- private long verifyTime; // 인증코드 유효시간 |
|
40 |
+ @Value("${spring.mail.certify-time}") |
|
41 |
+ private long certifyTime; // 인증코드 유효시간 |
|
48 | 42 |
|
49 |
- @Value("${spring.mail.storeTime}") |
|
43 |
+ @Value("${spring.mail.store-time}") |
|
50 | 44 |
private long storeTime; // 인증코드 저장시간 |
51 | 45 |
|
52 | 46 |
/** |
53 | 47 |
* @param emailVO - 이메일 정보 |
54 | 48 |
* @return boolean - 이메일 인증코드 발송 결과 |
55 |
- * @throws CustomEmailSendFailException - 이메일 발송 실패 시 |
|
49 |
+ * @throws CustomCertifySendFailException - 이메일 발송 실패 시 |
|
56 | 50 |
* @throws Exception - 그 외 예외 발생 시 |
57 | 51 |
* |
58 | 52 |
* 이메일 인증코드 발송 |
59 | 53 |
*/ |
60 | 54 |
@Override |
61 |
- public boolean sendEmailVerifyCode(EmailVO emailVO) { |
|
55 |
+ public boolean sendEmailCertifyCode(EmailVO emailVO) { |
|
62 | 56 |
try { |
63 | 57 |
String email = emailVO.getEmail(); |
64 | 58 |
String code = createRandomCode(); // 인증코드 생성 |
... | ... | @@ -80,7 +74,7 @@ |
80 | 74 |
try { |
81 | 75 |
mailSender.send(message); |
82 | 76 |
} catch (Exception e) { |
83 |
- throw new CustomEmailSendFailException("이메일 발송에 실패했습니다."); |
|
77 |
+ throw new CustomCertifySendFailException("이메일 발송에 실패했습니다."); |
|
84 | 78 |
} |
85 | 79 |
|
86 | 80 |
redisTemplate.opsForValue().set("email:" + email, emailVO, Duration.ofMillis(storeTime)); // 인증코드 저장 |
... | ... | @@ -94,15 +88,15 @@ |
94 | 88 |
/** |
95 | 89 |
* @param emailVO - 이메일 정보 |
96 | 90 |
* @return boolean - 이메일 인증코드 확인 결과 |
97 |
- * @throws CustomEmailVerifyExpireException - 이메일 인증 만료 시 |
|
98 |
- * @throws CustomEmailCodeNotMatchException - 이메일 인증코드 불일치 시 |
|
99 |
- * @throws CustomEmailVerifyFailException - 이메일 인증 실패 시 |
|
91 |
+ * @throws CustomCertifyExpireException - 이메일 인증 만료 시 |
|
92 |
+ * @throws CustomCertifyCodeNotMatchException - 이메일 인증코드 불일치 시 |
|
93 |
+ * @throws CustomCertifyFailException - 이메일 인증 실패 시 |
|
100 | 94 |
* @throws Exception - 그 외 예외 발생 시 |
101 | 95 |
* |
102 | 96 |
* 이메일 인증코드 확인 |
103 | 97 |
*/ |
104 | 98 |
@Override |
105 |
- public boolean checkEmailVerifyCode(EmailVO emailVO){ |
|
99 |
+ public boolean checkEmailCertifyCode(EmailVO emailVO){ |
|
106 | 100 |
try { |
107 | 101 |
String email = emailVO.getEmail(); |
108 | 102 |
String code = emailVO.getCode(); |
... | ... | @@ -111,18 +105,18 @@ |
111 | 105 |
boolean isSend = redisTemplate.hasKey("email:" + email); // 이메일 인증코드 발송여부 확인 |
112 | 106 |
|
113 | 107 |
if(isSend) { // 이미 인증코드가 발송된 경우 |
114 |
- EmailVO verifyVO = (EmailVO) redisTemplate.opsForValue().get("email:" + email); // 발송된 인증코드 |
|
115 |
- if(currentAt - verifyVO.getCreatedAt() > verifyTime) { // 인증코드 유효시간이 지났을 경우 |
|
116 |
- throw new CustomEmailVerifyExpireException("인증 시간이 만료되었습니다."); |
|
108 |
+ EmailVO certifyVO = (EmailVO) redisTemplate.opsForValue().get("email:" + email); // 발송된 인증코드 |
|
109 |
+ if(currentAt - certifyVO.getCreatedAt() > certifyTime) { // 인증코드 유효시간이 지났을 경우 |
|
110 |
+ throw new CustomCertifyExpireException("인증 시간이 만료되었습니다."); |
|
117 | 111 |
} |
118 |
- String verifyCode = verifyVO.getCode(); // 발송된 인증코드 |
|
119 |
- if(verifyCode.equals(code)) { // 인증코드가 일치하는 경우 |
|
112 |
+ String certifyCode = certifyVO.getCode(); // 발송된 인증코드 |
|
113 |
+ if(certifyCode.equals(code)) { // 인증코드가 일치하는 경우 |
|
120 | 114 |
redisTemplate.delete("email:" + email); // 인증코드 삭제 |
121 | 115 |
} else { // 인증코드가 일치하지 않는 경우 |
122 |
- throw new CustomEmailCodeNotMatchException("인증코드가 일치하지 않습니다."); |
|
116 |
+ throw new CustomCertifyCodeNotMatchException("인증코드가 일치하지 않습니다."); |
|
123 | 117 |
} |
124 | 118 |
} else { // 인증코드가 발송되지 않은 경우 |
125 |
- throw new CustomEmailVerifyFailException("이메일 인증에 실패했습니다."); |
|
119 |
+ throw new CustomCertifyFailException("이메일 인증에 실패했습니다."); |
|
126 | 120 |
} |
127 | 121 |
return true; |
128 | 122 |
} catch (Exception e) { |
+++ src/main/java/com/takensoft/common/certify/service/Impl/SMSServiceImpl.java
... | ... | @@ -0,0 +1,157 @@ |
1 | +package com.takensoft.common.certify.service.Impl; | |
2 | + | |
3 | +import com.takensoft.common.exception.CustomCertifyCodeNotMatchException; | |
4 | +import com.takensoft.common.exception.CustomCertifySendFailException; | |
5 | +import com.takensoft.common.exception.CustomCertifyExpireException; | |
6 | +import com.takensoft.common.exception.CustomCertifyFailException; | |
7 | +import com.takensoft.common.util.JWTUtil; | |
8 | +import com.takensoft.common.certify.dao.SMSDAO; | |
9 | +import com.takensoft.common.certify.service.SMSService; | |
10 | +import com.takensoft.common.certify.vo.SMSVO; | |
11 | +import lombok.RequiredArgsConstructor; | |
12 | +import net.nurigo.sdk.NurigoApp; | |
13 | +import net.nurigo.sdk.message.exception.NurigoMessageNotReceivedException; | |
14 | +import net.nurigo.sdk.message.model.Message; | |
15 | +import net.nurigo.sdk.message.service.DefaultMessageService; | |
16 | +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; | |
17 | +import org.springframework.beans.factory.annotation.Value; | |
18 | +import org.springframework.data.redis.core.RedisTemplate; | |
19 | +import org.springframework.mail.javamail.JavaMailSender; | |
20 | +import org.springframework.stereotype.Service; | |
21 | + | |
22 | +import java.time.Duration; | |
23 | + | |
24 | + | |
25 | +/** | |
26 | + * @author 하석형 | |
27 | + * @since 2025.06.27 | |
28 | + * @modification | |
29 | + * since | author | description | |
30 | + * 2025.06.27 | 하석형 | 최초 등록 | |
31 | + * | |
32 | + * EgovAbstractServiceImpl : 전자정부 상속 | |
33 | + * SMSService : SMS 관련 인터페이스 상속 | |
34 | + * | |
35 | + * SMS 관련 인터페이스 구현체 | |
36 | + */ | |
37 | +@Service("smsService") | |
38 | +@RequiredArgsConstructor | |
39 | +public class SMSServiceImpl extends EgovAbstractServiceImpl implements SMSService { | |
40 | + | |
41 | + private final SMSDAO smsDAO; | |
42 | + private final JWTUtil jwtUtil; | |
43 | + private final JavaMailSender mailSender; | |
44 | + private final RedisTemplate<String, Object> redisTemplate; | |
45 | + | |
46 | + @Value("${spring.sms.api-key}") | |
47 | + private String apiKey; // API 키 | |
48 | + | |
49 | + @Value("${spring.sms.api-secret}") | |
50 | + private String apiSecret; // API 시크릿 키 | |
51 | + | |
52 | + @Value("${spring.sms.sender-number}") | |
53 | + private String senderNumber; // 발신번호 | |
54 | + | |
55 | + @Value("${spring.sms.certify-time}") | |
56 | + private long certifyTime; // 인증코드 유효시간 | |
57 | + | |
58 | + @Value("${spring.sms.store-time}") | |
59 | + private long storeTime; // 인증코드 저장시간 | |
60 | + | |
61 | + /** | |
62 | + * @param smsVO - SMS 정보 | |
63 | + * @return boolean - SMS 인증코드 발송 결과 | |
64 | + * @throws CustomCertifySendFailException - SMS 발송 실패 시 | |
65 | + * @throws Exception - 그 외 예외 발생 시 | |
66 | + * | |
67 | + * SMS 인증코드 발송 | |
68 | + */ | |
69 | + @Override | |
70 | + public boolean sendSMSCertifyCode(SMSVO smsVO) { | |
71 | + try { | |
72 | + String mblTelno = smsVO.getMblTelno(); | |
73 | + String code = createRandomCode(); // 인증코드 생성 | |
74 | + smsVO.setCode(code); | |
75 | + long currentAt = System.currentTimeMillis(); // 현재 시간(millis) | |
76 | + smsVO.setCreatedAt(currentAt); | |
77 | + | |
78 | + boolean isSend = redisTemplate.hasKey("sms:" + mblTelno); // 이메일 인증코드 발송여부 확인 | |
79 | + | |
80 | + if (isSend) { // 이미 인증코드가 발송된 경우 | |
81 | + redisTemplate.delete("sms:" + mblTelno); // 인증코드 삭제 | |
82 | + } | |
83 | + | |
84 | + // SMS 발송 | |
85 | + DefaultMessageService messageService = NurigoApp.INSTANCE.initialize(apiKey, apiSecret, "https://api.solapi.com"); | |
86 | + Message message = new Message(); | |
87 | + message.setFrom(senderNumber); // 계정에서 등록한 발신번호 입력 | |
88 | + message.setTo(mblTelno); // 수신번호 입력 | |
89 | + message.setText("인증 코드는 " + code + " 입니다."); // SMS는 한글 45자, 영자 90자까지 입력할 수 있습니다. | |
90 | + try { | |
91 | + messageService.send(message); // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다! | |
92 | + } catch (NurigoMessageNotReceivedException exception) { | |
93 | + // 발송에 실패한 메시지 목록을 확인할 수 있습니다! | |
94 | + System.out.println(exception.getFailedMessageList()); | |
95 | + System.out.println(exception.getMessage()); | |
96 | + throw new CustomCertifySendFailException("SMS 발송에 실패했습니다."); | |
97 | + } catch (Exception exception) { | |
98 | + System.out.println(exception.getMessage()); | |
99 | + throw new CustomCertifySendFailException("SMS 발송에 실패했습니다."); | |
100 | + } | |
101 | + | |
102 | + redisTemplate.opsForValue().set("sms:" + mblTelno, smsVO, Duration.ofMillis(storeTime)); // 인증코드 저장 | |
103 | + return true; | |
104 | + } catch (Exception e) { | |
105 | + redisTemplate.delete("sms:" + smsVO.getMblTelno()); // 실패시 인증코드 삭제 | |
106 | + throw e; | |
107 | + } | |
108 | + } | |
109 | + | |
110 | + /** | |
111 | + * @param smsVO - SMS 정보 | |
112 | + * @return boolean - SMS 인증코드 확인 결과 | |
113 | + * @throws CustomCertifyExpireException - SMS 인증 만료 시 | |
114 | + * @throws CustomCertifyCodeNotMatchException - SMS 인증코드 불일치 시 | |
115 | + * @throws CustomCertifyFailException - SMS 인증 실패 시 | |
116 | + * @throws Exception - 그 외 예외 발생 시 | |
117 | + * | |
118 | + * SMS 인증코드 확인 | |
119 | + */ | |
120 | + @Override | |
121 | + public boolean checkSMSCertifyCode(SMSVO smsVO){ | |
122 | + try { | |
123 | + String mblTelno = smsVO.getMblTelno(); | |
124 | + String code = smsVO.getCode(); | |
125 | + long currentAt = System.currentTimeMillis(); // 현재 시간(millis) | |
126 | + | |
127 | + boolean isSend = redisTemplate.hasKey("sms:" + mblTelno); // SMS 인증코드 발송여부 확인 | |
128 | + | |
129 | + if(isSend) { // 이미 인증코드가 발송된 경우 | |
130 | + SMSVO certifyVO = (SMSVO) redisTemplate.opsForValue().get("sms:" + mblTelno); // 발송된 인증코드 | |
131 | + if(currentAt - certifyVO.getCreatedAt() > certifyTime) { // 인증코드 유효시간이 지났을 경우 | |
132 | + throw new CustomCertifyExpireException("인증 시간이 만료되었습니다."); | |
133 | + } | |
134 | + String certifyCode = certifyVO.getCode(); // 발송된 인증코드 | |
135 | + if(certifyCode.equals(code)) { // 인증코드가 일치하는 경우 | |
136 | + redisTemplate.delete("sms:" + mblTelno); // 인증코드 삭제 | |
137 | + } else { // 인증코드가 일치하지 않는 경우 | |
138 | + throw new CustomCertifyCodeNotMatchException("인증코드가 일치하지 않습니다."); | |
139 | + } | |
140 | + } else { // 인증코드가 발송되지 않은 경우 | |
141 | + throw new CustomCertifyFailException("SMS 인증에 실패했습니다."); | |
142 | + } | |
143 | + return true; | |
144 | + } catch (Exception e) { | |
145 | + throw e; | |
146 | + } | |
147 | + } | |
148 | + | |
149 | + /** | |
150 | + * @return String - SMS 인증코드 | |
151 | + * | |
152 | + * SMS 인증코드 생성 | |
153 | + */ | |
154 | + private String createRandomCode() { | |
155 | + return String.valueOf((int)(Math.random() * 899999) + 100000); // 6자리 숫자 | |
156 | + } | |
157 | +}(파일 끝에 줄바꿈 문자 없음) |
+++ src/main/java/com/takensoft/common/certify/service/SMSService.java
... | ... | @@ -0,0 +1,30 @@ |
1 | +package com.takensoft.common.certify.service; | |
2 | + | |
3 | +import com.takensoft.common.certify.vo.SMSVO; | |
4 | + | |
5 | +/** | |
6 | + * @author 하석형 | |
7 | + * @since 2025.06.27 | |
8 | + * @modification | |
9 | + * since | author | description | |
10 | + * 2025.06.27 | 하석형 | 최초 등록 | |
11 | + * | |
12 | + * SMS 관련 인터페이스 | |
13 | + */ | |
14 | +public interface SMSService { | |
15 | + /** | |
16 | + * @param smsVO - SMS 정보 | |
17 | + * @return boolean - SMS 인증코드 발송 결과 | |
18 | + * | |
19 | + * SMS 인증코드 발송 | |
20 | + */ | |
21 | + public boolean sendSMSCertifyCode(SMSVO smsVO); | |
22 | + | |
23 | + /** | |
24 | + * @param smsVO - SMS 정보 | |
25 | + * @return boolean - SMS 인증코드 확인 결과 | |
26 | + * | |
27 | + * SMS 인증코드 확인 | |
28 | + */ | |
29 | + public boolean checkSMSCertifyCode(SMSVO smsVO); | |
30 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/verify/vo/EmailVO.java
+++ src/main/java/com/takensoft/common/certify/vo/EmailVO.java
... | ... | @@ -1,8 +1,6 @@ |
1 |
-package com.takensoft.common.verify.vo; |
|
1 |
+package com.takensoft.common.certify.vo; |
|
2 | 2 |
|
3 | 3 |
import lombok.*; |
4 |
- |
|
5 |
-import java.time.LocalDateTime; |
|
6 | 4 |
|
7 | 5 |
/** |
8 | 6 |
* @author : 하석형 |
--- src/main/java/com/takensoft/common/verify/vo/EmailVO.java
+++ src/main/java/com/takensoft/common/certify/vo/SMSVO.java
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.takensoft.common.certify.vo; | |
2 | + | |
3 | +import lombok.*; | |
4 | + | |
5 | +/** | |
6 | + * @author : 하석형 | |
7 | + * @since : 2025.06.27 | |
8 | + * @modification | |
9 | + * since | author | description | |
10 | + * 2025.06.27 | 하석형 | 최초 등록 | |
11 | + * | |
12 | + * SMS 관련 VO | |
13 | + */ | |
14 | +@Setter | |
15 | +@Getter | |
16 | +@ToString | |
17 | +@Builder | |
18 | +@NoArgsConstructor | |
19 | +@AllArgsConstructor | |
20 | +public class SMSVO { | |
21 | + private String mbrId; // 회원아이디 | |
22 | + private String mblTelno; // 휴대폰전화번호 | |
23 | + private String code; // 인증코드 | |
24 | + private long createdAt; // 인증코드 생성일시 | |
25 | +// private LocalDateTime regDt; // 등록일시 | |
26 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/verify/web/EmailController.java
+++ src/main/java/com/takensoft/common/certify/web/EmailController.java
... | ... | @@ -1,21 +1,18 @@ |
1 |
-package com.takensoft.common.verify.web; |
|
1 |
+package com.takensoft.common.certify.web; |
|
2 | 2 |
|
3 | 3 |
import com.fasterxml.jackson.databind.ObjectMapper; |
4 | 4 |
import com.takensoft.cms.loginPolicy.service.LoginModeService; |
5 | 5 |
import com.takensoft.cms.loginPolicy.service.LoginPolicyService; |
6 | 6 |
import com.takensoft.cms.mber.service.LgnHstryService; |
7 | 7 |
import com.takensoft.cms.mber.service.MberService; |
8 |
-import com.takensoft.cms.mber.vo.LgnHstryVO; |
|
9 | 8 |
import com.takensoft.cms.mber.vo.MberVO; |
10 | 9 |
import com.takensoft.cms.token.service.RefreshTokenService; |
11 |
-import com.takensoft.cms.token.vo.RefreshTknVO; |
|
12 | 10 |
import com.takensoft.common.message.MessageCode; |
13 | 11 |
import com.takensoft.common.util.*; |
14 |
-import com.takensoft.common.verify.service.EmailService; |
|
15 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
12 |
+import com.takensoft.common.certify.service.EmailService; |
|
13 |
+import com.takensoft.common.certify.vo.EmailVO; |
|
16 | 14 |
import jakarta.servlet.http.HttpServletRequest; |
17 | 15 |
import jakarta.servlet.http.HttpServletResponse; |
18 |
-import jakarta.servlet.http.HttpSession; |
|
19 | 16 |
import lombok.RequiredArgsConstructor; |
20 | 17 |
import lombok.extern.slf4j.Slf4j; |
21 | 18 |
import org.springframework.beans.factory.annotation.Value; |
... | ... | @@ -23,17 +20,10 @@ |
23 | 20 |
import org.springframework.http.HttpStatus; |
24 | 21 |
import org.springframework.http.ResponseEntity; |
25 | 22 |
import org.springframework.web.bind.annotation.*; |
26 |
-import org.springframework.web.multipart.MultipartFile; |
|
27 | 23 |
|
28 |
-import java.io.File; |
|
29 |
-import java.io.FileInputStream; |
|
30 | 24 |
import java.io.IOException; |
31 |
-import java.io.OutputStream; |
|
32 |
-import java.net.URLEncoder; |
|
33 | 25 |
import java.util.HashMap; |
34 |
-import java.util.List; |
|
35 | 26 |
import java.util.Map; |
36 |
-import java.util.concurrent.TimeUnit; |
|
37 | 27 |
|
38 | 28 |
/** |
39 | 29 |
* @author 하석형 |
... | ... | @@ -76,12 +66,12 @@ |
76 | 66 |
* |
77 | 67 |
* 이메일 인증코드 발송 |
78 | 68 |
*/ |
79 |
- @PostMapping("/sendEmailVerifyCode.json") |
|
80 |
- public ResponseEntity<?> sendEmailVerifyCode(@RequestBody EmailVO emailVO) { |
|
69 |
+ @PostMapping("/sendEmailCertifyCode.json") |
|
70 |
+ public ResponseEntity<?> sendEmailCertifyCode(@RequestBody EmailVO emailVO) { |
|
81 | 71 |
|
82 |
- boolean result = emailService.sendEmailVerifyCode(emailVO); |
|
72 |
+ boolean result = emailService.sendEmailCertifyCode(emailVO); |
|
83 | 73 |
|
84 |
- return resUtil.successRes(result, MessageCode.EMAIL_SEND_SUCCESS); |
|
74 |
+ return resUtil.successRes(result, MessageCode.CERTIFY_CODE_SEND_SUCCESS); |
|
85 | 75 |
} |
86 | 76 |
|
87 | 77 |
/** |
... | ... | @@ -90,12 +80,12 @@ |
90 | 80 |
* |
91 | 81 |
* 이메일 인증코드 확인 |
92 | 82 |
*/ |
93 |
- @PostMapping("/checkEmailVerifyCode.json") |
|
94 |
- public ResponseEntity<?> checkEmailVerifyCode(@RequestBody EmailVO emailVO) { |
|
83 |
+ @PostMapping("/checkEmailCertifyCode.json") |
|
84 |
+ public ResponseEntity<?> checkEmailCertifyCode(@RequestBody EmailVO emailVO) { |
|
95 | 85 |
|
96 |
- boolean result = emailService.checkEmailVerifyCode(emailVO); |
|
86 |
+ boolean result = emailService.checkEmailCertifyCode(emailVO); |
|
97 | 87 |
|
98 |
- return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); |
|
88 |
+ return resUtil.successRes(result, MessageCode.CERTIFY_SUCCESS); |
|
99 | 89 |
} |
100 | 90 |
|
101 | 91 |
/** |
... | ... | @@ -104,10 +94,10 @@ |
104 | 94 |
* |
105 | 95 |
* 2차 인증 이메일 인증코드 확인 |
106 | 96 |
*/ |
107 |
- @PostMapping("/check2ndAuthEmailVerifyCode.json") |
|
108 |
- public void check2ndAuthEmailVerifyCode(@RequestBody EmailVO emailVO, HttpServletRequest req, HttpServletResponse res) throws IOException { |
|
97 |
+ @PostMapping("/check2ndAuthEmailCertifyCode.json") |
|
98 |
+ public void check2ndAuthEmailCertifyCode(@RequestBody EmailVO emailVO, HttpServletRequest req, HttpServletResponse res) throws IOException { |
|
109 | 99 |
|
110 |
- boolean authResult = emailService.checkEmailVerifyCode(emailVO); // 이메일 인증코드 확인 |
|
100 |
+ boolean authResult = emailService.checkEmailCertifyCode(emailVO); // 이메일 인증코드 확인 |
|
111 | 101 |
if(authResult) { |
112 | 102 |
HashMap<String, Object> findMber = new HashMap<>(); |
113 | 103 |
findMber.put("mbrId", emailVO.getMbrId()); |
+++ src/main/java/com/takensoft/common/certify/web/SMSController.java
... | ... | @@ -0,0 +1,122 @@ |
1 | +package com.takensoft.common.certify.web; | |
2 | + | |
3 | +import com.fasterxml.jackson.databind.ObjectMapper; | |
4 | +import com.takensoft.cms.loginPolicy.service.LoginModeService; | |
5 | +import com.takensoft.cms.loginPolicy.service.LoginPolicyService; | |
6 | +import com.takensoft.cms.mber.service.LgnHstryService; | |
7 | +import com.takensoft.cms.mber.service.MberService; | |
8 | +import com.takensoft.cms.mber.vo.MberVO; | |
9 | +import com.takensoft.cms.token.service.RefreshTokenService; | |
10 | +import com.takensoft.common.message.MessageCode; | |
11 | +import com.takensoft.common.util.*; | |
12 | +import com.takensoft.common.certify.service.SMSService; | |
13 | +import com.takensoft.common.certify.vo.SMSVO; | |
14 | +import jakarta.servlet.http.HttpServletRequest; | |
15 | +import jakarta.servlet.http.HttpServletResponse; | |
16 | +import lombok.RequiredArgsConstructor; | |
17 | +import lombok.extern.slf4j.Slf4j; | |
18 | +import org.springframework.beans.factory.annotation.Value; | |
19 | +import org.springframework.data.redis.core.RedisTemplate; | |
20 | +import org.springframework.http.HttpStatus; | |
21 | +import org.springframework.http.ResponseEntity; | |
22 | +import org.springframework.web.bind.annotation.PostMapping; | |
23 | +import org.springframework.web.bind.annotation.RequestBody; | |
24 | +import org.springframework.web.bind.annotation.RequestMapping; | |
25 | +import org.springframework.web.bind.annotation.RestController; | |
26 | + | |
27 | +import java.io.IOException; | |
28 | +import java.util.HashMap; | |
29 | +import java.util.Map; | |
30 | + | |
31 | +/** | |
32 | + * @author 하석형 | |
33 | + * @since 2025.05.20 | |
34 | + * @modification | |
35 | + * since | author | description | |
36 | + * 2025.05.20 | 하석형 | 최초 등록 | |
37 | + * | |
38 | + * SMS 관련 Controller | |
39 | + */ | |
40 | +@RestController | |
41 | +@RequiredArgsConstructor | |
42 | +@Slf4j | |
43 | +@RequestMapping(value="/sys/sms") | |
44 | +public class SMSController { | |
45 | + | |
46 | + private final SMSService smsService; | |
47 | + private final ResponseUtil resUtil; | |
48 | + private final MberService mberService; | |
49 | + private final HttpRequestUtil httpRequestUtil; | |
50 | + private final LgnHstryService lgnHstryService; | |
51 | + private final LoginModeService loginModeService; | |
52 | + private final RefreshTokenService refreshTokenService; | |
53 | + private final LoginPolicyService loginPolicyService; | |
54 | + private final JWTUtil jwtUtil; | |
55 | + private final SessionUtil sessionUtil; | |
56 | + private final RedisTemplate<String, String> redisTemplate; | |
57 | + private final LoginUtil loginUtil; | |
58 | + | |
59 | + @Value("${jwt.accessTime}") | |
60 | + private long JWT_ACCESSTIME; | |
61 | + @Value("${jwt.refreshTime}") | |
62 | + private long JWT_REFRESHTIME; | |
63 | + @Value("${cookie.time}") | |
64 | + private int COOKIE_TIME; // 쿠키 유지 시간 | |
65 | + | |
66 | + /** | |
67 | + * @param smsVO - SMS 정보 | |
68 | + * @return ResponseEntity - SMS 인증코드 발송 응답 결과 | |
69 | + * | |
70 | + * SMS 인증코드 발송 | |
71 | + */ | |
72 | + @PostMapping("/sendSMSCertifyCode.json") | |
73 | + public ResponseEntity<?> sendSMSCertifyCode(@RequestBody SMSVO smsVO) { | |
74 | + | |
75 | + boolean result = smsService.sendSMSCertifyCode(smsVO); | |
76 | + | |
77 | + return resUtil.successRes(result, MessageCode.CERTIFY_CODE_SEND_SUCCESS); | |
78 | + } | |
79 | + | |
80 | + /** | |
81 | + * @param smsVO - SMS 정보 | |
82 | + * @return ResponseEntity - SMS 인증코드 확인 응답 결과 | |
83 | + * | |
84 | + * SMS 인증코드 확인 | |
85 | + */ | |
86 | + @PostMapping("/checkSMSCertifyCode.json") | |
87 | + public ResponseEntity<?> checkSMSCertifyCode(@RequestBody SMSVO smsVO) { | |
88 | + | |
89 | + boolean result = smsService.checkSMSCertifyCode(smsVO); | |
90 | + | |
91 | + return resUtil.successRes(result, MessageCode.CERTIFY_SUCCESS); | |
92 | + } | |
93 | + | |
94 | + /** | |
95 | + * @param smsVO - SMS 정보 | |
96 | + * @return ResponseEntity - SMS 인증코드 확인 응답 결과 | |
97 | + * | |
98 | + * 2차 인증 SMS 인증코드 확인 | |
99 | + */ | |
100 | + @PostMapping("/check2ndAuthSMSCertifyCode.json") | |
101 | + public void check2ndAuthSMSCertifyCode(@RequestBody SMSVO smsVO, HttpServletRequest req, HttpServletResponse res) throws IOException { | |
102 | + | |
103 | + boolean authResult = smsService.checkSMSCertifyCode(smsVO); // SMS 인증코드 확인 | |
104 | + if(authResult) { | |
105 | + HashMap<String, Object> findMber = new HashMap<>(); | |
106 | + findMber.put("mbrId", smsVO.getMbrId()); | |
107 | + MberVO mber = mberService.findByMbr(findMber); | |
108 | + | |
109 | + loginUtil.successLogin(mber, req, res); | |
110 | + } else { | |
111 | + // 인증 실패 시 예외 처리 | |
112 | + Map<String, Object> result = new HashMap<>(); | |
113 | + res.setContentType("application/json;charset=UTF-8"); | |
114 | + res.setStatus(HttpStatus.UNAUTHORIZED.value()); | |
115 | + result.put("message", "인증에 실패했습니다. 올바른 인증코드를 입력해주세요."); | |
116 | + new ObjectMapper().writeValue(res.getOutputStream(), result); | |
117 | + return; | |
118 | + } | |
119 | + | |
120 | +// return resUtil.successRes(authResult, MessageCode.COMMON_SUCCESS); | |
121 | + } | |
122 | +} |
--- src/main/java/com/takensoft/common/config/CorsMvcConfig.java
+++ src/main/java/com/takensoft/common/config/CorsMvcConfig.java
... | ... | @@ -3,11 +3,14 @@ |
3 | 3 |
import org.springframework.beans.factory.annotation.Value; |
4 | 4 |
import org.springframework.context.annotation.Bean; |
5 | 5 |
import org.springframework.context.annotation.Configuration; |
6 |
+import org.springframework.http.converter.HttpMessageConverter; |
|
7 |
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; |
|
6 | 8 |
import org.springframework.web.servlet.LocaleResolver; |
7 | 9 |
import org.springframework.web.servlet.config.annotation.CorsRegistry; |
8 | 10 |
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
9 | 11 |
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; |
10 | 12 |
|
13 |
+import java.util.List; |
|
11 | 14 |
import java.util.Locale; |
12 | 15 |
|
13 | 16 |
/** |
... | ... | @@ -55,4 +58,13 @@ |
55 | 58 |
resolver.setDefaultLocale(Locale.KOREA); |
56 | 59 |
return resolver; |
57 | 60 |
} |
61 |
+ /** |
|
62 |
+ * @param converters - HTTP 메시지 변환기를 관리하는 리스트 |
|
63 |
+ * |
|
64 |
+ * HTTP 메시지 변환기를 설정 (Kotlin 관련 라이브러리의 Converter 우선 적용이 아닌, Jackson을 사용하여 JSON 변환을 처리) |
|
65 |
+ */ |
|
66 |
+ @Override |
|
67 |
+ public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { |
|
68 |
+ converters.add(0, new MappingJackson2HttpMessageConverter()); |
|
69 |
+ } |
|
58 | 70 |
}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/config/SecurityConfig.java
+++ src/main/java/com/takensoft/common/config/SecurityConfig.java
... | ... | @@ -12,7 +12,7 @@ |
12 | 12 |
import com.takensoft.common.exception.CustomAuthenticationEntryPoint; |
13 | 13 |
import com.takensoft.common.util.JWTUtil; |
14 | 14 |
import com.takensoft.common.util.LoginUtil; |
15 |
-import com.takensoft.common.verify.service.Impl.EmailServiceImpl; |
|
15 |
+import com.takensoft.common.certify.service.Impl.EmailServiceImpl; |
|
16 | 16 |
import com.takensoft.common.oauth.service.Impl.CustomOAuth2UserServiceImpl; |
17 | 17 |
import com.takensoft.common.oauth.handler.OAuth2AuthenticationSuccessHandler; |
18 | 18 |
import com.takensoft.common.oauth.handler.OAuth2AuthenticationFailureHandler; |
+++ src/main/java/com/takensoft/common/exception/CustomCertifyCodeNotMatchException.java
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author takensoft | |
5 | + * @since 2025.05.21 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.05.21 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 인증코드 불일치 시 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomCertifyCodeNotMatchException extends RuntimeException { | |
15 | + | |
16 | + public CustomCertifyCodeNotMatchException() { | |
17 | + | |
18 | + } | |
19 | + public CustomCertifyCodeNotMatchException(String message) { | |
20 | + super(message); | |
21 | + } | |
22 | + | |
23 | + public CustomCertifyCodeNotMatchException(String message, Throwable cause) { | |
24 | + super(message, cause); | |
25 | + } | |
26 | +} |
+++ src/main/java/com/takensoft/common/exception/CustomCertifyExpireException.java
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author takensoft | |
5 | + * @since 2025.05.21 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.05.21 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 인증시간 만료 시 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomCertifyExpireException extends RuntimeException { | |
15 | + | |
16 | + public CustomCertifyExpireException() { | |
17 | + | |
18 | + } | |
19 | + public CustomCertifyExpireException(String message) { | |
20 | + super(message); | |
21 | + } | |
22 | + | |
23 | + public CustomCertifyExpireException(String message, Throwable cause) { | |
24 | + super(message, cause); | |
25 | + } | |
26 | +} |
+++ src/main/java/com/takensoft/common/exception/CustomCertifyFailException.java
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author takensoft | |
5 | + * @since 2025.05.21 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.05.21 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 인증 실패 시 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomCertifyFailException extends RuntimeException { | |
15 | + | |
16 | + public CustomCertifyFailException() { | |
17 | + | |
18 | + } | |
19 | + public CustomCertifyFailException(String message) { | |
20 | + super(message); | |
21 | + } | |
22 | + | |
23 | + public CustomCertifyFailException(String message, Throwable cause) { | |
24 | + super(message, cause); | |
25 | + } | |
26 | +} |
+++ src/main/java/com/takensoft/common/exception/CustomCertifySendFailException.java
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author takensoft | |
5 | + * @since 2025.05.21 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.05.21 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 인증 발송 실패 시 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomCertifySendFailException extends RuntimeException { | |
15 | + | |
16 | + public CustomCertifySendFailException() { | |
17 | + | |
18 | + } | |
19 | + public CustomCertifySendFailException(String message) { | |
20 | + super(message); | |
21 | + } | |
22 | + | |
23 | + public CustomCertifySendFailException(String message, Throwable cause) { | |
24 | + super(message, cause); | |
25 | + } | |
26 | +} |
--- src/main/java/com/takensoft/common/exception/CustomEmailCodeNotMatchException.java
... | ... | @@ -1,26 +0,0 @@ |
1 | -package com.takensoft.common.exception; | |
2 | - | |
3 | -/** | |
4 | - * @author takensoft | |
5 | - * @since 2025.05.21 | |
6 | - * @modification | |
7 | - * since | author | description | |
8 | - * 2025.05.21 | 하석형 | 최초 등록 | |
9 | - * | |
10 | - * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | - * | |
12 | - * 이메일 인증코드 불일치 시 발생하는 예외 | |
13 | - */ | |
14 | -public class CustomEmailCodeNotMatchException extends RuntimeException { | |
15 | - | |
16 | - public CustomEmailCodeNotMatchException() { | |
17 | - | |
18 | - } | |
19 | - public CustomEmailCodeNotMatchException(String message) { | |
20 | - super(message); | |
21 | - } | |
22 | - | |
23 | - public CustomEmailCodeNotMatchException(String message, Throwable cause) { | |
24 | - super(message, cause); | |
25 | - } | |
26 | -} |
--- src/main/java/com/takensoft/common/exception/CustomEmailSendFailException.java
... | ... | @@ -1,26 +0,0 @@ |
1 | -package com.takensoft.common.exception; | |
2 | - | |
3 | -/** | |
4 | - * @author takensoft | |
5 | - * @since 2025.05.21 | |
6 | - * @modification | |
7 | - * since | author | description | |
8 | - * 2025.05.21 | 하석형 | 최초 등록 | |
9 | - * | |
10 | - * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | - * | |
12 | - * 이메일 발송 실패 시 발생하는 예외 | |
13 | - */ | |
14 | -public class CustomEmailSendFailException extends RuntimeException { | |
15 | - | |
16 | - public CustomEmailSendFailException() { | |
17 | - | |
18 | - } | |
19 | - public CustomEmailSendFailException(String message) { | |
20 | - super(message); | |
21 | - } | |
22 | - | |
23 | - public CustomEmailSendFailException(String message, Throwable cause) { | |
24 | - super(message, cause); | |
25 | - } | |
26 | -} |
--- src/main/java/com/takensoft/common/exception/CustomEmailVerifyExpireException.java
... | ... | @@ -1,26 +0,0 @@ |
1 | -package com.takensoft.common.exception; | |
2 | - | |
3 | -/** | |
4 | - * @author takensoft | |
5 | - * @since 2025.05.21 | |
6 | - * @modification | |
7 | - * since | author | description | |
8 | - * 2025.05.21 | 하석형 | 최초 등록 | |
9 | - * | |
10 | - * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | - * | |
12 | - * 이메일 인증시간 만료 시 발생하는 예외 | |
13 | - */ | |
14 | -public class CustomEmailVerifyExpireException extends RuntimeException { | |
15 | - | |
16 | - public CustomEmailVerifyExpireException() { | |
17 | - | |
18 | - } | |
19 | - public CustomEmailVerifyExpireException(String message) { | |
20 | - super(message); | |
21 | - } | |
22 | - | |
23 | - public CustomEmailVerifyExpireException(String message, Throwable cause) { | |
24 | - super(message, cause); | |
25 | - } | |
26 | -} |
--- src/main/java/com/takensoft/common/exception/CustomEmailVerifyFailException.java
... | ... | @@ -1,26 +0,0 @@ |
1 | -package com.takensoft.common.exception; | |
2 | - | |
3 | -/** | |
4 | - * @author takensoft | |
5 | - * @since 2025.05.21 | |
6 | - * @modification | |
7 | - * since | author | description | |
8 | - * 2025.05.21 | 하석형 | 최초 등록 | |
9 | - * | |
10 | - * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | - * | |
12 | - * 이메일 인증 실패 시 발생하는 예외 | |
13 | - */ | |
14 | -public class CustomEmailVerifyFailException extends RuntimeException { | |
15 | - | |
16 | - public CustomEmailVerifyFailException() { | |
17 | - | |
18 | - } | |
19 | - public CustomEmailVerifyFailException(String message) { | |
20 | - super(message); | |
21 | - } | |
22 | - | |
23 | - public CustomEmailVerifyFailException(String message, Throwable cause) { | |
24 | - super(message, cause); | |
25 | - } | |
26 | -} |
+++ src/main/java/com/takensoft/common/exception/CustomMblTelnoTakenException.java
... | ... | @@ -0,0 +1,28 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author 하석형 | |
5 | + * @since 2025.06.30 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.06.30 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 회원가입 시 휴대폰번호 중복으로 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomMblTelnoTakenException extends RuntimeException { | |
15 | + | |
16 | + public CustomMblTelnoTakenException() { | |
17 | + | |
18 | + } | |
19 | + | |
20 | + public CustomMblTelnoTakenException(String message) { | |
21 | + super(message); | |
22 | + } | |
23 | + | |
24 | + public CustomMblTelnoTakenException(String message, Throwable cause) { | |
25 | + super(message, cause); | |
26 | + } | |
27 | + | |
28 | +}(파일 끝에 줄바꿈 문자 없음) |
--- src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
+++ src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
... | ... | @@ -329,46 +329,46 @@ |
329 | 329 |
* |
330 | 330 |
* CustomEmailSendFailException이 발생한 경우 |
331 | 331 |
*/ |
332 |
- @ExceptionHandler(CustomEmailSendFailException.class) |
|
333 |
- public ResponseEntity<?> handleCustomEmailSendFailException(CustomEmailSendFailException cesfe) { |
|
332 |
+ @ExceptionHandler(CustomCertifySendFailException.class) |
|
333 |
+ public ResponseEntity<?> handleCustomEmailSendFailException(CustomCertifySendFailException cesfe) { |
|
334 | 334 |
logError(cesfe); |
335 |
- return resUtil.errorRes(MessageCode.EMAIL_SEND_FAIL); |
|
335 |
+ return resUtil.errorRes(MessageCode.CERTIFY_CODE_SEND_FAIL); |
|
336 | 336 |
} |
337 | 337 |
|
338 | 338 |
/** |
339 |
- * @param cevee - CustomEmailVerifyExpireException 예외 객체 |
|
340 |
- * @return CustomEmailVerifyExpireException에 대한 HTTP 응답 |
|
339 |
+ * @param cevee - CustomCertifyExpireException 예외 객체 |
|
340 |
+ * @return CustomCertifyExpireException에 대한 HTTP 응답 |
|
341 | 341 |
* |
342 |
- * CustomEmailVerifyExpireException이 발생한 경우 |
|
342 |
+ * CustomCertifyExpireException이 발생한 경우 |
|
343 | 343 |
*/ |
344 |
- @ExceptionHandler(CustomEmailVerifyExpireException.class) |
|
345 |
- public ResponseEntity<?> handleCustomEmailVerifyExpireException(CustomEmailVerifyExpireException cevee) { |
|
344 |
+ @ExceptionHandler(CustomCertifyExpireException.class) |
|
345 |
+ public ResponseEntity<?> handleCustomCertifyExpireException(CustomCertifyExpireException cevee) { |
|
346 | 346 |
logError(cevee); |
347 |
- return resUtil.errorRes(MessageCode.EMAIL_VERIFY_EXPIRED); |
|
347 |
+ return resUtil.errorRes(MessageCode.CERTIFY_EXPIRED); |
|
348 | 348 |
} |
349 | 349 |
|
350 | 350 |
/** |
351 |
- * @param cevfe - CustomEmailVerifyFailException 예외 객체 |
|
352 |
- * @return CustomEmailVerifyFailException에 대한 HTTP 응답 |
|
351 |
+ * @param cevfe - CustomCertifyFailException 예외 객체 |
|
352 |
+ * @return CustomCertifyFailException에 대한 HTTP 응답 |
|
353 | 353 |
* |
354 |
- * CustomEmailVerifyFailException이 발생한 경우 |
|
354 |
+ * CustomCertifyFailException 발생한 경우 |
|
355 | 355 |
*/ |
356 |
- @ExceptionHandler(CustomEmailVerifyFailException.class) |
|
357 |
- public ResponseEntity<?> handleCustomEmailVerifyFailException(CustomEmailVerifyFailException cevfe) { |
|
356 |
+ @ExceptionHandler(CustomCertifyFailException.class) |
|
357 |
+ public ResponseEntity<?> handleCustomCertifyFailException(CustomCertifyFailException cevfe) { |
|
358 | 358 |
logError(cevfe); |
359 |
- return resUtil.errorRes(MessageCode.EMAIL_VERIFY_FAIL); |
|
359 |
+ return resUtil.errorRes(MessageCode.CERTIFY_FAIL); |
|
360 | 360 |
} |
361 | 361 |
|
362 | 362 |
/** |
363 |
- * @param cecnme - CustomEmailCodeNotMatchException 예외 객체 |
|
364 |
- * @return CustomEmailCodeNotMatchException에 대한 HTTP 응답 |
|
363 |
+ * @param cecnme - CustomCertifyCodeNotMatchException 예외 객체 |
|
364 |
+ * @return CustomCertifyCodeNotMatchException에 대한 HTTP 응답 |
|
365 | 365 |
* |
366 |
- * CustomEmailCodeNotMatchException이 발생한 경우 |
|
366 |
+ * CustomCertifyCodeNotMatchException이 발생한 경우 |
|
367 | 367 |
*/ |
368 |
- @ExceptionHandler(CustomEmailCodeNotMatchException.class) |
|
369 |
- public ResponseEntity<?> handleCustomEmailCodeNotMatchException(CustomEmailCodeNotMatchException cecnme) { |
|
368 |
+ @ExceptionHandler(CustomCertifyCodeNotMatchException.class) |
|
369 |
+ public ResponseEntity<?> handleCustomCertifyCodeNotMatchException(CustomCertifyCodeNotMatchException cecnme) { |
|
370 | 370 |
logError(cecnme); |
371 |
- return resUtil.errorRes(MessageCode.CODE_NOT_MATCH); |
|
371 |
+ return resUtil.errorRes(MessageCode.CERTIFY_CODE_NOT_MATCH); |
|
372 | 372 |
} |
373 | 373 |
|
374 | 374 |
/** |
... | ... | @@ -384,6 +384,18 @@ |
384 | 384 |
} |
385 | 385 |
|
386 | 386 |
/** |
387 |
+ * @param cmtte - CustomMblTelnoTakenException 예외 객체 |
|
388 |
+ * @return CustomMblTelnoTakenException에 대한 HTTP 응답 |
|
389 |
+ * |
|
390 |
+ * CustomMblTelnoTakenException 발생한 경우 |
|
391 |
+ */ |
|
392 |
+ @ExceptionHandler(CustomMblTelnoTakenException.class) |
|
393 |
+ public ResponseEntity<?> handleCustomMblTelnoTakenException(CustomMblTelnoTakenException cmtte) { |
|
394 |
+ logError(cmtte); |
|
395 |
+ return resUtil.errorRes(MessageCode.SIGNUP_MBL_TELNO_TAKEN); |
|
396 |
+ } |
|
397 |
+ |
|
398 |
+ /** |
|
387 | 399 |
* @param e - Exception 예외 객체 |
388 | 400 |
* @return 기타 예외에 대한 HTTP 응답 |
389 | 401 |
* |
--- src/main/java/com/takensoft/common/filter/LoginFilter.java
+++ src/main/java/com/takensoft/common/filter/LoginFilter.java
... | ... | @@ -6,8 +6,8 @@ |
6 | 6 |
import com.takensoft.cms.mber.vo.MberVO; |
7 | 7 |
import com.takensoft.common.exception.FilterExceptionHandler; |
8 | 8 |
import com.takensoft.common.util.LoginUtil; |
9 |
-import com.takensoft.common.verify.service.Impl.EmailServiceImpl; |
|
10 |
-import com.takensoft.common.verify.vo.EmailVO; |
|
9 |
+import com.takensoft.common.certify.service.Impl.EmailServiceImpl; |
|
10 |
+import com.takensoft.common.certify.vo.EmailVO; |
|
11 | 11 |
import lombok.SneakyThrows; |
12 | 12 |
import org.springframework.http.HttpStatus; |
13 | 13 |
import org.springframework.security.authentication.AuthenticationManager; |
... | ... | @@ -85,7 +85,7 @@ |
85 | 85 |
EmailVO emailVO = new EmailVO().builder() |
86 | 86 |
.email(mber.getEml()) |
87 | 87 |
.build(); |
88 |
- emailServiceImpl.sendEmailVerifyCode(emailVO); |
|
88 |
+ emailServiceImpl.sendEmailCertifyCode(emailVO); |
|
89 | 89 |
|
90 | 90 |
result.put("mbrId", mber.getMbrId()); |
91 | 91 |
result.put("email", mber.getEml()); |
--- src/main/java/com/takensoft/common/message/MessageCode.java
+++ src/main/java/com/takensoft/common/message/MessageCode.java
... | ... | @@ -56,6 +56,7 @@ |
56 | 56 |
SIGNUP_SUCCESS("user.signup.success", HttpStatus.OK), // 회원가입 성공 |
57 | 57 |
SIGNUP_ID_TAKEN("user.signup.id_taken", HttpStatus.CONFLICT), // 아이디 중복 |
58 | 58 |
SIGNUP_EMAIL_TAKEN("user.signup.email_taken", HttpStatus.CONFLICT), // 이메일 중복 |
59 |
+ SIGNUP_MBL_TELNO_TAKEN("user.signup.mbl_telno_taken", HttpStatus.CONFLICT), // 휴대폰번호 중복 |
|
59 | 60 |
LOGIN_USER_NOT_FOUND("user.login.user_not_found", HttpStatus.NOT_FOUND), // 사용자가 존재 하지 않는 경우 |
60 | 61 |
LOGIN_INVALID_CREDENTIALS("user.login.invalid_credentials", HttpStatus.UNAUTHORIZED), // 비밀번호 불일치 |
61 | 62 |
LOGIN_AUTHENTICATION_REQUIRED("user.login.authentication_required", HttpStatus.FORBIDDEN), // 인증 거부 |
... | ... | @@ -68,13 +69,13 @@ |
68 | 69 |
// 파일 관련 |
69 | 70 |
FILE_UPLOAD_FAIL("file.upload_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 파일 업로드 실패 |
70 | 71 |
|
71 |
- // 이메일 인증 관련 |
|
72 |
- EMAIL_SEND_SUCCESS("email.send_success", HttpStatus.OK), // 이메일 발송 성공 |
|
73 |
- EMAIL_SEND_FAIL("email.send_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 이메일 발송 실패 |
|
74 |
- EMAIL_VERIFY_SUCCESS("email.verify_success", HttpStatus.OK), // 이메일 인증 성공 |
|
75 |
- EMAIL_VERIFY_EXPIRED("email.verify_expired", HttpStatus.UNAUTHORIZED), // 이메일 인증 만료 |
|
76 |
- EMAIL_VERIFY_FAIL("email.verify_fail", HttpStatus.UNAUTHORIZED), // 이메일 인증 실패 |
|
77 |
- CODE_NOT_MATCH("email.code_not_match", HttpStatus.UNAUTHORIZED), // 인증 코드 불일치 |
|
72 |
+ // 인증 관련 |
|
73 |
+ CERTIFY_CODE_SEND_SUCCESS("certify.send_success", HttpStatus.OK), // 인증 코드 발송 성공 |
|
74 |
+ CERTIFY_CODE_SEND_FAIL("certify.send_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 인증 코드 발송 실패 |
|
75 |
+ CERTIFY_SUCCESS("certify.certify_success", HttpStatus.OK), // 인증 성공 |
|
76 |
+ CERTIFY_EXPIRED("certify.certify_expired", HttpStatus.UNAUTHORIZED), // 인증 만료 |
|
77 |
+ CERTIFY_FAIL("certify.certify_fail", HttpStatus.UNAUTHORIZED), // 인증 실패 |
|
78 |
+ CERTIFY_CODE_NOT_MATCH("certify.code_not_match", HttpStatus.UNAUTHORIZED), // 인증 코드 불일치 |
|
78 | 79 |
|
79 | 80 |
//소셜 로그인 관련 |
80 | 81 |
OAUTH2_LOGIN_ERROR("oauth2.login_error", HttpStatus.INTERNAL_SERVER_ERROR), //소셜 로그인 실패 |
--- src/main/resources/application.yml
+++ src/main/resources/application.yml
... | ... | @@ -62,8 +62,16 @@ |
62 | 62 |
auth: true |
63 | 63 |
starttls: # 데이터 암호화 관련 |
64 | 64 |
enable: true |
65 |
- verifyTime: 600000 # 인증가능 시간: 10분 |
|
66 |
- storeTime: 86400000 # 보관 시간: 24시간 |
|
65 |
+ certify-time: 600000 # 인증가능 시간: 10분 |
|
66 |
+ store-time: 86400000 # 보관 시간: 24시간 |
|
67 |
+ |
|
68 |
+ # SMS 인증 |
|
69 |
+ sms: |
|
70 |
+ api-key: NCSC5VEIMOYDW3RC |
|
71 |
+ api-secret: FJ9YOUOELWSXDZO9MAFMPXPU6IFZS7PG |
|
72 |
+ sender-number: "01051054225" |
|
73 |
+ certify-time: 600000 # 인증가능 시간: 10분 |
|
74 |
+ store-time: 86400000 # 보관 시간: 24시간 |
|
67 | 75 |
|
68 | 76 |
# OAuth2 설정 추가 |
69 | 77 |
security: |
--- src/main/resources/message/messages_en.yml
+++ src/main/resources/message/messages_en.yml
... | ... | @@ -43,6 +43,7 @@ |
43 | 43 |
signup: |
44 | 44 |
id_taken: "The userid is already in use." |
45 | 45 |
email_taken: "The email is already in use." |
46 |
+ mbl_telno_taken: "The mobile phone number is already in use." |
|
46 | 47 |
success: "Registration completed successfully." |
47 | 48 |
login: |
48 | 49 |
user_not_found: "User information does not exist." |
... | ... | @@ -59,14 +60,14 @@ |
59 | 60 |
file: |
60 | 61 |
upload_fail: "File upload failed." |
61 | 62 |
|
62 |
-# 이메일 인증 관련 |
|
63 |
-email: |
|
64 |
- send_success: "Email sent successfully." |
|
65 |
- send_fail: "Failed to send email." |
|
66 |
- verify_success: "Email verification completed successfully." |
|
67 |
- verify_expired: "Email verification has expired." |
|
68 |
- verify_fail: "Email verification failed." |
|
69 |
- code_not_match: "verification code does not match." |
|
63 |
+# 인증 관련 |
|
64 |
+certify: |
|
65 |
+ send_success: "Sent successfully." |
|
66 |
+ send_fail: "Failed to send." |
|
67 |
+ certify_success: "Certification completed successfully." |
|
68 |
+ certify_expired: "Certification has expired." |
|
69 |
+ certify_fail: "Certification failed." |
|
70 |
+ code_not_match: "Certification code does not match." |
|
70 | 71 |
|
71 | 72 |
# 소셜로그인 관련 |
72 | 73 |
oauth2: |
--- src/main/resources/message/messages_ko.yml
+++ src/main/resources/message/messages_ko.yml
... | ... | @@ -44,6 +44,7 @@ |
44 | 44 |
signup: |
45 | 45 |
id_taken: "이미 사용중인 아이디입니다." |
46 | 46 |
email_taken: "이미 사용중인 이메일입니다." |
47 |
+ mbl_telno_taken: "이미 사용중인 이메일입니다." |
|
47 | 48 |
success: "회원가입이 정상처리 되었습니다." |
48 | 49 |
login: |
49 | 50 |
user_not_found: "회원정보가 존재하지 않습니다." |
... | ... | @@ -60,13 +61,13 @@ |
60 | 61 |
file: |
61 | 62 |
upload_fail: "파일 업로드에 실패했습니다." |
62 | 63 |
|
63 |
-# 이메일 인증 관련 |
|
64 |
-email: |
|
65 |
- send_success: "이메일을 발송했습니다." |
|
66 |
- send_fail: "이메일 발송에 실패했습니다." |
|
67 |
- verify_success: "이메일 인증이 완료되었습니다." |
|
68 |
- verify_expired: "인증 시간이 만료되었습니다." |
|
69 |
- verify_fail: "이메일 인증에 실패했습니다." |
|
64 |
+# 인증 관련 |
|
65 |
+certify: |
|
66 |
+ send_success: "인증 코드를 발송했습니다." |
|
67 |
+ send_fail: "인증 코드 발송에 실패했습니다." |
|
68 |
+ certify_success: "인증이 완료되었습니다." |
|
69 |
+ certify_expired: "인증 시간이 만료되었습니다." |
|
70 |
+ certify_fail: "인증에 실패했습니다." |
|
70 | 71 |
code_not_match: "인증 코드가 일치하지 않습니다." |
71 | 72 |
|
72 | 73 |
# 소셜로그인 관련 |
--- src/main/resources/mybatis/mapper/mber/admMbr-SQL.xml
+++ src/main/resources/mybatis/mapper/mber/admMbr-SQL.xml
... | ... | @@ -295,6 +295,19 @@ |
295 | 295 |
</select> |
296 | 296 |
|
297 | 297 |
<!-- |
298 |
+ 작 성 자 : 하석형 |
|
299 |
+ 작 성 일 : 2025.06.27 |
|
300 |
+ 내 용 : 휴대폰번호로 아이디 찾기 (로그인 아이디) |
|
301 |
+ --> |
|
302 |
+ <select id="lgnIdSearchByMblTelno" parameterType="AdmMbrDTO" resultType="String"> |
|
303 |
+ SELECT lgn_id |
|
304 |
+ FROM mbr_info |
|
305 |
+ WHERE mbr_nm = #{mbrNm} |
|
306 |
+ AND mbl_telno = #{mblTelno} |
|
307 |
+ AND use_yn = 'Y' |
|
308 |
+ </select> |
|
309 |
+ |
|
310 |
+ <!-- |
|
298 | 311 |
작 성 자 : 박정하 |
299 | 312 |
작 성 일 : 2024.07.03 |
300 | 313 |
내 용 : 아이디 찾기 (회원 아이디) |
--- src/main/resources/mybatis/mapper/mber/mber-SQL.xml
+++ src/main/resources/mybatis/mapper/mber/mber-SQL.xml
... | ... | @@ -306,6 +306,20 @@ |
306 | 306 |
</if> |
307 | 307 |
</select> |
308 | 308 |
|
309 |
+ <!-- 휴대폰번호로 사용자 조회 --> |
|
310 |
+ <select id="findByMblTelno" parameterType="map" resultType="MberVO"> |
|
311 |
+ <include refid="selectMber" /> |
|
312 |
+ WHERE mi.mbl_telno = #{mblTelno} |
|
313 |
+ AND mi.use_yn = 'Y' |
|
314 |
+ AND mi.mbr_stts = '1' |
|
315 |
+ <if test="mbrNm != null and mbrNm != ''"> |
|
316 |
+ AND mi.mbr_nm = #{mbrNm} |
|
317 |
+ </if> |
|
318 |
+ <if test="mbrId != null and mbrId != ''"> |
|
319 |
+ AND mi.mbr_id != #{mbrId} |
|
320 |
+ </if> |
|
321 |
+ </select> |
|
322 |
+ |
|
309 | 323 |
<!-- 이메일과 회원 유형으로 사용자 조회 --> |
310 | 324 |
<select id="findByEmailAndProvider" parameterType="map" resultMap="mberMap"> |
311 | 325 |
<include refid="selectMber" /> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?