하석형 하석형 06-23
250623 하석형 SNS 계정 연동해지/재연동 기능
@94afe996f72988fbd25330300d81a21d10b1c4a9
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
@@ -150,7 +150,7 @@
      *
      * 회원 ID로 소셜 계정 목록 조회
      */
-    List<MberSocialAccountVO> findSocialAccountsByMbrId(String mbrId);
+    List<MberSocialAccountVO> findSocialAccountsByMbrId(String mbrId, boolean searchAll);
 
     /**
      * @param params - 회원 ID와 제공자 타입을 포함한 Map
@@ -190,6 +190,17 @@
     int unlinkSocialAccount(HashMap<String, Object> params);
 
     /**
+     * @param params - 재연동 정보를 포함한 Map
+     *               - mbrId: 회원 ID
+     *               - lgnOffrType: 제공자 타입
+     *               - mdfr: 수정자
+     * @return int - 재연동 결과
+     *
+     * 소셜 계정 재연동
+     */
+    int reLinkSocialAccount(HashMap<String, Object> params);
+
+    /**
      * @param params - 메인 프로필 설정 정보를 포함한 Map
      *               - mbrId: 회원 ID
      *               - lgnOffrType: 제공자 타입
src/main/java/com/takensoft/cms/mber/service/Impl/UnifiedLoginServiceImpl.java
--- src/main/java/com/takensoft/cms/mber/service/Impl/UnifiedLoginServiceImpl.java
+++ src/main/java/com/takensoft/cms/mber/service/Impl/UnifiedLoginServiceImpl.java
@@ -507,14 +507,14 @@
     public boolean unlinkAccount(String mbrId, String lgnOffrType) {
         try {
             // 연동된 계정 개수 확인 (최소 1개는 유지해야 함)
-            List<MberSocialAccountVO> linkedAccounts = getLinkedAccounts(mbrId);
+            List<MberSocialAccountVO> linkedAccounts = getLinkedAccounts(mbrId, false);
             if (linkedAccounts.size() <= 1) {
                 throw new CustomNotFoundException("최소 하나의 로그인 방법은 유지해야 합니다.");
             }
 
             HashMap<String, Object> params = new HashMap<>();
             params.put("mbrId", mbrId);
-            params.put("lgnOffrType", convertProviderToMbrType(lgnOffrType));
+            params.put("lgnOffrType", lgnOffrType);
             params.put("mdfr", "UNLINK_SYSTEM");
 
             mberDAO.unlinkSocialAccount(params);
@@ -546,13 +546,35 @@
     }
 
     /**
+     * 계정 재연동
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean reLinkAccount(String mbrId, String lgnOffrType) {
+        try {
+            HashMap<String, Object> params = new HashMap<>();
+            params.put("mbrId", mbrId);
+            params.put("lgnOffrType", lgnOffrType);
+            params.put("mdfr", "RELINK_SYSTEM");
+
+            mberDAO.reLinkSocialAccount(params);
+
+            return true;
+        } catch (DataAccessException dae) {
+            throw dae;
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+    /**
      * 연동된 계정 목록 조회
      */
     @Override
     @Transactional(readOnly = true)
-    public List<MberSocialAccountVO> getLinkedAccounts(String mbrId) {
+    public List<MberSocialAccountVO> getLinkedAccounts(String mbrId, boolean searchAll) {
         try {
-            return mberDAO.findSocialAccountsByMbrId(mbrId);
+            return mberDAO.findSocialAccountsByMbrId(mbrId, searchAll);
         } catch (DataAccessException dae) {
             throw dae;
         } catch (Exception e) {
@@ -595,7 +617,7 @@
 
             if (existingUser != null) {
                 // 기존 계정의 연동 정보 조회
-                List<MberSocialAccountVO> linkedAccounts = getLinkedAccounts(existingUser.getMbrId());
+                List<MberSocialAccountVO> linkedAccounts = getLinkedAccounts(existingUser.getMbrId(), false);
 
                 // 새로운 제공자가 이미 연동되어 있는지 확인
                 boolean alreadyLinked = linkedAccounts.stream()
src/main/java/com/takensoft/cms/mber/service/UnifiedLoginService.java
--- src/main/java/com/takensoft/cms/mber/service/UnifiedLoginService.java
+++ src/main/java/com/takensoft/cms/mber/service/UnifiedLoginService.java
@@ -59,11 +59,19 @@
     boolean unlinkAccount(String mbrId, String lgnOffrType);
 
     /**
+     * 계정 재연동
+     * @param mbrId 회원 ID
+     * @param lgnOffrType 제공자 타입
+     * @return boolean 재연동 성공 여부
+     */
+    boolean reLinkAccount(String mbrId, String lgnOffrType);
+
+    /**
      * 연동된 계정 목록 조회
      * @param mbrId 회원 ID
      * @return List<MberSocialAccountVO> 연동된 계정 목록
      */
-    List<MberSocialAccountVO> getLinkedAccounts(String mbrId);
+    List<MberSocialAccountVO> getLinkedAccounts(String mbrId, boolean searchAll);
 
     /**
      * 메인 프로필 설정
src/main/java/com/takensoft/cms/mber/web/UnifiedLoginController.java
--- src/main/java/com/takensoft/cms/mber/web/UnifiedLoginController.java
+++ src/main/java/com/takensoft/cms/mber/web/UnifiedLoginController.java
@@ -39,7 +39,7 @@
     public ResponseEntity<?> getLinkedAccounts() {
         try {
             String currentUserId = verificationService.getCurrentUserId();
-            List<MberSocialAccountVO> linkedAccounts = unifiedLoginService.getLinkedAccounts(currentUserId);
+            List<MberSocialAccountVO> linkedAccounts = unifiedLoginService.getLinkedAccounts(currentUserId, true);
 
             return resUtil.successRes(linkedAccounts, MessageCode.COMMON_SUCCESS);
         } catch (Exception e) {
@@ -94,6 +94,27 @@
     }
 
     /**
+     * 계정 재연동
+     */
+    @PostMapping("/reLinkAccount.json")
+    public ResponseEntity<?> reLinkAccount(@RequestBody HashMap<String, String> params) {
+        try {
+            String currentUserId = verificationService.getCurrentUserId();
+            String lgnOffrType = params.get("lgnOffrType");
+
+            boolean success = unifiedLoginService.reLinkAccount(currentUserId, lgnOffrType);
+
+            if (success) {
+                return resUtil.successRes("계정 연동이 활성화되었습니다.", MessageCode.COMMON_SUCCESS);
+            } else {
+                return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
+            }
+        } catch (Exception e) {
+            return resUtil.errorRes(MessageCode.COMMON_UNKNOWN_ERROR);
+        }
+    }
+
+    /**
      * 메인 프로필 설정
      */
     @PostMapping("/setPrimaryProfile.json")
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
@@ -420,12 +420,14 @@
     </select>
 
     <!-- 회원 ID로 소셜 계정 목록 조회 -->
-    <select id="findSocialAccountsByMbrId" parameterType="String" resultMap="socialAccountMap">
+    <select id="findSocialAccountsByMbrId" parameterType="map" resultMap="socialAccountMap">
         SELECT id, mbr_id, lgn_offr_type, sns_lgn_id, lgn_id, sns_eml, sns_nm,
                main_prfl_yn, link_vtlz_yn, link_dt, link_cncltn_dt, rgtr, reg_dt, mdfr, mdfcn_dt
         FROM mbr_sns_acnt_info
         WHERE mbr_id = #{mbrId}
-        AND link_vtlz_yn = true
+        <if test="searchAll != null and searchAll == false">
+            AND link_vtlz_yn = true
+        </if>
         ORDER BY main_prfl_yn DESC, link_dt ASC
     </select>
 
@@ -487,6 +489,18 @@
         </if>
     </update>
 
+    <!-- 소셜 계정 재연동 -->
+    <update id="reLinkSocialAccount" parameterType="map">
+        UPDATE mbr_sns_acnt_info
+        SET link_vtlz_yn = true,
+            mdfr = #{mdfr},
+            mdfcn_dt = NOW()
+        WHERE mbr_id = #{mbrId}
+        <if test="lgnOffrType != null and lgnOffrType != ''">
+            AND lgn_offr_type = #{lgnOffrType}
+        </if>
+    </update>
+
     <!-- 메인 프로필 설정 -->
     <update id="setPrimaryProfile" parameterType="map">
         UPDATE mbr_sns_acnt_info
Add a comment
List