박현정 박현정 07-30
250730 박현정 프로젝트 수정 로그 기능 추가
@b4523e0da1762a94f90ba2a548baa021fda9aea4
src/main/java/kr/co/takensoft/ai/system/feedback/dao/FeedbackDAO.java
--- src/main/java/kr/co/takensoft/ai/system/feedback/dao/FeedbackDAO.java
+++ src/main/java/kr/co/takensoft/ai/system/feedback/dao/FeedbackDAO.java
@@ -50,5 +50,5 @@
      *
      * 피드백 목록 조회(사용자가 참여하는 모든 프로젝트를 대상으로 함)
      */
-    List<FeedbackDTO> findAllByMemberId(String memberId);
+    List<FeedbackVO> findAllByMemberId(String memberId);
 }
src/main/java/kr/co/takensoft/ai/system/feedback/dto/FeedbackDTO.java
--- src/main/java/kr/co/takensoft/ai/system/feedback/dto/FeedbackDTO.java
+++ src/main/java/kr/co/takensoft/ai/system/feedback/dto/FeedbackDTO.java
@@ -1,5 +1,6 @@
 package kr.co.takensoft.ai.system.feedback.dto;
 
+import kr.co.takensoft.ai.system.feedback.vo.FeedbackVO;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
@@ -20,6 +21,7 @@
 @AllArgsConstructor
 public class FeedbackDTO {
 
+    private String feedbackId; // 피드백 아이디
     private String projectGroupId; // 프로젝트 그룹 아이디
     private String projectName; // 프로젝트 이름
     private String chatRoomId; // 채팅방 아이디
@@ -29,4 +31,20 @@
     private String isChecked; // 피드백 확인 여부
     private String createdAt; // 생성 일자
     private String updatedAt; // 수정 일자
+
+    public static FeedbackDTO from(FeedbackVO feedbackVO) {
+        return new FeedbackDTO(
+                feedbackVO.getFeedbackId(),
+                feedbackVO.getProjectGroupId(),
+                feedbackVO.getProjectName(),
+                feedbackVO.getChatRoomId(),
+                feedbackVO.getMemberId(),
+                feedbackVO.getMemberName(),
+                feedbackVO.getFeedbackContent(),
+                feedbackVO.getIsChecked(),
+                feedbackVO.getCreatedAt(),
+                feedbackVO.getUpdatedAt()
+        );
+
+    }
 }
src/main/java/kr/co/takensoft/ai/system/feedback/service/impl/FeedbackServiceImpl.java
--- src/main/java/kr/co/takensoft/ai/system/feedback/service/impl/FeedbackServiceImpl.java
+++ src/main/java/kr/co/takensoft/ai/system/feedback/service/impl/FeedbackServiceImpl.java
@@ -15,6 +15,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author : 박현정
@@ -93,7 +94,9 @@
 
         try {
             String memberId = baseParam.getMemberId(); // 사용자 아이디 가져오기
-            return feedbackDAO.findAllByMemberId(memberId); // 피드백 목록 조회
+            return feedbackDAO.findAllByMemberId(memberId)
+                    .stream().map(FeedbackDTO::from)
+                    .collect(Collectors.toList()); // 피드백 목록 조회
         }  catch (Exception e) {
             e.printStackTrace();
             throw e;
src/main/java/kr/co/takensoft/ai/system/project/service/ProjectService.java
--- src/main/java/kr/co/takensoft/ai/system/project/service/ProjectService.java
+++ src/main/java/kr/co/takensoft/ai/system/project/service/ProjectService.java
@@ -1,13 +1,14 @@
 package kr.co.takensoft.ai.system.project.service;
 
 import kr.co.takensoft.ai.system.common.dto.BaseParam;
-import kr.co.takensoft.ai.system.project.dto.*;
-import kr.co.takensoft.ai.system.project.vo.ProjectVO;
+import kr.co.takensoft.ai.system.project.dto.InsertProjectDTO;
+import kr.co.takensoft.ai.system.project.dto.ProjectSearchReqDTO;
+import kr.co.takensoft.ai.system.project.dto.UpdateProjectDTO;
+import kr.co.takensoft.ai.system.project.dto.UpdateProjectNameDTO;
+import kr.co.takensoft.ai.system.projectLog.dto.ProjectLogDTO;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 /**
  * @author 박현정
@@ -111,4 +112,12 @@
      * 프로젝트 상세 조회
      */
     HashMap<String, Object> findProject(String projectId, BaseParam request);
+
+    /**
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return HashMap<String, Object> - 프로젝트 상세 정보를 담은 객체
+     *
+     * 프로젝트 로그 목록 조회
+     */
+    HashMap<String, Object> findAllLogs(BaseParam request);
 }
src/main/java/kr/co/takensoft/ai/system/project/service/impl/ProjectServiceImpl.java
--- src/main/java/kr/co/takensoft/ai/system/project/service/impl/ProjectServiceImpl.java
+++ src/main/java/kr/co/takensoft/ai/system/project/service/impl/ProjectServiceImpl.java
@@ -13,6 +13,8 @@
 import kr.co.takensoft.ai.system.projectImage.dto.ProjectImageDTO;
 import kr.co.takensoft.ai.system.projectImage.service.ProjectImageService;
 import kr.co.takensoft.ai.system.projectImage.vo.ProjectImageVO;
+import kr.co.takensoft.ai.system.projectLog.dto.ProjectLogDTO;
+import kr.co.takensoft.ai.system.projectLog.service.ProjectLogService;
 import kr.co.takensoft.ai.system.projectMember.dto.ProjectMemberDTO;
 import kr.co.takensoft.ai.system.projectMember.service.ProjectMemberService;
 import kr.co.takensoft.ai.system.projectMember.vo.ProjectMemberVO;
@@ -44,7 +46,7 @@
     private final ProjectMemberService projectMemberService;
     private final ProjectImageService projectImageService;
     private final ProjectCommentService projectCommentService;
-    //private final ProjectLogService projectLogService;
+    private final ProjectLogService projectLogService;
 
     /**
      * @param request - 생성할 프로젝트 정보
@@ -165,6 +167,8 @@
             projectCommentService.saveProjectComment(memberId, updateProjectId, request.getSummary(), request.getComment()); // 프로젝트 주석 객체 생성
             String projectName = projectVO.getProjectName(); // 기존 프로젝트 이름 가져오기
             ProjectVO updateProjectVO = new ProjectVO(updateProjectId, projectGroupId, projectName); // 프로젝트 정보 등록(새로운 버전)
+
+            projectLogService.saveEditLog(projectGroupId, memberId); // 수정 로그 저장
             return projectDAO.saveProject(updateProjectVO);
         }  catch (Exception e) {
             e.printStackTrace();
@@ -320,4 +324,20 @@
             throw e;
         }
     }
+
+    /**
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return HashMap<String, Object> - 프로젝트 상세 정보를 담은 객체
+     *
+     * 프로젝트 로그 목록 조회
+     */
+    @Override
+    public HashMap<String, Object> findAllLogs(BaseParam request) {
+
+        List<ProjectLogDTO> logDTOS = projectLogService.findAllLogs(request.getMemberId()); // 로그 목록 조회
+
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("editLogs", logDTOS);
+        return result; // 프로젝트 로그 목록 조회 결과 응답
+    }
 }
src/main/java/kr/co/takensoft/ai/system/project/web/ProjectController.java
--- src/main/java/kr/co/takensoft/ai/system/project/web/ProjectController.java
+++ src/main/java/kr/co/takensoft/ai/system/project/web/ProjectController.java
@@ -7,11 +7,11 @@
 import kr.co.takensoft.ai.system.project.dto.UpdateProjectDTO;
 import kr.co.takensoft.ai.system.project.dto.UpdateProjectNameDTO;
 import kr.co.takensoft.ai.system.project.service.ProjectService;
+import kr.co.takensoft.ai.system.projectLog.service.ProjectLogService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.HashMap;
 
@@ -32,7 +32,7 @@
     private final ProjectService projectService;
 
     /**
-//     * @param request - 생성할 프로젝트 정보
+     * @param request - 생성할 프로젝트 정보
      * @return ResponseEntity - 프로젝트 등록 결과를 포함하는 응답
      *
      * 프로젝트 등록
@@ -41,7 +41,6 @@
     public ResponseEntity<?> saveProject(
             @ModelAttribute InsertProjectDTO request) {
         HashMap<String, Object> result = new HashMap<>();
-        System.out.println("컨트롤러 이미지 파일: " + request.getImageFile().getOriginalFilename());
         result.put("result", projectService.saveProject(request));
         return new ResponseEntity<>(result, HttpStatus.OK);
     }
@@ -142,4 +141,17 @@
         result.put("result", projectService.findProject(projectId, request));
         return new ResponseEntity<>(result, HttpStatus.OK);
     }
+
+    /**
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 로그 조회 결과를 포함하는 응답
+     *
+     * 프로젝트 로그 조회
+     */
+    @PostMapping("/findAllLogs.json")
+    public ResponseEntity<?> findAllProjectLogs(@RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.findAllLogs(request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
 }
src/main/java/kr/co/takensoft/ai/system/projectLog/dao/ProjectLogDAO.java
--- src/main/java/kr/co/takensoft/ai/system/projectLog/dao/ProjectLogDAO.java
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/dao/ProjectLogDAO.java
@@ -4,6 +4,8 @@
 import kr.co.takensoft.ai.system.projectLog.vo.ProjectLogVO;
 import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
 
+import java.util.List;
+
 /**
  * @author 박현정
  * @since 2025.07.10
@@ -23,4 +25,12 @@
      * 프로젝트 활동 로그 등록
      */
     int saveProjectLog(ProjectLogVO projectLogVO);
+
+    /**
+     * @param memberId - 사용자 아이디
+     * @return List<ProjectLogVO> - 프로젝트 활동 로그 목록
+     *
+     * 프로젝트 활동 로그 목록 조회 (사용자가 참여하는 모든 프로젝트에 대해)
+     */
+    List<ProjectLogVO> findAllByMemberId(String memberId);
 }
 
src/main/java/kr/co/takensoft/ai/system/projectLog/dto/ProjectLogDTO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/dto/ProjectLogDTO.java
@@ -0,0 +1,43 @@
+package kr.co.takensoft.ai.system.projectLog.dto;
+
+import kr.co.takensoft.ai.system.projectLog.vo.ProjectLogVO;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.30
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.30  |    박현정    | 최초 등록
+ *
+ * 프로젝트 로그 조회 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProjectLogDTO {
+
+    private String projectLogId; // 프로젝트 로그 아이디
+    private String projectGroupId; // 프로젝트 그룹 아이디
+    private String projectName; // 프로젝트 이름(현재 그룹 내에서 isMain='Y'인 프로젝트)
+    private String actionType; // 로그 내용(E : 수정, S : 공유)
+    private String registerId; // 공유/수정을 실행한 사용자 아이디
+    private String createdAt; // 생성일자
+    private String updatedAt; // 수정일자
+
+    public static ProjectLogDTO from(ProjectLogVO logVO) {
+        return new ProjectLogDTO(
+                logVO.getProjectLogId(),
+                logVO.getProjectGroupId(),
+                logVO.getProjectName(),
+                logVO.getActionType(),
+                logVO.getRegisterId(),
+                logVO.getCreatedAt(),
+                logVO.getUpdatedAt()
+        );
+    }
+}
src/main/java/kr/co/takensoft/ai/system/projectLog/service/ProjectLogService.java
--- src/main/java/kr/co/takensoft/ai/system/projectLog/service/ProjectLogService.java
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/service/ProjectLogService.java
@@ -1,4 +1,47 @@
 package kr.co.takensoft.ai.system.projectLog.service;
 
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.projectLog.dto.ProjectLogDTO;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.30
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.30  |     박현정    | 최초 등록
+ *
+ * 프로젝트 로그 관련 인터페이스
+ */
 public interface ProjectLogService {
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param registerId - 등록자 아이디
+     * @return 등록 성공 여부
+     *
+     * 프로젝트 수정 로그 등록
+     */
+    @Transactional
+    int saveEditLog(String projectGroupId, String registerId);
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param registerId - 등록자 아이디
+     * @return 등록 성공 여부
+     *
+     * 프로젝트 공유 로그 등록
+     */
+    @Transactional
+    int saveShareLog(String projectGroupId, String registerId);
+
+    /**
+     * @param registerId - 등록자 아이디
+     * @return List<ProjectLogDTO> - 로그 정보를 담은 DTO 객체 리스트
+     *
+     * 프로젝트 로그 목록 조회(사용자가 참여하는 모든 프로젝트에 대해)
+     */
+    List<ProjectLogDTO> findAllLogs(String registerId);
 }
src/main/java/kr/co/takensoft/ai/system/projectLog/service/impl/ProjectLogServiceImpl.java
--- src/main/java/kr/co/takensoft/ai/system/projectLog/service/impl/ProjectLogServiceImpl.java
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/service/impl/ProjectLogServiceImpl.java
@@ -1,4 +1,77 @@
 package kr.co.takensoft.ai.system.projectLog.service.impl;
 
-public class ProjectLogServiceImpl {
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.common.idgen.service.IdgenService;
+import kr.co.takensoft.ai.system.projectLog.dao.ProjectLogDAO;
+import kr.co.takensoft.ai.system.projectLog.dto.ProjectLogDTO;
+import kr.co.takensoft.ai.system.projectLog.service.ProjectLogService;
+import kr.co.takensoft.ai.system.projectLog.vo.ProjectLogVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.30
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.30  |     박현정    | 최초 등록
+ *
+ * 프로젝트 로그 관련 서비스
+ */
+@Service("projectLogService")
+@RequiredArgsConstructor
+public class ProjectLogServiceImpl implements ProjectLogService {
+
+    private final ProjectLogDAO projectLogDAO;
+    private final IdgenService projectLogIdgn;
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param registerId - 등록자 아이디
+     * @return 등록 성공 여부
+     *
+     * 프로젝트 수정 로그 등록
+     */
+    @Override
+    @Transactional
+    public int saveEditLog(String projectGroupId, String registerId) {
+
+        String LogId = projectLogIdgn.getNextStringId(); // 프로젝트 로그 구분 아이디 생성
+        ProjectLogVO LogVO = new ProjectLogVO(LogId, projectGroupId, "E", registerId); // 로그 정보 등록
+        return projectLogDAO.saveProjectLog(LogVO); // 로그 정보 등록
+    }
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param registerId - 등록자 아이디
+     * @return 등록 성공 여부
+     *
+     * 프로젝트 공유 로그 등록
+     */
+    @Override
+    @Transactional
+    public int saveShareLog(String projectGroupId, String registerId) {
+
+        String LogId = projectLogIdgn.getNextStringId(); // 프로젝트 로그 구분 아이디 생성
+        ProjectLogVO LogVO = new ProjectLogVO(LogId, projectGroupId, "S", registerId); // 로그 정보 등록
+        return projectLogDAO.saveProjectLog(LogVO); // 로그 정보 등록
+    }
+
+    /**
+     * @param registerId - 등록자 아이디
+     * @return List<ProjectLogDTO> - 로그 정보를 담은 DTO 객체 리스트
+     *
+     * 프로젝트 로그 목록 조회(사용자가 참여하는 모든 프로젝트에 대해)
+     */
+    @Override
+    public List<ProjectLogDTO> findAllLogs(String registerId) {
+
+        return projectLogDAO.findAllByMemberId(registerId)
+                .stream().map(ProjectLogDTO::from)
+                .collect(Collectors.toList());
+    }
 }
src/main/java/kr/co/takensoft/ai/system/projectLog/vo/ProjectLogVO.java
--- src/main/java/kr/co/takensoft/ai/system/projectLog/vo/ProjectLogVO.java
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/vo/ProjectLogVO.java
@@ -19,16 +19,19 @@
 
     private String projectLogId; // 프로젝트 로그 아이디
     private String projectGroupId; // 프로젝트 그룹 아이디
+    private String projectName; // 프로젝트 이름(현재 그룹 내에서 isMain='Y'인 프로젝트)
     private String actionType; // 로그 내용(E : 수정, S : 공유)
+    private String registerId; // 공유/수정을 실행한 사용자 아이디
     private String useAt; // 사용 여부 (N : 사용 안함, Y : 사용)
     private String createdAt; // 생성일자
     private String updatedAt; // 수정일자
 
     // 프로젝트 로그 생성용 생성자
-    public ProjectLogVO(String projectLogId, String projectGroupId, String actionType) {
+    public ProjectLogVO(String projectLogId, String projectGroupId, String actionType, String registerId) {
         this.projectLogId = projectLogId;
         this.projectGroupId = projectGroupId;
         this.actionType = actionType;
+        this.registerId = registerId;
         this.useAt = "Y";
     }
 }
src/main/resources/mybatis/mapper/feedback/feedback-SQL.xml
--- src/main/resources/mybatis/mapper/feedback/feedback-SQL.xml
+++ src/main/resources/mybatis/mapper/feedback/feedback-SQL.xml
@@ -98,7 +98,7 @@
         LEFT JOIN project_member pm ON f.project_group_id = pm.project_group_id AND pm.member_id = #{memberId}
         LEFT JOIN member m ON f.member_id = m.member_id
         LEFT JOIN chat_room cr ON f.feedback_id = cr.feedback_id
-        AND f.use_at = 'Y'
+        WHERE f.use_at = 'Y'
     </select>
 
     <update id="setFeedbackCheck" parameterType="String">
src/main/resources/mybatis/mapper/projectLog/projectLog-SQL.xml
--- src/main/resources/mybatis/mapper/projectLog/projectLog-SQL.xml
+++ src/main/resources/mybatis/mapper/projectLog/projectLog-SQL.xml
@@ -1,6 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="kr.co.takensoft.ai.system.projectLog.dao.ProjectLogDAO">
+
+    <!--
+    작 성 자 : 박현정
+    작 성 일 : 2025.07.30
+    내   용 :  피드백 resultMap
+    -->
+    <resultMap id="LogMap" type="ProjectLogVO">
+        <result property="projectLogId" column="project_log_id"/>
+        <result property="projectGroupId" column="project_group_id"/>
+        <result property="projectName" column="project_name"/>
+        <result property="actionType" column="action_type"/>
+        <result property="registerId" column="register_id"/>
+        <result property="useAt" column="use_at"/>
+        <result property="createdAt" column="created_at"/>
+        <result property="updatedAt" column="updated_at"/>
+    </resultMap>
+
     <!--
         작 성 자 : 박현정
         작 성 일 : 2025.07.10
@@ -11,6 +28,7 @@
             (project_log_id,
             project_group_id,
             action_type,
+            register_id,
             use_at,
             created_at,
             updated_at)
@@ -18,6 +36,7 @@
             #{projectLogId},
             #{projectGroupId},
             #{actionType},
+            #{registerId},
             #{useAt},
             CURRENT_TIMESTAMP,
             CURRENT_TIMESTAMP
@@ -25,6 +44,28 @@
     </insert>
 
     <!--
+    작 성 자 : 박현정
+    작 성 일 : 2025.07.30
+    내    용 : 프로젝트 로그 목록 조회 (사용자 아이디로 검색)
+    -->
+    <select id="findAllByMemberId" resultMap="LogMap" parameterType="String">
+        SELECT
+            l.project_log_id,
+            l.project_group_id,
+            p.project_name,
+            l.action_type,
+            l.register_id,
+            l.use_at,
+            l.created_at,
+            l.updated_at
+        FROM project_log l
+        LEFT JOIN project_member pm ON l.project_group_id = pm.project_group_id AND pm.member_id = #{memberId}
+        LEFT JOIN project_group g ON l.project_group_id = g.project_group_id AND g.use_at = 'Y'
+        LEFT JOIN project p ON l.project_group_id = p.project_group_id AND p.is_main = 'Y'
+        WHERE l.use_at = 'Y'
+    </select>
+
+    <!--
         작 성 자 : 박현정
         작 성 일 : 2025.07.11
         내    용 : 활성(사용중) 데이터만 조회하도록 필터링
Add a comment
List