박정하 박정하 01-07
250107 박정하 사용자 관리, 관리자 관리 수정
@6d5140ceb94db3317fa6d2e5fcc4d5bf8fb168ef
build.gradle
--- build.gradle
+++ build.gradle
@@ -17,7 +17,6 @@
 }
 
 dependencies {
-
 	// postgresql jdbc
 	implementation group: 'org.postgresql', name: 'postgresql', version: '42.6.0'
 	// 오라클 jdbc
@@ -89,7 +88,6 @@
 	implementation files('libs/httpcore-4.3.2.jar')
 	implementation files('libs/json-lib-2.4-jdk15.jar')
 
-
 	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
 
 	// 지원되지 않은 오라클 DB 문자 집합 문제 해결용
@@ -100,10 +98,6 @@
 	all {
 		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
 	}
-}
-
-tasks.named('test') {
-	useJUnitPlatform()
 }
 
 bootJar{
src/main/java/com/takensoft/taken_bi_manager/common/connection/ehojoPlus/util/OpenFisCal.java
--- src/main/java/com/takensoft/taken_bi_manager/common/connection/ehojoPlus/util/OpenFisCal.java
+++ src/main/java/com/takensoft/taken_bi_manager/common/connection/ehojoPlus/util/OpenFisCal.java
@@ -24,31 +24,52 @@
 
 public class OpenFisCal {
     public CustomeResultMap openFisCal(ConnectionEhojoVO connectionEhojoVO) throws Exception {
+        /**********************************************************************
+         * 필수 값 설정
+         *********************************************************************/
+        // apiKey 설정
+        String apiKey = connectionEhojoVO.getApiKey();
+        // 암복호화 key 설정
+        String encKey = connectionEhojoVO.getEncKey();
+        // 호출 url 설정
+        String url = connectionEhojoVO.getUrl() + connectionEhojoVO.getTaskCode() + "/openAPI/" + connectionEhojoVO.getTableName();
+        // 인터페이스 ID
+        String ifId = connectionEhojoVO.getIfId();
+        // 송신 기관 코드
+        String lafCode = connectionEhojoVO.getLafCode();
+        /**********************************************************************
+         * 필수 값 설정 끝
+         *********************************************************************/
+
         // HTTP Client
         HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
         HttpClient httpClient = httpClientBuilder.build();
         // HTTP Method
-        String url = connectionEhojoVO.getUrl() + connectionEhojoVO.getTaskCode() + "/openAPI/" + connectionEhojoVO.getTableName();
         HttpPost httpPost = new HttpPost(url);
         // HTTP Header
         // API 인증키 (외부기관에서 요청 시 필요)
-        httpPost.setHeader("API_KEY", connectionEhojoVO.getApiKey());
+        httpPost.setHeader("API_KEY", apiKey);
         httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
         // JSON 요청 메시지
         JSONObject jsonReq = new JSONObject();
-        // Header
+        // HEADER
         JSONObject header = new JSONObject();
-        // body
+        // BODY
         JSONObject body = new JSONObject();
 
         // Header 설정
+        // 필수값
+        header.put("ifId", ifId); // 1. 인터페이스 아이디
+        header.put("tranId", EncryptionUtils.makeTxId(ifId)); // 2. 트랜잭션 아이디
+        header.put("trnmtInstCd", lafCode); // 3. 요청기관코드: 연계데이터 요청 기관 코드 (각 지자체 코드)
+        header.put("rcptnInstCd", "MOI"); // 4. 응답기관코드: 연계데이터 제공 기관 코드 (고정 : MOI)
+        header.put("trnmtInstSysCd", "EHJ"); // 5. 요청시스템코드: 연계데이터 요청 시스템 코드 (고정 : EHJ)
+        header.put("rcptnInstSysCd", "EHJ"); // 6. 응답시스템코드: 연계데이터 제공 시스템 코드 (고정 : EHJ)
+        // 추가값
         for(EhojoPlusParamVO item : connectionEhojoVO.getHeaders()) {
-            if(item.getKey().equals("tranId")) {
-                header.put(item.getKey(), EncryptionUtils.makeTxId(connectionEhojoVO.getIfId())); // 트랜잭션 아이디
-            } else {
-                header.put(item.getKey(), item.getValue()); // 다른 값들은 원래 값 그대로 넣기
-            }
+            header.put(item.getKey(), item.getValue());
         }
+
 
         /**********************************************************************
          * 조회 조건 필수 값 설정(인터페이스 정의서 확인 필요)
@@ -58,55 +79,73 @@
             String key = item.getKey();
             body.put(key, item.getValue()); // 다른 값들은 원래 값 그대로 넣기
         }
-
         /**********************************************************************
-         * 인터페이스 정의서를 참고하여 추가로 필요한 항목 설정 추가
-         *
-         * 많은 경우 loop 처리하여 페이지 순차 호출
-         *
          * 조회 조건 필수 값 설정 끝
          *********************************************************************/
 
         // JSON 요청 메시지 설정
         jsonReq.put("header", header);
         // body 암호화 (외부기관에서 요청 시 필요)
-        jsonReq.put("body", EncryptionUtils.encryptStringAria(body.toString(), connectionEhojoVO.getEncKey()));
-        System.out.println("요청 전문" + jsonReq.toString());
+        jsonReq.put("body", EncryptionUtils.encryptStringAria(body.toString(), encKey));
 
         // Request → Response
         httpPost.setEntity(new StringEntity(jsonReq.toString(), "UTF-8"));
         HttpResponse httpResponse = httpClient.execute(httpPost);
         HttpEntity httpEntity = httpResponse.getEntity();
-
-        List<Map<String,Object>> dataList = new ArrayList<>();
+        // 응답 코드
+        int statusCode = httpResponse.getStatusLine().getStatusCode();
         CustomeResultMap customeResultMap = new CustomeResultMap();
 
         if (httpResponse != null) {
-            int statusCode = httpResponse.getStatusLine().getStatusCode();
-            switch (statusCode) {
-                case 200:
-                    try {
-                        // 응답 메시지
-                        String strRes = EntityUtils.toString(httpEntity, "UTF-8");
-                        // JSON Parsing
-                        JSONObject jsonRes = JSONObject.fromObject(strRes);
+            if (statusCode == 200) {
+                try {
+                    // 응답 메시지
+                    String strRes = EntityUtils.toString(httpEntity, "UTF-8");
+                    // JSON Parsing
+                    JSONObject jsonRes = JSONObject.fromObject(strRes);
+                    // 요청결과
+                    JSONObject resResult = (JSONObject)jsonRes.get("result");
+                    // body 복호화 (외부기관에서 요청 시 필요)
+                    JSONObject resBody = JSONObject.fromObject(EncryptionUtils.decryptStringAria(jsonRes.getString("body"), encKey));
+                    jsonRes.put("body", resBody);
 
-                        // 응답 코드 확인
-                        String responseCode = jsonRes.optString("code", "");
-                        String message = "";
-                        boolean isSuccess = false;
+                    String responseCode = (String) resResult.get("rsltCd");
+
+                    if (responseCode.equals("0000")) {
+                        int max = 0;
+                        int indx = 0;
+                        List<Map<String,Object>> dataList = (List<Map<String, Object>>) resBody.get("data");
+
+                        // 최대 길이의 키값을 가진 객체 구하기
+                        for(int i = 0 ; i < dataList.size() ; i++){
+                            if(dataList.get(i).keySet().size() > max) {
+                                max = dataList.get(i).keySet().size();
+                                indx = i;
+                            }
+                        }
+                        // 빈정보 공백으로 채우기
+                        for(Map<String, Object> item : dataList ) {
+                            if(max != item.size()) {
+                                for (Map.Entry<String, Object> entry : dataList.get(indx).entrySet()) {
+                                    if(item.get(entry.getKey()) == null) {
+                                        item.put(entry.getKey(),"");
+                                    }
+                                }
+                            }
+                        }
+
+                        DataTable dataTable = DataUtil.setMaptoDataTable(dataList);
+                        DataUtil.setColumnMetaData(dataTable, false);
+                        DataTypeUtil.convertDataTableColumMeta(dataTable);
+                        HashMap<String, Object> dataMap = new HashMap<>();
+                        dataMap.put("dataTable", dataTable); // 또는 적절한 키 이름 사용
+                        customeResultMap.setResultData(dataMap);
+
+                        customeResultMap.setCheckMessage(new CheckMessage(true, "정상", 0));
+                    } else {
+                        String message = "알 수 없는 응답 코드: " + responseCode;
 
                         switch (responseCode) {
-                            case "0000":
-                                message = "정상";
-                                isSuccess = true;
-                                // 정상 처리 시에만 body 복호화
-                                JSONObject resBody = JSONObject.fromObject(EncryptionUtils.decryptStringAria(
-                                        jsonRes.getString("body"),
-                                        connectionEhojoVO.getEncKey()));
-                                jsonRes.put("body", resBody);
-                                dataList.add(jsonRes);
-                                break;
                             case "N011": message = "네트워크 오류"; break;
                             case "D011": message = "DB 접속 오류"; break;
                             case "D012": message = "DB SQL 오류"; break;
@@ -129,76 +168,39 @@
                             case "6011": message = "응용프로그램 호출 실패"; break;
                             case "6012": message = "응용프로그램 타임 아웃"; break;
                             case "6021": message = "업무 반영 실패"; break;
-                            default: message = "알 수 없는 응답 코드: " + responseCode;
                         }
-
-                        CheckMessage checkMessage = new CheckMessage(isSuccess, message, responseCode);
-                        customeResultMap.setCheckMessage(checkMessage);
-
-                        // 로깅
-                        System.out.println("요청 결과 :: " + jsonRes.toString());
-                        System.out.println("응답 코드 :: " + responseCode + ", 메시지 :: " + message);
-
-                    } catch (Exception e) {
-                        System.err.println("응답 처리 중 오류 발생: " + e.getMessage());
-                        CheckMessage errorMessage = new CheckMessage(false, "응답 처리 중 오류 발생", "5004");
-                        customeResultMap.setCheckMessage(errorMessage);
+                        customeResultMap.setCheckMessage(new CheckMessage(false, message, responseCode));
                     }
-                    break;
-
-                case 400:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "잘못된 요청", "4002"));
-                    break;
-                case 401:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "인증 실패", "4011"));
-                    break;
-                case 403:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "접근 권한 없음", "4012"));
-                    break;
-                case 404:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "리소스를 찾을 수 없음", "4041"));
-                    break;
-                case 500:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "서버 내부 오류", "5001"));
-                    break;
-                case 503:
-                    customeResultMap.setCheckMessage(new CheckMessage(false, "서비스 일시적 사용 불가", "5002"));
-                    break;
-                default:
-                    customeResultMap.setCheckMessage(new CheckMessage(false,
-                            "예상치 못한 HTTP 상태 코드: " + statusCode, "5004"));
+                } catch (Exception e) {
+                    customeResultMap.setCheckMessage(new CheckMessage(false, "응답 처리 중 오류 발생", "5004"));
+                }
+            } else {
+                switch (statusCode) {
+                    case 400:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "잘못된 요청", "4002"));
+                        break;
+                    case 401:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "인증 실패", "4011"));
+                        break;
+                    case 403:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "접근 권한 없음", "4012"));
+                        break;
+                    case 404:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "리소스를 찾을 수 없음", "4041"));
+                        break;
+                    case 500:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "서버 내부 오류", "5001"));
+                        break;
+                    case 503:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "서비스 일시적 사용 불가", "5002"));
+                        break;
+                    default:
+                        customeResultMap.setCheckMessage(new CheckMessage(false, "예상치 못한 HTTP 상태 코드: " + statusCode, "5004"));
+                }
             }
         } else {
             customeResultMap.setCheckMessage(new CheckMessage(false, "HTTP 응답이 null입니다", "5004"));
         }
-
-        int max = 0;
-        int indx = 0;
-
-        // 최대 길이의 키값을 가진 객체 구하기
-        for(int i = 0 ; i < dataList.size() ; i++){
-            if(dataList.get(i).keySet().size() > max) {
-                max = dataList.get(i).keySet().size();
-                indx = i;
-            }
-        }
-        // 빈정보 공백으로 채우기
-        for(Map<String, Object> item : dataList ) {
-            if(max != item.size()) {
-                for (Map.Entry<String, Object> entry : dataList.get(indx).entrySet())
-                {
-                    if(item.get(entry.getKey()) == null) {
-                        item.put(entry.getKey(),"");
-                    }
-                }
-            }
-        }
-        DataTable dataTable = DataUtil.setMaptoDataTable(dataList);
-        DataUtil.setColumnMetaData(dataTable, false);
-        DataTypeUtil.convertDataTableColumMeta(dataTable);
-        HashMap<String, Object> dataMap = new HashMap<>();
-        dataMap.put("dataTable", dataTable); // 또는 적절한 키 이름 사용
-        customeResultMap.setResultData(dataMap);
         return customeResultMap;
     }
-}
+}
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/taken_bi_manager/department/service/Impl/DepartmentServiceImpl.java
--- src/main/java/com/takensoft/taken_bi_manager/department/service/Impl/DepartmentServiceImpl.java
+++ src/main/java/com/takensoft/taken_bi_manager/department/service/Impl/DepartmentServiceImpl.java
@@ -47,8 +47,6 @@
         }
     }
 
-    /************************************************부서 등록 시작*******************************************************/
-
     /**
      * @author 이세현
      * @since 2024.03.21
@@ -120,10 +118,6 @@
             throw new RuntimeException("부서 권한 등록에 실패하였습니다.");
         }
     }
-
-    /************************************************부서 등록 종료*******************************************************/
-
-    /************************************************부서 조회 시작*******************************************************/
 
     /**
      * @author 박민혁
@@ -217,86 +211,6 @@
 
         return resultMap;
     }
-
-    /************************************************부서 조회 종료*******************************************************/
-
-//    /**
-//     * @author 박하
-//     * @since 2024.02.21
-//     *
-//     * 부서 데이터 수정
-//     */
-//    @Transactional
-//    public CustomeResultMap updateDepartment(DepartmentVO departmentVO) throws Exception {
-//
-//        CustomeResultMap resultMap = new CustomeResultMap();
-//
-//        departmentVO.setUpdt_id(AuthUtil.getLoginUserId());
-//
-//        Integer upperDeptDp = departmentDAO.getDeptDpByOrgCode(departmentVO.getUpper_dept());
-//
-//        if (upperDeptDp == null) {
-//
-//            departmentVO.setDept_dp(1);
-//        }else{
-//            departmentVO.setDept_dp(upperDeptDp + 1);
-//        }
-//
-//        String upperAddr = departmentDAO.getDeptAddrByOrgCode(departmentVO.getUpper_dept());
-//
-//        if (upperAddr == null) {
-//            departmentVO.setDept_addr(departmentVO.getDept_nm());
-//        } else {
-//            departmentVO.setDept_addr(upperAddr + "/" + departmentVO.getDept_nm());
-//        }
-//
-//
-//        upperupdateChildDepartments(departmentVO.getDept_code(), departmentVO.getDept_dp(), departmentVO.getDept_addr());
-//
-//        int result = departmentDAO.updateDepartment(departmentVO);
-//        resultMap.getResultData().put("updateDepartment", result );
-//
-//        if(result > 0) {
-//            OrgnztAuthorVO orgnztAuthorVO = new OrgnztAuthorVO();
-//            orgnztAuthorVO.setDept_code(departmentVO.getDept_code());
-//            orgnztAuthorVO.setAuthor(departmentVO.getAuthor());
-//            departmentDAO.updateOrgnztAuthor(orgnztAuthorVO);
-//        }else {
-//            throw new Exception("Department update insertion failed.");
-//        }
-//
-//        return resultMap;
-//    }
-//
-//    /**
-//     * @author 박하
-//     * @since 2024.02.21
-//     *
-//     * 부서 데이터 수정 - 자식부터 업데이트
-//     */
-//    private void upperupdateChildDepartments(String dept_code, int selectedDeptDp, String selectedDeptNm) throws Exception {
-//
-//
-//        List<DepartmentVO> childDepartmentList = departmentDAO.getDepartmentsByUpperDept(dept_code);
-//
-//
-//        for (DepartmentVO childDepartment : childDepartmentList) {
-//
-//            String NewAddr = selectedDeptNm +"/"+childDepartment.getDept_nm();
-//
-//            childDepartment.setDept_addr(NewAddr);
-//
-//            childDepartment.setDept_dp(selectedDeptDp+1);
-//
-//            departmentDAO.updateChildAddr(childDepartment);
-//
-//            // 재귀적으로 자식 부서를 업데이트
-//            upperupdateChildDepartments(childDepartment.getDept_code(), childDepartment.getDept_dp(), NewAddr);
-//
-//        }
-//    }
-
-    /************************************************부서 수정 시작*******************************************************/
 
     /**
      * @author 이세현
@@ -407,54 +321,6 @@
         }
     }
 
-    /************************************************부서 수정 종료*******************************************************/
-
-
-
-//    /**
-//     * @author 박하
-//     * @since 2024.02.28
-//     *
-//     * 부서 데이터 삭제
-//     */
-//    public CustomeResultMap deleteDepartment(DepartmentVO departmentVO) throws Exception {
-//        CustomeResultMap resultMap = new CustomeResultMap();
-//
-//        departmentVO.setUse_at(false);
-//
-//        upperdeleteChildDepartments(departmentVO.getDept_code());
-//
-//        resultMap.getResultData().put("deleteDepartment",departmentDAO.deleteDepartment(departmentVO));
-//
-//        return resultMap;
-//    }
-//
-//    /**
-//     * @author 박하
-//     * @since 2024.02.28
-//     *
-//     * 부서 데이터 삭제 - 자식부터 업데이트
-//     */
-//    private void upperdeleteChildDepartments(String dept_code) throws Exception {
-//
-//
-//        List<DepartmentVO> childDepartmentList = departmentDAO.getDepartmentsByUpperDept(dept_code);
-//
-//
-//        for (DepartmentVO childDepartment : childDepartmentList) {
-//
-//            childDepartment.setUse_at(false);
-//
-//            departmentDAO.deleteDepartment(childDepartment);
-//
-//            // 재귀적으로 자식 부서를 업데이트
-//            upperdeleteChildDepartments(childDepartment.getDept_code());
-//
-//        }
-//    }
-
-    /************************************************부서 삭제 시작*******************************************************/
-
     /**
      * @author 이세현
      * @since 2024.03.25
@@ -513,5 +379,21 @@
         if(deptMemberCount != result) throw new RuntimeException("해당 부서 사용자 삭제에 오류가 발생하였습니다.");
     }
 
-    /************************************************부서 삭제 종료*******************************************************/
-}
+    /**
+     * @author 박정하
+     * @since 2025.01.07
+     *
+     * 부서 상세 조회
+     */
+    public CustomeResultMap selectDept(String deptCode) throws Exception {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("selectDept", departmentDAO.selectDept(deptCode)); // 부서 상세 조회
+        result.put("selectDeptUserList", departmentDAO.selectDept(deptCode)); // 부서 사용자 목록 조회
+        result.put("selectDeptHostList", departmentDAO.selectDept(deptCode)); // 부서 호스트 목록 조회
+        result.put("selectDeptDirectoryList", departmentDAO.selectDept(deptCode)); // 부서 디렉토리 목록 조회
+
+        CustomeResultMap resultMap = new CustomeResultMap();
+        resultMap.setResultData(result);
+        return resultMap;
+    }
+}
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/taken_bi_manager/user/member/dao/MemberDAO.java
--- src/main/java/com/takensoft/taken_bi_manager/user/member/dao/MemberDAO.java
+++ src/main/java/com/takensoft/taken_bi_manager/user/member/dao/MemberDAO.java
@@ -1,5 +1,6 @@
 package com.takensoft.taken_bi_manager.user.member.dao;
 
+import com.takensoft.taken_bi_manager.common.vo.CustomeResultMap;
 import com.takensoft.taken_bi_manager.common.vo.SearchVO;
 import com.takensoft.taken_bi_manager.user.member.vo.AuthorVO;
 import com.takensoft.taken_bi_manager.user.member.vo.UserAuthorVO;
@@ -67,7 +68,15 @@
 	 *
 	 * 사용자 목록 조회
 	 */
-	List<Member> selectMembers(SearchVO searchVO) throws Exception;
+	List<Member> selectMemberListByAdmin(SearchVO searchVO) throws Exception;
+
+	/**
+	 * @author 박하
+	 * @since 2024.02.01
+	 *
+	 * 사용자 목록 조회
+	 */
+	List<Member> selectMemberListByUser(SearchVO searchVO) throws Exception;
 
 	/**
 	 * @author 박하
@@ -75,7 +84,15 @@
 	 *
 	 * 사용자 목록 COUNT 조회
 	 */
-	int selectMembersCount(SearchVO searchVO) throws Exception;
+	int selectMemberListByAdminCount(SearchVO searchVO) throws Exception;
+
+	/**
+	 * @author 박하
+	 * @since 2024.02.01
+	 *
+	 * 사용자 목록 COUNT 조회
+	 */
+	int selectMemberListByUserCount(SearchVO searchVO) throws Exception;
 
 	/**
 	 * @author 하관우
@@ -244,4 +261,12 @@
 	 * UserAuthor 권한 개수 조회
 	 */
 	int getUserAuthorCount(Member member) throws Exception;
+
+	/**
+	 * @author 박정하
+	 * @since 2025.01.07
+	 *
+	 * 사용자 잠금 해제
+	 */
+	int updateUserLockAt(String userId);
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/taken_bi_manager/user/member/servie/MemberService.java
--- src/main/java/com/takensoft/taken_bi_manager/user/member/servie/MemberService.java
+++ src/main/java/com/takensoft/taken_bi_manager/user/member/servie/MemberService.java
@@ -5,11 +5,25 @@
 import com.takensoft.taken_bi_manager.common.vo.CustomeResultMap;
 import com.takensoft.taken_bi_manager.common.vo.SearchVO;
 import com.takensoft.taken_bi_manager.user.member.vo.Member;
-import org.bouncycastle.pqc.crypto.ExchangePair;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
 
 public interface MemberService {
+	/**
+	 * @author 김성원
+	 * @since 2024.01.09
+	 *
+	 * 사용자 목록 조회
+	 */
+	CustomeResultMap getMemberList(SearchVO searchVO, String type) throws Exception;
+
+	/**
+	 * @author 박하
+	 * @since 2024.02.14
+	 *
+	 * 회원 선택 삭제
+	 */
+	CustomeResultMap deleteMember(List<Member> deleteList) throws Exception;
+
+
 	/**
 	 * @author 김성원
 	 * @since 2024.01.09
@@ -67,22 +81,6 @@
 	CustomeResultMap updateMemberPw(Member member) throws Exception;
 
 	/**
-	 * @author 박하
-	 * @since 2024.02.14
-	 *
-	 * 회원 선택 삭제
-	 */
-	CustomeResultMap deleteMember(List<String> userid) throws Exception;
-
-	/**
-	 * @author 김성원
-	 * @since 2024.01.09
-	 *
-	 * 사용자 목록 조회
-	 */
-	CustomeResultMap getMemberList(SearchVO searchVO, String type) throws Exception;
-
-	/**
 	 * @author 하관우
 	 * @since 2024.08.09
 	 *
@@ -137,4 +135,12 @@
 	 * 비밀번호 찾기
 	 */
 	Member findUserPwd(Member member) throws Exception;
-}
+
+	/**
+	 * @author 박정하
+	 * @since 2025.01.07
+	 *
+	 * 사용자 잠금 해제
+	 */
+	CustomeResultMap updateUserLockAt(String userId);
+}
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/taken_bi_manager/user/member/servie/impl/MemberServiceImpl.java
--- src/main/java/com/takensoft/taken_bi_manager/user/member/servie/impl/MemberServiceImpl.java
+++ src/main/java/com/takensoft/taken_bi_manager/user/member/servie/impl/MemberServiceImpl.java
@@ -27,7 +27,6 @@
 @Service
 @RequiredArgsConstructor
 public class MemberServiceImpl implements MemberService {
-
 	private final MemberDAO memberDAO;
 
 	static class HistoryTypes {
@@ -44,8 +43,13 @@
 	 */
 	@Override
 	public Member getMemnberById(String userId) throws Exception {
-		Member member =  memberDAO.getMemnberById(userId);
-		member.dataDecoder();
+		Member member = new Member();
+
+		if (userId != null) {
+			member =  memberDAO.getMemnberById(userId);
+			member.dataDecoder();
+		}
+
 		return member;
 	}
 
@@ -62,15 +66,21 @@
 		member.setCreatId(AuthUtil.getLoginUserId());
 		member.PasswordEncoder();
 		member.dataEncoder();
+
 		//사용자 등록
 		int result = insertMemberData(member);
+
 		//사용자 권한 등록
 		insertUserAuthor(member);
+
 		//사용자 부서 등록
 		insertUserDepartment(member);
+
 		//사용자 히스토리 등록
 		insertHistory(INSERT,member);
+
 		resultMap.getResultData().put("insertMember",result);
+
 		return resultMap;
 	}
 
@@ -108,23 +118,23 @@
 	@Override
 	public CustomeResultMap getMemberList(SearchVO searchVO, String type) throws Exception {
 		CustomeResultMap resultMap = new CustomeResultMap();
-		List<Member> members = null;
-		int count = 0;
-		if("dept".equals(type)){
-			//소속된 부서가 없는 사용자 목록,COUNT 조회
-			members = memberDAO.selectNoDeptUserList(searchVO);
-			count = memberDAO.selectNoDeptUserCount(searchVO);
-		} else {
-			//일반 사용자 목록,COUNT 조회
-			members = memberDAO.selectMembers(searchVO);
-			count = memberDAO.selectMembersCount(searchVO);
+		List<Member> members;
+
+		if (type != null && type.equals("ROLE_ADMIN")) { // 관리자 목록 조회
+			members = memberDAO.selectMemberListByAdmin(searchVO);
+			searchVO.setTotalRows(memberDAO.selectMemberListByAdminCount(searchVO));
+		} else { // 관리자 외 목록 조회
+			members = memberDAO.selectMemberListByUser(searchVO);
+			searchVO.setTotalRows(memberDAO.selectMemberListByUserCount(searchVO));
 		}
+		
+		// 사용자 정보 복호화
 		for (Member member : members) {
 			member.dataDecoder();
 		}
 
-		resultMap.getResultData().put("selectMemberList", members);
-		resultMap.getResultData().put("totalRow", count);
+		resultMap.getResultData().put("members", members);
+		resultMap.getResultData().put("searchVO", searchVO);
 		return resultMap;
 	}
 	/**
@@ -339,40 +349,50 @@
 	 */
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public CustomeResultMap deleteMember(List<String> userid) throws Exception {
-		//dataAccessException, NullPointerException
+	public CustomeResultMap deleteMember(List<Member> deleteList) throws Exception {
 		CustomeResultMap resultMap = new CustomeResultMap();
-		int deleteMemberCount = 0;
-		int insertHistoryCount = 0;
-		int deleteUserAuthCount = 0;
-		int existingOrgnztMemberCount  = 0;
-		int deleteOrgnztMemberCount = 0;
-		for (String userId : userid) {
-			//사용자 삭제
-			deleteMemberCount += memberDAO.deleteMember(userId);
-			//사용자가 속속된 조직이 있는지 확인
-			existingOrgnztMemberCount  += memberDAO.haveOrgnztUserCount(userId);
-			//사용자 조직 연계 테이블 삭제
-			deleteOrgnztMemberCount += memberDAO.deleteOrgnztMember(userId);
-			//사용자 권한 연계 테이블 삭제
-			deleteUserAuthCount += memberDAO.deleteUserAuthor(userId);
-			//사용자 히스토리 등록
-			Member memberById = memberDAO.getMemnberById(userId);
-			insertHistoryCount += insertHistory(DELETE,memberById);
+
+		//dataAccessException, NullPointerException
+		try {
+			int deleteMemberCount = 0;
+			int insertHistoryCount = 0;
+			int deleteUserAuthCount = 0;
+			int existingOrgnztMemberCount  = 0;
+			int deleteOrgnztMemberCount = 0;
+			for (Member member : deleteList) {
+				String userId = member.getUserId();
+
+				//사용자 삭제
+				deleteMemberCount += memberDAO.deleteMember(userId);
+				//사용자가 소속된 조직이 있는지 확인
+				existingOrgnztMemberCount  += memberDAO.haveOrgnztUserCount(userId);
+				//사용자 조직 연계 테이블 삭제
+				deleteOrgnztMemberCount += memberDAO.deleteOrgnztMember(userId);
+				//사용자 권한 연계 테이블 삭제
+				deleteUserAuthCount += memberDAO.deleteUserAuthor(userId);
+				//사용자 히스토리 등록
+				Member memberById = memberDAO.getMemnberById(userId);
+
+				insertHistoryCount += insertHistory(DELETE,memberById);
+			}
+
+			//모든 사용자가 성공적으로 삭제되었는지 확인
+			if(deleteMemberCount != deleteList.size()
+					|| deleteMemberCount != insertHistoryCount
+					|| deleteMemberCount != deleteUserAuthCount
+					|| existingOrgnztMemberCount != deleteOrgnztMemberCount) throw new RuntimeException("사용자 선택 삭제 오류 발생");
+			resultMap.getResultData().put("deleteMember", deleteMemberCount);
+		} catch(RuntimeException e) {
+			resultMap.getCheckMessage().setError("선택한 사용자 삭제에 실패하였습니다. 다시 시도해주세요.",HttpStatus.BAD_REQUEST.value());
+		} catch(Exception e) {
+			resultMap.getCheckMessage().setError("삭제오류, 관리자에게 문의바랍니다." ,HttpStatus.INTERNAL_SERVER_ERROR.value());
 		}
 
-		//모든 사용자가 성공적으로 삭제되었는지 확인
-		if(deleteMemberCount != userid.size()
-				|| deleteMemberCount != insertHistoryCount
-				|| deleteMemberCount != deleteUserAuthCount
-				|| existingOrgnztMemberCount != deleteOrgnztMemberCount) throw new RuntimeException("사용자 선택 삭제 오류 발생");
-
-		resultMap.getResultData().put("deleteMember",deleteMemberCount);
 		return resultMap;
 	}
 
 	//사용자 히스토리 등록
-	private int insertHistory(String historyType,Member member) throws Exception {
+	private int insertHistory(String historyType, Member member) throws Exception {
 		member.dataDecoder();
 		member.setHistoryType(historyType);
 		int result = 0;
@@ -472,4 +492,27 @@
 		findUser.dataDecoder();
 		return findUser;
 	}
+
+	/**
+	 * @author 박정하
+	 * @since 2025.01.07
+	 *
+	 * 사용자 잠금 해제
+	 */
+	@Override
+	public CustomeResultMap updateUserLockAt(String userId) {
+		CustomeResultMap resultMap = new CustomeResultMap();
+
+		try {
+			memberDAO.updateUserLockAt(userId);
+			resultMap.getResultData().put("result", true);
+		} catch (Exception e) {
+			resultMap.getResultData().put("result", false);
+			String errorMessage = e instanceof RuntimeException ? e.getMessage() : "사용자 부서 등록 오류, 관리자에게 문의 바랍니다.";
+			int status = e instanceof RuntimeException ? HttpStatus.BAD_REQUEST.value() : HttpStatus.INTERNAL_SERVER_ERROR.value();
+			resultMap.getCheckMessage().setError(errorMessage, status);
+		}
+
+		return resultMap;
+	}
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/java/com/takensoft/taken_bi_manager/user/member/vo/Member.java
--- src/main/java/com/takensoft/taken_bi_manager/user/member/vo/Member.java
+++ src/main/java/com/takensoft/taken_bi_manager/user/member/vo/Member.java
@@ -1,12 +1,12 @@
 package com.takensoft.taken_bi_manager.user.member.vo;
 
-import java.sql.Date;
-import java.sql.Timestamp;
-import java.util.List;
-
 import com.takensoft.taken_bi_manager.common.util.CryptoUtil;
 
 import lombok.Data;
+
+import java.sql.Date;
+import java.sql.Timestamp;
+import java.util.List;
 
 /**
  * @author 박하
@@ -16,7 +16,6 @@
  */
 @Data
 public class Member {
-
 	// 사용자 ID
 	private String userId;
 
@@ -81,15 +80,13 @@
 	private List<String> authList;
 
 	// 권한
-	private  String author;
+	private String author;
 
 	// 부서코드
-	private  String dept_code;
+	private String dept_code;
 
 	// 히스토리 타입
 	private String historyType;
-
-
 
 
 	/**
@@ -129,5 +126,4 @@
 		this.adres = CryptoUtil.decryptData(this.adres);
 		this.adresDetail = CryptoUtil.decryptData(this.adresDetail);
 	}
-
 }
(파일 끝에 줄바꿈 문자 없음)
 
src/main/java/com/takensoft/taken_bi_manager/user/member/vo/MemberHistory.java (deleted)
--- src/main/java/com/takensoft/taken_bi_manager/user/member/vo/MemberHistory.java
@@ -1,40 +0,0 @@
-package com.takensoft.taken_bi_manager.user.member.vo;
-
-import java.sql.Date;
-import java.sql.Timestamp;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author 김성원
- * @since 2023-12-28
- *
- * 회원정보 객체 
- */
-@Getter
-@Setter
-public class MemberHistory {
-
-	// 사용자 ID
-	private String userId;
-
-	// 사용자 이름
-	private String userNm;
-
-	// 사용자 이메일
-	private String userEmail;
-
-	// 사용자 전화번호
-	private String userTel;
-
-	// 사용자 휴대폰 번호
-	private String userPhone;
-
-	// 생성일
-	private Timestamp creatDt;
-
-	// 부서명
-	private String deptCode;
-
-}
src/main/java/com/takensoft/taken_bi_manager/user/member/web/MemberController.java
--- src/main/java/com/takensoft/taken_bi_manager/user/member/web/MemberController.java
+++ src/main/java/com/takensoft/taken_bi_manager/user/member/web/MemberController.java
@@ -8,8 +8,7 @@
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 @RestController
 @RequiredArgsConstructor
@@ -19,20 +18,26 @@
 
     /**
      * @author 이세현
+     * @since 2024.03.21
+     *
+     * 사용자 목록 조회
+     * 특정 타입이 있다면 타입에 해당하는 목록 조회
+     */
+    @PostMapping(value = {"/list", "/list/{type}" })
+    public CustomeResultMap selectMemberList(@RequestBody SearchVO searchVO, @PathVariable(required = false) String type) throws Exception {
+        CustomeResultMap map = memberService.getMemberList(searchVO,type);
+        return map;
+    }
+
+    /**
+     * @author 이세현
      * @since 2024.03.19
      *
-     * 사용자 등록
+     * 사용자 삭제
      */
-    @PostMapping
-    public CustomeResultMap insertMember(@RequestBody Member member) {
-        CustomeResultMap map = new CustomeResultMap();
-        try {
-            map = memberService.insertMember(member);
-        } catch(RuntimeException e) {
-            map.getCheckMessage().setError(e.getMessage(),HttpStatus.BAD_REQUEST.value());
-        } catch(Exception e){
-            map.getCheckMessage().setError("사용자등록 오류, 관리자에게 문의바랍니다.",HttpStatus.INTERNAL_SERVER_ERROR.value());
-        }
+    @DeleteMapping
+    public CustomeResultMap deleteMember(@RequestBody List<Member> deleteList) throws Exception {
+        CustomeResultMap map = memberService.deleteMember(deleteList);
         return map;
     }
 
@@ -63,16 +68,23 @@
 
     /**
      * @author 이세현
-     * @since 2024.03.21
+     * @since 2024.03.19
      *
-     * 사용자 목록 조회
-     * 특정 타입이 있다면 타입에 해당하는 목록 조회
+     * 사용자 등록
      */
-    @PostMapping(value = {"/list/{type}", "/list"})
-    public CustomeResultMap selectMemberList(@RequestBody SearchVO searchVO, @PathVariable(required = false) String type) throws Exception {
-        CustomeResultMap map = memberService.getMemberList(searchVO,type);
+    @PostMapping
+    public CustomeResultMap insertMember(@RequestBody Member member) {
+        CustomeResultMap map = new CustomeResultMap();
+        try {
+            map = memberService.insertMember(member);
+        } catch(RuntimeException e) {
+            map.getCheckMessage().setError(e.getMessage(),HttpStatus.BAD_REQUEST.value());
+        } catch(Exception e){
+            map.getCheckMessage().setError("사용자등록 오류, 관리자에게 문의바랍니다.",HttpStatus.INTERNAL_SERVER_ERROR.value());
+        }
         return map;
     }
+
     /**
      * @author 하관우
      * @since 2024.08.09
@@ -155,24 +167,6 @@
     }
 
 
-    /**
-     * @author 이세현
-     * @since 2024.03.19
-     *
-     * 사용자 삭제
-     */
-    @DeleteMapping
-    public CustomeResultMap deleteMember(@RequestBody List<String> deleteList) {
-        CustomeResultMap map = new CustomeResultMap();
-        try {
-            map = memberService.deleteMember(deleteList);
-        } catch(RuntimeException e) {
-            map.getCheckMessage().setError("선택한 사용자 삭제에 실패하였습니다. 다시 시도해주세요.",HttpStatus.BAD_REQUEST.value());
-        } catch(Exception e) {
-            map.getCheckMessage().setError("삭제오류, 관리자에게 문의바랍니다." ,HttpStatus.INTERNAL_SERVER_ERROR.value());
-        }
-        return map;
-    }
 
     /**
      * @author 이세현
@@ -221,4 +215,28 @@
         Member findUser = memberService.findUserPwd(member);
         return findUser.getUserPassword();
     }
+
+
+    /**
+     * @author 박정하
+     * @since 2025.01.03
+     *
+     * 사용자 개별 조회
+     * 특정 타입이 있다면 타입에 해당하는 목록 조회
+     */
+    @PostMapping(value = {"/selectUser", "/selectUser/{userId}"})
+    public Member selectUser(@PathVariable(required = false) String userId) throws Exception {
+        return memberService.getMemnberById(userId);
+    }
+
+    /**
+     * @author 박정하
+     * @since 2025.01.07
+     *
+     * 사용자 잠금 해제
+     */
+    @PostMapping(value = {"/updateUser/LockAt/{userId}"})
+    public CustomeResultMap updateUserLockAt(@PathVariable(required = false) String userId) {
+        return memberService.updateUserLockAt(userId);
+    }
 }
(파일 끝에 줄바꿈 문자 없음)
src/main/resources/application.properties
--- src/main/resources/application.properties
+++ src/main/resources/application.properties
@@ -7,7 +7,7 @@
 spring.sql.init.platform=postgres
 
 # takensoft
-spring.datasource.url=jdbc:log4jdbc:postgresql://210.180.118.83:5432/bi_manager?currentSchema=bi_manager
+spring.datasource.url=jdbc:log4jdbc:postgresql://210.180.118.83:5432/bi_maneger_renewal?currentSchema=bi_manager
 spring.datasource.username=takensoft
 spring.datasource.password=tts96314728!@
 
src/main/resources/spring/mapper/department/department-SQL.xml
--- src/main/resources/spring/mapper/department/department-SQL.xml
+++ src/main/resources/spring/mapper/department/department-SQL.xml
@@ -130,7 +130,18 @@
     <!-- 부서 목록 조회 -->
     <select id="selectDeptList" parameterType="SearchVO" resultType="DepartmentVO">
         SELECT dept_code
+             , upper_dept
+             , org_code
              , dept_nm
+             , dept_dp
+             , dept_ordr
+             , use_at
+             , creat_dt
+             , updt_id
+             , creat_id
+             , updt_id
+             , dept_dc
+             , dept_addr
           FROM orgnzt_info
          WHERE use_at = true
         <foreach item="item" index="index" collection="searchObjectList">
@@ -157,7 +168,10 @@
                 </when>
             </choose>
         </foreach>
-      ORDER BY dept_code ,dept_ordr, dept_dp ASC
+        ORDER BY dept_ordr, dept_dp, dept_nm ASC
+        <if test="perPage != 0 and currentPage != 0">
+            LIMIT #{perPage} OFFSET ((#{currentPage} - 1) * #{perPage})
+        </if>
     </select>
 
     <!-- orgnzt_author에 데이터 삽입 -->
@@ -278,7 +292,22 @@
               WHERE dept_code = #{dept_code}
     </delete>
 
-
-
-
+    <!-- 부서 상세 조회 -->
+    <select id="selectDept" parameterType="String" resultType="DepartmentVO">
+        SELECT dept_code
+             , upper_dept
+             , org_code
+             , dept_nm
+             , dept_dp
+             , dept_ordr
+             , use_at
+             , creat_dt
+             , updt_dt
+             , creat_id
+             , updt_id
+             , dept_dc
+             , dept_addr
+        FROM orgnzt_info
+        WHERE dept_code = {deptCode}
+    </select>
 </mapper>
(파일 끝에 줄바꿈 문자 없음)
src/main/resources/spring/mapper/user/member-SQL.xml
--- src/main/resources/spring/mapper/user/member-SQL.xml
+++ src/main/resources/spring/mapper/user/member-SQL.xml
@@ -123,8 +123,8 @@
 		 WHERE user_email = #{userEmail}
 	</select>
 
-	<!-- 사용자 목록 조회 -->
-	<select id="selectMembers" parameterType="SearchVO" resultMap="memberResult">
+	<!-- SELECT SQL -->
+	<sql id="selectMember">
 		SELECT ui.user_id
 			 , ui.user_password
 			 , ui.user_nm
@@ -144,55 +144,99 @@
 			 , ui.lock_at
 			 , ui.lock_dt
 			 , ui.use_at
-			 , orgnzt_info.dept_nm
-			 , orgnzt_info.dept_code
-			 , author_info.author
-		  FROM user_info AS ui
-	 LEFT JOIN orgnzt_member
-			ON ui.user_id = orgnzt_member.user_id
-	 LEFT JOIN orgnzt_info
-			ON orgnzt_member.dept_code = orgnzt_info.dept_code
-	 LEFT JOIN user_author
-			ON ui.user_id = user_author.user_id
-	 LEFT JOIN author_info
-			ON user_author.author = author_info.author
-		 WHERE ui.use_at = true
+			 , oi.dept_nm
+			 , oi.dept_code
+	</sql>
+
+	<!-- 사용자 목록 조회 -->
+	<select id="selectMemberListByAdmin" parameterType="SearchVO" resultMap="memberResult">
+		<include refid="selectMember" />
+		FROM (
+			SELECT user_id
+			FROM user_author
+			WHERE author = 'ROLE_ADMIN'
+		) AS list
+		LEFT JOIN user_info AS ui
+			   ON list.user_id = ui.user_id
+		LEFT JOIN orgnzt_member AS om
+			   ON list.user_id = om.user_id
+		LEFT JOIN orgnzt_info AS oi
+			   ON om.dept_code = oi.dept_code
+			WHERE ui.use_at = true
 		<foreach item="item" index="index" collection="searchObjectList">
-			<choose>
-				<when test="item.type != null and item.type !='' and  item.value != null and item.value !='' and item.type == ''">
-					AND ${item.key} = #{item.value}
-				</when>
-				<when test="item.type != null and item.type !='' and  item.value != null and item.value !=''">
-					AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
-				</when>
-			</choose>
+			<if test="item.type != null and item.type !='' and item.key != null and item.key != '' and item.value != null and item.value != ''">
+				AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
+			</if>
 		</foreach>
-		ORDER BY ui.creat_dt DESC
-		<!-- 검색영역 끝 -->
+		 ORDER BY ui.creat_dt DESC
 		LIMIT #{perPage} OFFSET ((#{currentPage} - 1) * #{perPage})
 	</select>
 
 	<!-- 사용자 목록 COUNT 조회 -->
-	<select id="selectMembersCount" parameterType="SearchVO" resultType="int">
+	<select id="selectMemberListByAdminCount" parameterType="SearchVO" resultType="int">
 		SELECT COUNT(*)
-		  FROM user_info ui
-	 LEFT JOIN orgnzt_member ON ui.user_id = orgnzt_member.user_id
-	 LEFT JOIN orgnzt_info ON orgnzt_member.dept_code = orgnzt_info.dept_code
-	 LEFT JOIN user_author ON ui.user_id = user_author.user_id
-	 LEFT JOIN author_info ON user_author.author = author_info.author
-		 WHERE ui.use_at = true
+		FROM (
+			SELECT user_id
+			FROM user_author
+			WHERE author = 'ROLE_ADMIN'
+		) AS list
+		LEFT JOIN user_info AS ui
+		ON list.user_id = ui.user_id
+		LEFT JOIN orgnzt_member AS om
+		ON list.user_id = om.user_id
+		LEFT JOIN orgnzt_info AS oi
+		ON om.dept_code = oi.dept_code
+		WHERE ui.use_at = true
 		<foreach item="item" index="index" collection="searchObjectList">
-			<choose>
-				<when test="item.type != null and item.type !='' and  item.value != null and item.value !='' and item.type == ''">
-					AND ${item.key} = #{item.value}
-				</when>
-
-				<when test="item.type != null and item.type !='' and  item.value != null and item.value !=''">
-					AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
-				</when>
-			</choose>
+			<if test="item.type != null and item.type !='' and item.key != null and item.key != '' and item.value != null and item.value != ''">
+				AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
+			</if>
 		</foreach>
-		<!-- 검색영역 끝 -->
+	</select>
+
+	<select id="selectMemberListByUser" parameterType="SearchVO" resultMap="memberResult">
+		<include refid="selectMember" />
+		FROM (
+			SELECT user_id
+			FROM user_author
+			WHERE author != 'ROLE_ADMIN'
+		) AS list
+		LEFT JOIN user_info AS ui
+		ON list.user_id = ui.user_id
+		LEFT JOIN orgnzt_member AS om
+		ON list.user_id = om.user_id
+		LEFT JOIN orgnzt_info AS oi
+		ON om.dept_code = oi.dept_code
+		WHERE ui.use_at = true
+		<foreach item="item" index="index" collection="searchObjectList">
+			<if test="item.type != null and item.type !='' and item.key != null and item.key != '' and item.value != null and item.value != ''">
+				AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
+			</if>
+		</foreach>
+		ORDER BY ui.creat_dt DESC
+		LIMIT #{perPage} OFFSET ((#{currentPage} - 1) * #{perPage})
+	</select>
+
+	<!-- 사용자 목록 COUNT 조회 -->
+	<select id="selectMemberListByUserCount" parameterType="SearchVO" resultType="int">
+		SELECT COUNT(*)
+		FROM (
+			SELECT user_id
+			FROM user_author
+			WHERE author != 'ROLE_ADMIN'
+		) AS list
+		LEFT JOIN user_info AS ui
+		ON list.user_id = ui.user_id
+		LEFT JOIN orgnzt_member AS om
+		ON list.user_id = om.user_id
+		LEFT JOIN orgnzt_info AS oi
+		ON om.dept_code = oi.dept_code
+		WHERE ui.use_at = true
+		<foreach item="item" index="index" collection="searchObjectList">
+			<if test="item.type != null and item.type !='' and item.key != null and item.key != '' and item.value != null and item.value != ''">
+				AND ${item.key} LIKE CONCAT('%', #{item.value}, '%')
+			</if>
+		</foreach>
 	</select>
 
 	<!-- 멤버 추가 클릭 시 사용자 조회 -->
@@ -286,21 +330,17 @@
 	<!-- 사용자 수정 -->
 	<update id="updateMember" parameterType="Member">
         UPDATE user_info
-           SET
-               user_password = #{userPassword}
-             , user_nm = #{userNm}
+           SET user_nm = #{userNm}
              , user_email = #{userEmail}
              , updt_dt = CURRENT_TIMESTAMP
              , updt_id = #{updtId}
-             , lock_at = #{lockAt}
          WHERE user_id = #{userId}
     </update>
 
 	<!-- 사용자 비밀번호 변경 -->
 	<update id="updateMemberPw" parameterType="Member">
         UPDATE user_info
-           SET
-               user_password = #{userPassword}
+           SET user_password = #{userPassword}
         	 , updt_dt = CURRENT_TIMESTAMP
              , updt_id = #{updtId}
          WHERE user_id = #{userId}
@@ -428,36 +468,10 @@
 		</foreach>
 	</select>
 
-	<!-- 회원정보 -->
-	<sql id="selectMember">
-		SELECT ui.user_id
-			 , user_password
-			 , user_nm
-			 , user_email
-			 , user_tel
-			 , user_phone
-			 , zip_code
-			 , adres
-			 , adres_dtail
-			 , oi.dept_nm
-			 , oi.dept_code
-			 , ui.creat_dt
-			 , ui.updt_dt
-			 , ui.creat_id
-			 , ui.updt_id
-			 , ui.use_at
-			 , gender
-			 , birth_dt
-			 , login_failr_cnt
-			 , lock_at
-			 , lock_dt
-			 , ua.author
-		  FROM user_info AS ui
-	</sql>
-
 	<!-- 아이디 찾기 -->
 	<select id="findUserId" parameterType="Member" resultMap="memberResult">
 		<include refid="selectMember" />
+			 FROM user_info AS ui
 		LEFT JOIN orgnzt_member AS om
 			   ON ui.user_id = om.user_id
 		LEFT JOIN orgnzt_info AS oi
@@ -471,6 +485,7 @@
 	<!-- 비밀번호 찾기 -->
 	<select id="findUserPwd" parameterType="Member" resultMap="memberResult">
 		<include refid="selectMember" />
+			 FROM user_info AS ui
 		LEFT JOIN orgnzt_member AS om
 			   ON ui.user_id  = om.user_id
 		LEFT JOIN orgnzt_info AS oi
@@ -481,4 +496,11 @@
 			  AND ui.user_nm = #{userNm}
 			  AND ui.user_email = #{userEmail}
 	</select>
+
+	<!-- 사용자 잠김여부 변경 -->
+	<update id="updateUserLockAt" parameterType="String">
+		UPDATE user_info
+		SET lock_at = false
+		WHERE user_id = #{userId}
+	</update>
 </mapper>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List