하석형 하석형 06-20
250620 하석형 사용자 등록/수정 시 이메일 중복 확인 처리
@5b284ed4e541ea291268a0b59f7060ac6b1021df
src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
--- src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
+++ src/main/java/com/takensoft/cms/mber/dao/MberDAO.java
@@ -72,12 +72,14 @@
     MberVO findByMber(String mbrId);
 
     /**
-     * @param email - 이메일
+     * @param params
+     *  - eml: 이메일 정보
+     *  - mbrId: 회원 아이디
      * @return MberVO - 사용자 정보
      *
      * 이메일로만 사용자 조회 (provider 무관)
      */
-    MberVO findByEmail(String email);
+    MberVO findByEmail(HashMap<String, Object> params);
 
     /**
      * @param email - 이메일
src/main/java/com/takensoft/cms/mber/service/Impl/AdmMbrServiceImpl.java
--- 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 @@
 import com.takensoft.cms.dept.service.DeptService;
 import com.takensoft.cms.dept.vo.DeptMbrVO;
 import com.takensoft.cms.mber.dao.AdmMbrDAO;
+import com.takensoft.cms.mber.dao.MberDAO;
 import com.takensoft.cms.mber.dto.AdmMbrDTO;
 import com.takensoft.cms.mber.dto.JoinDTO;
 import com.takensoft.cms.mber.dto.PasswordDTO;
@@ -48,6 +49,7 @@
     private final MberService mbrService;
     private final DeptService deptService;
     private final VerificationService verificationService;
+    private final MberDAO mberDAO;
 
     /**
      * @param params - 회원정보
@@ -146,6 +148,14 @@
     @Transactional(rollbackFor = Exception.class)
     public int updateMbr(AdmMbrDTO admMbrDTO){
         try {
+            // 이메일 중복 검사
+            if (admMbrDTO.getEml() != null || !admMbrDTO.getEml().isEmpty()) {
+                HashMap<String, Object> emlParams = new HashMap<>();
+                emlParams.put("eml", admMbrDTO.getEml());
+                emlParams.put("mbrId", admMbrDTO.getMbrId());
+                mbrService.findByCheckEmail(emlParams);
+            }
+
             // 비밀번호 변경
             if (admMbrDTO.getPswd() != null && !admMbrDTO.getPswd().equals("")) {
                 PasswordDTO passwordDTO = new PasswordDTO();
@@ -199,6 +209,15 @@
                 List<DeptMbrVO> deptMbrList = new ArrayList<>();
                 deptMbrList.add(deptMbrVO);
                 int deptResult = deptService.deptMbrDelete(deptMbrList);
+
+                // SNS 연계 비활성화
+                HashMap<String, Object> params = new HashMap<>();
+                params.put("mbrId", admMbrDTO.getMbrId());
+                params.put("mdfr", admMbrDTO.getMdfr());
+                int unlinkResult = mberDAO.unlinkSocialAccount(params);
+                if (unlinkResult == 0) {
+                    throw new CustomDeleteFailException("SNS 연계 비활성화에 실패했습니다.");
+                }
             }
             return result;
         } 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
+++ src/main/java/com/takensoft/cms/mber/service/Impl/MberServiceImpl.java
@@ -36,6 +36,7 @@
  *     since    |    author    | description
  *  2024.04.01  |  takensoft   | 최초 등록
  *  2025.05.29  |  takensoft   | 통합 로그인 기능 추가
+ *  2025.06.20  |    하석형     | findByCheckEmail 추가
  *
  * 회원 정보 관련 구현체
  * EgovAbstractServiceImpl : 전자정부 상속
@@ -77,7 +78,7 @@
 
     /**
      * @param lgnId - 로그인 아이디
-     * @return boolean - 아이디 아이디 중복 여부
+     * @return boolean - 아이디 중복 여부
      * @throws CustomIdTakenException - 아이디 중복 예외 발생 시
      * @throws DataAccessException - db 관련 예외 발생 시
      * @throws Exception - 그 외 예외 발생 시
@@ -100,12 +101,37 @@
     }
 
     /**
+     * @param params
+     *  - eml: 이메일 정보
+     *  - mbrId: 회원 아이디
+     * @return boolean - 이메일 중복 여부
+     * @throws CustomIdTakenException - 이메일 중복 예외 발생 시
+     * @throws DataAccessException - db 관련 예외 발생 시
+     * @throws Exception - 그 외 예외 발생 시
+     *
+     * 이메일 중복 검사
+     */
+    @Override
+    public boolean findByCheckEmail(HashMap<String, Object> params) {
+        try {
+            MberVO existingUser = mberDAO.findByEmail(params);
+            if (existingUser != null) {
+                throw new CustomEmailTakenException("해당 이메일로 이미 계정이 등록되어 있습니다.");
+            }
+            return true;
+        } catch (DataAccessException dae) {
+            throw dae;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
      * @param req - HTTP 요청 객체
      * @param joinDTO -회원정보
      * @return HashMap<String, Object> - 회원정보 등록 결과
      *  - mbrId : 회원 아이디
      *  - result : 회원등록정보 결과
-     * @throws CustomNotFoundException - 사용자 정보 조회 예외 발생 시
      * @throws CustomInsertFailException - 회원가입, 회원권한 등록 실패 예외 발생 시
      * @throws DataAccessException - db 관련 예외 발생 시
      * @throws Exception - 그 외 예외 발생 시
@@ -118,10 +144,9 @@
         try {
             // 이메일로 기존 계정 확인 (기본 검사만 수행)
             if (joinDTO.getEml() != null && !joinDTO.getEml().isEmpty()) {
-                MberVO existingUser = mberDAO.findByEmail(joinDTO.getEml());
-                if (existingUser != null) {
-                    throw new CustomIdTakenException("해당 이메일로 이미 계정이 등록되어 있습니다.");
-                }
+                HashMap<String, Object> params = new HashMap<>();
+                params.put("eml", joinDTO.getEml());
+                findByCheckEmail(params); // 이메일 중복 검사
             }
 
             // 기존 회원가입 로직 실행
@@ -388,7 +413,9 @@
     @Transactional(readOnly = true)
     public MberVO findByEmail(String email) {
         try {
-            return mberDAO.findByEmail(email);
+            HashMap<String, Object> params = new HashMap<>();
+            params.put("eml", email);
+            return mberDAO.findByEmail(params);
         } catch (DataAccessException dae) {
             throw dae;
         } catch (Exception e) {
src/main/java/com/takensoft/cms/mber/service/MberService.java
--- src/main/java/com/takensoft/cms/mber/service/MberService.java
+++ src/main/java/com/takensoft/cms/mber/service/MberService.java
@@ -14,6 +14,7 @@
  * @modification
  *     since    |    author    | description
  *  2024.04.01  |  takensoft   | 최초 등록
+ *  2025.06.20  |    하석형     | findByCheckEmail 추가
  *
  * 회원 정보 관련 인터페이스
  */
@@ -21,13 +22,23 @@
 
     /**
      * @param lgnId - 로그인 아이디
-     * @return boolean - 아이디 아이디 중복 여부
+     * @return boolean - 아이디 중복 여부
      *
      * 아이디 중복 검사
      */
     public boolean findByCheckLoginId(String lgnId);
 
     /**
+     * @param params
+     *  - eml: 이메일 정보
+     *  - mbrId: 회원 아이디
+     * @return boolean - 이메일 중복 여부
+     *
+     * 이메일 중복 검사
+     */
+    public boolean findByCheckEmail(HashMap<String, Object> params);
+
+    /**
      * @param req - HTTP 요청 객체
      * @param joinDTO -회원정보
      * @return HashMap<String, Object> - 회원정보 등록 결과
 
src/main/java/com/takensoft/common/exception/CustomEmailTakenException.java (added)
+++ src/main/java/com/takensoft/common/exception/CustomEmailTakenException.java
@@ -0,0 +1,28 @@
+package com.takensoft.common.exception;
+
+/**
+ * @author 하석형
+ * @since 2025.06.20
+ * @modification
+ *     since    |    author    | description
+ *  2025.06.20  |    하석형     | 최초 등록
+ *
+ * RuntimeException - 실행 중 발생하는 예외를 처리하는 기본 클래스
+ *
+ * 회원가입 시 이메일 중복으로 발생하는 예외
+ */
+public class CustomEmailTakenException extends RuntimeException {
+
+    public CustomEmailTakenException() {
+
+    }
+
+    public CustomEmailTakenException(String message) {
+        super(message);
+    }
+
+    public CustomEmailTakenException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
--- src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
+++ src/main/java/com/takensoft/common/exception/GlobalExceptionHandler.java
@@ -372,6 +372,18 @@
     }
 
     /**
+     * @param cete - CustomEmailTakenException 예외 객체
+     * @return CustomEmailTakenException에 대한 HTTP 응답
+     *
+     * CustomEmailTakenException이 발생한 경우
+     */
+    @ExceptionHandler(CustomEmailTakenException.class)
+    public ResponseEntity<?> handleCustomEmailTakenException(CustomEmailTakenException cete) {
+        logError(cete);
+        return resUtil.errorRes(MessageCode.SIGNUP_EMAIL_TAKEN);
+    }
+
+    /**
      * @param e - Exception 예외 객체
      * @return 기타 예외에 대한 HTTP 응답
      *
src/main/resources/mybatis/mapper/mber/mber-SQL.xml
--- src/main/resources/mybatis/mapper/mber/mber-SQL.xml
+++ src/main/resources/mybatis/mapper/mber/mber-SQL.xml
@@ -269,7 +269,7 @@
     </select>
 
     <!-- 이메일로만 사용자 조회 -->
-    <select id="findByEmail" parameterType="String" resultType="MberVO">
+    <select id="findByEmail" parameterType="map" resultType="MberVO">
         SELECT
             m.mbr_id as mbrId,
             m.lgn_id as lgnId,
@@ -298,9 +298,12 @@
             m.mdfr,
             m.mdfcn_dt as mdfcnDt
         FROM mbr_info m
-        WHERE m.eml = #{email}
+        WHERE m.eml = #{eml}
         AND m.use_yn = 'Y'
         AND m.mbr_stts = '1'
+        <if test="mbrId != null and mbrId != ''">
+            AND m.mbr_id != #{mbrId}
+        </if>
     </select>
 
     <!-- 이메일과 회원 유형으로 사용자 조회 -->
@@ -479,7 +482,7 @@
             mdfr = #{mdfr},
             mdfcn_dt = NOW()
         WHERE mbr_id = #{mbrId}
-        <if test="lgnOffrType != null">
+        <if test="lgnOffrType != null and lgnOffrType != ''">
             AND lgn_offr_type = #{lgnOffrType}
         </if>
     </update>
Add a comment
List