
--- src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
+++ src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
... | ... | @@ -72,12 +72,14 @@ |
72 | 72 |
MberVO findByMber(String mbrId); |
73 | 73 |
|
74 | 74 |
/** |
75 |
- * @param email - 이메일 |
|
75 |
+ * @param params |
|
76 |
+ * - eml: 이메일 정보 |
|
77 |
+ * - mbrId: 회원 아이디 |
|
76 | 78 |
* @return MberVO - 사용자 정보 |
77 | 79 |
* |
78 | 80 |
* 이메일로만 사용자 조회 (provider 무관) |
79 | 81 |
*/ |
80 |
- MberVO findByEmail(String email); |
|
82 |
+ MberVO findByEmail(HashMap<String, Object> params); |
|
81 | 83 |
|
82 | 84 |
/** |
83 | 85 |
* @param email - 이메일 |
--- src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
... | ... | @@ -3,6 +3,7 @@ |
3 | 3 |
import com.takensoft.cms.dept.service.DeptService; |
4 | 4 |
import com.takensoft.cms.dept.vo.DeptMbrVO; |
5 | 5 |
import com.takensoft.cms.mber.dao.AdmMbrDAO; |
6 |
+import com.takensoft.cms.mber.dao.MberDAO; |
|
6 | 7 |
import com.takensoft.cms.mber.dto.AdmMbrDTO; |
7 | 8 |
import com.takensoft.cms.mber.dto.JoinDTO; |
8 | 9 |
import com.takensoft.cms.mber.dto.PasswordDTO; |
... | ... | @@ -48,6 +49,7 @@ |
48 | 49 |
private final MberService mbrService; |
49 | 50 |
private final DeptService deptService; |
50 | 51 |
private final VerificationService verificationService; |
52 |
+ private final MberDAO mberDAO; |
|
51 | 53 |
|
52 | 54 |
/** |
53 | 55 |
* @param params - 회원정보 |
... | ... | @@ -146,6 +148,14 @@ |
146 | 148 |
@Transactional(rollbackFor = Exception.class) |
147 | 149 |
public int updateMbr(AdmMbrDTO admMbrDTO){ |
148 | 150 |
try { |
151 |
+ // 이메일 중복 검사 |
|
152 |
+ if (admMbrDTO.getEml() != null || !admMbrDTO.getEml().isEmpty()) { |
|
153 |
+ HashMap<String, Object> emlParams = new HashMap<>(); |
|
154 |
+ emlParams.put("eml", admMbrDTO.getEml()); |
|
155 |
+ emlParams.put("mbrId", admMbrDTO.getMbrId()); |
|
156 |
+ mbrService.findByCheckEmail(emlParams); |
|
157 |
+ } |
|
158 |
+ |
|
149 | 159 |
// 비밀번호 변경 |
150 | 160 |
if (admMbrDTO.getPswd() != null && !admMbrDTO.getPswd().equals("")) { |
151 | 161 |
PasswordDTO passwordDTO = new PasswordDTO(); |
... | ... | @@ -199,6 +209,15 @@ |
199 | 209 |
List<DeptMbrVO> deptMbrList = new ArrayList<>(); |
200 | 210 |
deptMbrList.add(deptMbrVO); |
201 | 211 |
int deptResult = deptService.deptMbrDelete(deptMbrList); |
212 |
+ |
|
213 |
+ // SNS 연계 비활성화 |
|
214 |
+ HashMap<String, Object> params = new HashMap<>(); |
|
215 |
+ params.put("mbrId", admMbrDTO.getMbrId()); |
|
216 |
+ params.put("mdfr", admMbrDTO.getMdfr()); |
|
217 |
+ int unlinkResult = mberDAO.unlinkSocialAccount(params); |
|
218 |
+ if (unlinkResult == 0) { |
|
219 |
+ throw new CustomDeleteFailException("SNS 연계 비활성화에 실패했습니다."); |
|
220 |
+ } |
|
202 | 221 |
} |
203 | 222 |
return result; |
204 | 223 |
} 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
... | ... | @@ -36,6 +36,7 @@ |
36 | 36 |
* since | author | description |
37 | 37 |
* 2024.04.01 | takensoft | 최초 등록 |
38 | 38 |
* 2025.05.29 | takensoft | 통합 로그인 기능 추가 |
39 |
+ * 2025.06.20 | 하석형 | findByCheckEmail 추가 |
|
39 | 40 |
* |
40 | 41 |
* 회원 정보 관련 구현체 |
41 | 42 |
* EgovAbstractServiceImpl : 전자정부 상속 |
... | ... | @@ -77,7 +78,7 @@ |
77 | 78 |
|
78 | 79 |
/** |
79 | 80 |
* @param lgnId - 로그인 아이디 |
80 |
- * @return boolean - 아이디 아이디 중복 여부 |
|
81 |
+ * @return boolean - 아이디 중복 여부 |
|
81 | 82 |
* @throws CustomIdTakenException - 아이디 중복 예외 발생 시 |
82 | 83 |
* @throws DataAccessException - db 관련 예외 발생 시 |
83 | 84 |
* @throws Exception - 그 외 예외 발생 시 |
... | ... | @@ -100,12 +101,37 @@ |
100 | 101 |
} |
101 | 102 |
|
102 | 103 |
/** |
104 |
+ * @param params |
|
105 |
+ * - eml: 이메일 정보 |
|
106 |
+ * - mbrId: 회원 아이디 |
|
107 |
+ * @return boolean - 이메일 중복 여부 |
|
108 |
+ * @throws CustomIdTakenException - 이메일 중복 예외 발생 시 |
|
109 |
+ * @throws DataAccessException - db 관련 예외 발생 시 |
|
110 |
+ * @throws Exception - 그 외 예외 발생 시 |
|
111 |
+ * |
|
112 |
+ * 이메일 중복 검사 |
|
113 |
+ */ |
|
114 |
+ @Override |
|
115 |
+ public boolean findByCheckEmail(HashMap<String, Object> params) { |
|
116 |
+ try { |
|
117 |
+ MberVO existingUser = mberDAO.findByEmail(params); |
|
118 |
+ if (existingUser != null) { |
|
119 |
+ throw new CustomEmailTakenException("해당 이메일로 이미 계정이 등록되어 있습니다."); |
|
120 |
+ } |
|
121 |
+ return true; |
|
122 |
+ } catch (DataAccessException dae) { |
|
123 |
+ throw dae; |
|
124 |
+ } catch (Exception e) { |
|
125 |
+ throw e; |
|
126 |
+ } |
|
127 |
+ } |
|
128 |
+ |
|
129 |
+ /** |
|
103 | 130 |
* @param req - HTTP 요청 객체 |
104 | 131 |
* @param joinDTO -회원정보 |
105 | 132 |
* @return HashMap<String, Object> - 회원정보 등록 결과 |
106 | 133 |
* - mbrId : 회원 아이디 |
107 | 134 |
* - result : 회원등록정보 결과 |
108 |
- * @throws CustomNotFoundException - 사용자 정보 조회 예외 발생 시 |
|
109 | 135 |
* @throws CustomInsertFailException - 회원가입, 회원권한 등록 실패 예외 발생 시 |
110 | 136 |
* @throws DataAccessException - db 관련 예외 발생 시 |
111 | 137 |
* @throws Exception - 그 외 예외 발생 시 |
... | ... | @@ -118,10 +144,9 @@ |
118 | 144 |
try { |
119 | 145 |
// 이메일로 기존 계정 확인 (기본 검사만 수행) |
120 | 146 |
if (joinDTO.getEml() != null && !joinDTO.getEml().isEmpty()) { |
121 |
- MberVO existingUser = mberDAO.findByEmail(joinDTO.getEml()); |
|
122 |
- if (existingUser != null) { |
|
123 |
- throw new CustomIdTakenException("해당 이메일로 이미 계정이 등록되어 있습니다."); |
|
124 |
- } |
|
147 |
+ HashMap<String, Object> params = new HashMap<>(); |
|
148 |
+ params.put("eml", joinDTO.getEml()); |
|
149 |
+ findByCheckEmail(params); // 이메일 중복 검사 |
|
125 | 150 |
} |
126 | 151 |
|
127 | 152 |
// 기존 회원가입 로직 실행 |
... | ... | @@ -388,7 +413,9 @@ |
388 | 413 |
@Transactional(readOnly = true) |
389 | 414 |
public MberVO findByEmail(String email) { |
390 | 415 |
try { |
391 |
- return mberDAO.findByEmail(email); |
|
416 |
+ HashMap<String, Object> params = new HashMap<>(); |
|
417 |
+ params.put("eml", email); |
|
418 |
+ return mberDAO.findByEmail(params); |
|
392 | 419 |
} catch (DataAccessException dae) { |
393 | 420 |
throw dae; |
394 | 421 |
} catch (Exception e) { |
--- src/main/java/com/takensoft/cms/mber/service/MberService.java
+++ src/main/java/com/takensoft/cms/mber/service/MberService.java
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 |
* @modification |
15 | 15 |
* since | author | description |
16 | 16 |
* 2024.04.01 | takensoft | 최초 등록 |
17 |
+ * 2025.06.20 | 하석형 | findByCheckEmail 추가 |
|
17 | 18 |
* |
18 | 19 |
* 회원 정보 관련 인터페이스 |
19 | 20 |
*/ |
... | ... | @@ -21,13 +22,23 @@ |
21 | 22 |
|
22 | 23 |
/** |
23 | 24 |
* @param lgnId - 로그인 아이디 |
24 |
- * @return boolean - 아이디 아이디 중복 여부 |
|
25 |
+ * @return boolean - 아이디 중복 여부 |
|
25 | 26 |
* |
26 | 27 |
* 아이디 중복 검사 |
27 | 28 |
*/ |
28 | 29 |
public boolean findByCheckLoginId(String lgnId); |
29 | 30 |
|
30 | 31 |
/** |
32 |
+ * @param params |
|
33 |
+ * - eml: 이메일 정보 |
|
34 |
+ * - mbrId: 회원 아이디 |
|
35 |
+ * @return boolean - 이메일 중복 여부 |
|
36 |
+ * |
|
37 |
+ * 이메일 중복 검사 |
|
38 |
+ */ |
|
39 |
+ public boolean findByCheckEmail(HashMap<String, Object> params); |
|
40 |
+ |
|
41 |
+ /** |
|
31 | 42 |
* @param req - HTTP 요청 객체 |
32 | 43 |
* @param joinDTO -회원정보 |
33 | 44 |
* @return HashMap<String, Object> - 회원정보 등록 결과 |
+++ src/main/java/com/takensoft/common/exception/CustomEmailTakenException.java
... | ... | @@ -0,0 +1,28 @@ |
1 | +package com.takensoft.common.exception; | |
2 | + | |
3 | +/** | |
4 | + * @author 하석형 | |
5 | + * @since 2025.06.20 | |
6 | + * @modification | |
7 | + * since | author | description | |
8 | + * 2025.06.20 | 하석형 | 최초 등록 | |
9 | + * | |
10 | + * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스 | |
11 | + * | |
12 | + * 회원가입 시 이메일 중복으로 발생하는 예외 | |
13 | + */ | |
14 | +public class CustomEmailTakenException extends RuntimeException { | |
15 | + | |
16 | + public CustomEmailTakenException() { | |
17 | + | |
18 | + } | |
19 | + | |
20 | + public CustomEmailTakenException(String message) { | |
21 | + super(message); | |
22 | + } | |
23 | + | |
24 | + public CustomEmailTakenException(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
... | ... | @@ -372,6 +372,18 @@ |
372 | 372 |
} |
373 | 373 |
|
374 | 374 |
/** |
375 |
+ * @param cete - CustomEmailTakenException 예외 객체 |
|
376 |
+ * @return CustomEmailTakenException에 대한 HTTP 응답 |
|
377 |
+ * |
|
378 |
+ * CustomEmailTakenException이 발생한 경우 |
|
379 |
+ */ |
|
380 |
+ @ExceptionHandler(CustomEmailTakenException.class) |
|
381 |
+ public ResponseEntity<?> handleCustomEmailTakenException(CustomEmailTakenException cete) { |
|
382 |
+ logError(cete); |
|
383 |
+ return resUtil.errorRes(MessageCode.SIGNUP_EMAIL_TAKEN); |
|
384 |
+ } |
|
385 |
+ |
|
386 |
+ /** |
|
375 | 387 |
* @param e - Exception 예외 객체 |
376 | 388 |
* @return 기타 예외에 대한 HTTP 응답 |
377 | 389 |
* |
--- src/main/resources/mybatis/mapper/mber/mber-SQL.xml
+++ src/main/resources/mybatis/mapper/mber/mber-SQL.xml
... | ... | @@ -269,7 +269,7 @@ |
269 | 269 |
</select> |
270 | 270 |
|
271 | 271 |
<!-- 이메일로만 사용자 조회 --> |
272 |
- <select id="findByEmail" parameterType="String" resultType="MberVO"> |
|
272 |
+ <select id="findByEmail" parameterType="map" resultType="MberVO"> |
|
273 | 273 |
SELECT |
274 | 274 |
m.mbr_id as mbrId, |
275 | 275 |
m.lgn_id as lgnId, |
... | ... | @@ -298,9 +298,12 @@ |
298 | 298 |
m.mdfr, |
299 | 299 |
m.mdfcn_dt as mdfcnDt |
300 | 300 |
FROM mbr_info m |
301 |
- WHERE m.eml = #{email} |
|
301 |
+ WHERE m.eml = #{eml} |
|
302 | 302 |
AND m.use_yn = 'Y' |
303 | 303 |
AND m.mbr_stts = '1' |
304 |
+ <if test="mbrId != null and mbrId != ''"> |
|
305 |
+ AND m.mbr_id != #{mbrId} |
|
306 |
+ </if> |
|
304 | 307 |
</select> |
305 | 308 |
|
306 | 309 |
<!-- 이메일과 회원 유형으로 사용자 조회 --> |
... | ... | @@ -479,7 +482,7 @@ |
479 | 482 |
mdfr = #{mdfr}, |
480 | 483 |
mdfcn_dt = NOW() |
481 | 484 |
WHERE mbr_id = #{mbrId} |
482 |
- <if test="lgnOffrType != null"> |
|
485 |
+ <if test="lgnOffrType != null and lgnOffrType != ''"> |
|
483 | 486 |
AND lgn_offr_type = #{lgnOffrType} |
484 | 487 |
</if> |
485 | 488 |
</update> |
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?