박현정 박현정 07-22
250722 박현정 피드백/채팅 관련 기능 추가
@94aca25e1ba4274f3fca49108c2be5970d013b37
 
images/5bc961f6-bbd1-4338-b57d-9fd40ec32097_61e11946c8e2d427341c9e981d4ecd22.jpg (Binary) (added)
+++ images/5bc961f6-bbd1-4338-b57d-9fd40ec32097_61e11946c8e2d427341c9e981d4ecd22.jpg
Binary file is not shown
 
images/6359c2b9-7e3e-4594-ba49-0e94a8696093_SSC_20240806100040.jpg (Binary) (added)
+++ images/6359c2b9-7e3e-4594-ba49-0e94a8696093_SSC_20240806100040.jpg
Binary file is not shown
 
images/970f2553-594c-4a70-9e0b-6e75b597871f_SSC_20240806100040.jpg (Binary) (added)
+++ images/970f2553-594c-4a70-9e0b-6e75b597871f_SSC_20240806100040.jpg
Binary file is not shown
 
images/e3ef9025-5933-4f29-9803-8c4d6a8e1584_SSC_20240806100040.jpg (Binary) (added)
+++ images/e3ef9025-5933-4f29-9803-8c4d6a8e1584_SSC_20240806100040.jpg
Binary file is not shown
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/dao/ChatMsgDAO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/dao/ChatMsgDAO.java
@@ -0,0 +1,30 @@
+package kr.co.takensoft.ai.system.chatMsg.dao;
+
+import kr.co.takensoft.ai.system.chatMsg.vo.ChatMsgVO;
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정     | 최초 등록
+ *
+ * 채팅방 메시지 관련 DAO
+ */
+@Mapper("chatMsgDAO")
+public interface ChatMsgDAO {
+
+    /**
+     * @param chatMsgVO - 메시지 정보
+     * @return int - 메시지 등록 결과
+     *
+     * 메시지 등록
+     */
+    public int saveChatMsg(ChatMsgVO chatMsgVO);
+
+    public List<ChatMsgVO> findAllChatMsgsByChatRoomId(String chatRoomId);
+}
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/dto/ChatMsgDTO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/dto/ChatMsgDTO.java
@@ -0,0 +1,43 @@
+package kr.co.takensoft.ai.system.chatMsg.dto;
+
+import kr.co.takensoft.ai.system.chatMsg.vo.ChatMsgVO;
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정    | 최초 등록
+ *
+ * 채팅 메시지 조회 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ChatMsgDTO {
+
+    private String chatMsgId; // 채팅 메시지 아이디
+    private String senderId; // 메시지 작성자 아이디
+    private String senderName; // 메시지 작성자 이름
+    private String msgContent; // 메시지 내용
+    private String createdAt; // 생성 일자
+    private String updatedAt; // 수정 일자
+
+    public static ChatMsgDTO from(ChatMsgVO chatMsgVO) {
+        return new ChatMsgDTO(
+                chatMsgVO.getChatMsgId(),
+                chatMsgVO.getSenderId(),
+                chatMsgVO.getSenderName(),
+                chatMsgVO.getMsgContent(),
+                chatMsgVO.getCreatedAt(),
+                chatMsgVO.getUpdatedAt()
+        );
+    }
+
+}
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/dto/InsertChatMsgDTO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/dto/InsertChatMsgDTO.java
@@ -0,0 +1,25 @@
+package kr.co.takensoft.ai.system.chatMsg.dto;
+
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정    | 최초 등록
+ *
+ * 채팅 메시지 등록 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class InsertChatMsgDTO extends BaseParam {
+
+    private String msgContent; // 메시지 내용
+}
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/service/ChatMsgService.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/service/ChatMsgService.java
@@ -0,0 +1,39 @@
+package kr.co.takensoft.ai.system.chatMsg.service;
+
+import kr.co.takensoft.ai.system.chatMsg.dto.ChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.dto.InsertChatMsgDTO;
+import kr.co.takensoft.ai.system.feedback.vo.FeedbackVO;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정   | 최초 등록
+ *
+ * 채팅방 메시지 관련 인터페이스
+ */
+public interface ChatMsgService {
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param senderId - 보내는 사용자 아이디
+     * @param msgContent - 메시지 내용
+     * @return 등록 성공 여부
+     *
+     * 채팅방 메시지 등록
+     */
+    @Transactional
+    int saveChatMsg(String chatRoomId, String senderId, String msgContent);
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @return List<ChatMsgDTO> - 채팅방 메시지 목록
+     *
+     * 채팅방 메시지 목록 조회
+     */
+    List<ChatMsgDTO> findAllChatMsgs(String chatRoomId);
+}
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/service/impl/ChatMsgServiceImpl.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/service/impl/ChatMsgServiceImpl.java
@@ -0,0 +1,64 @@
+package kr.co.takensoft.ai.system.chatMsg.service.impl;
+
+import kr.co.takensoft.ai.system.chatMsg.dao.ChatMsgDAO;
+import kr.co.takensoft.ai.system.chatMsg.dto.ChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.dto.InsertChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.service.ChatMsgService;
+import kr.co.takensoft.ai.system.chatMsg.vo.ChatMsgVO;
+import kr.co.takensoft.ai.system.chatRoom.vo.ChatRoomVO;
+import kr.co.takensoft.ai.system.common.idgen.service.IdgenService;
+import kr.co.takensoft.ai.system.projectMember.service.ProjectMemberService;
+import lombok.RequiredArgsConstructor;
+import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.16
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.16  |     박현정    | 최초 등록
+ *
+ * 채팅방 메시지 관련 서비스
+ */
+@Service("chatMsgService")
+@RequiredArgsConstructor
+public class ChatMsgServiceImpl extends EgovAbstractServiceImpl implements ChatMsgService {
+
+    private final IdgenService chatMsgIdgn;
+    private final ChatMsgDAO chatMsgDAO;
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param senderId - 보내는 사용자 아이디
+     * @param msgContent - 메시지 내용
+     * @return 등록 성공 여부
+     *
+     * 채팅방 메시지 등록
+     */
+    @Override
+    @Transactional
+    public int saveChatMsg(String chatRoomId, String senderId, String msgContent) {
+
+        try {
+
+            String chatMsgId = chatMsgIdgn.getNextStringId(); // 채팅 메시지 구분 아이디 생성
+            ChatMsgVO chatMsgVO = new ChatMsgVO(chatMsgId, chatRoomId, senderId, msgContent); // 채팅 메시지 객체 생성
+            return chatMsgDAO.saveChatMsg(chatMsgVO); // 채팅 메시지 등록
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    @Override
+    public List<ChatMsgDTO> findAllChatMsgs(String chatRoomId) {
+        List<ChatMsgDTO> chatMsgDTOS = chatMsgDAO.findAllChatMsgsByChatRoomId(chatRoomId)
+                .stream().map(ChatMsgDTO::from).collect(Collectors.toList()); // 채팅 메시지 목록 가져오기
+        return chatMsgDTOS;
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/chatMsg/vo/ChatMsgVO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatMsg/vo/ChatMsgVO.java
@@ -0,0 +1,37 @@
+package kr.co.takensoft.ai.system.chatMsg.vo;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정     | 최초 등록
+ *
+ *
+ * 채팅 메시지 관련 VO
+ */
+@Getter
+@NoArgsConstructor
+public class ChatMsgVO {
+
+    private String chatMsgId; // 채팅 메시지 아이디
+    private String chatRoomId; // 채팅방 아이디
+    private String senderId; // 메시지 작성자 아이디
+    private String senderName; // 메시지 작성자 이름
+    private String msgContent; // 메시지 내용
+    private String useAt; // 사용 여부 (N : 사용 안함, Y : 사용)
+    private String createdAt; // 생성 일자
+    private String updatedAt; // 수정 일자
+
+    // 채팅 메시지 생성용 생성자
+    public ChatMsgVO(String chatMsgId, String chatRoomId, String senderId, String msgContent) {
+        this.chatMsgId = chatMsgId;
+        this.chatRoomId = chatRoomId;
+        this.senderId = senderId;
+        this.msgContent = msgContent;
+        this.useAt = "Y";
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/chatRoom/dao/ChatRoomDAO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatRoom/dao/ChatRoomDAO.java
@@ -0,0 +1,35 @@
+package kr.co.takensoft.ai.system.chatRoom.dao;
+
+import kr.co.takensoft.ai.system.chatRoom.vo.ChatRoomVO;
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import java.util.Optional;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정     | 최초 등록
+ *
+ * 피드백 채팅방 관련 DAO
+ */
+@Mapper("chatRoomDAO")
+public interface ChatRoomDAO {
+
+    /**
+     * @param chatRoomVO - 채팅방 정보
+     * @return int - 채팅방 등록 결과
+     *
+     * 채팅방 등록
+     */
+    int saveChatRoom(ChatRoomVO chatRoomVO);
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @return ChatRoomVO - 채팅방 정보 조회
+     *
+     * 채팅방 정보 조회
+     */
+    Optional<ChatRoomVO> findById(String chatRoomId);
+}
 
src/main/java/kr/co/takensoft/ai/system/chatRoom/service/ChatRoomService.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatRoom/service/ChatRoomService.java
@@ -0,0 +1,49 @@
+package kr.co.takensoft.ai.system.chatRoom.service;
+
+import kr.co.takensoft.ai.system.chatMsg.dto.ChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.dto.InsertChatMsgDTO;
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.feedback.vo.FeedbackVO;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정   | 최초 등록
+ *
+ * 피드백 채팅방 관련 인터페이스
+ */
+public interface ChatRoomService {
+
+    /**
+     * @param feedbackVO - 피드백 정보를 담은 VO 객체
+     * @return 등록 성공 여부
+     *
+     * 채팅방 등록
+     */
+    @Transactional
+    int saveChatRoom(FeedbackVO feedbackVO);
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 메시지 관련 내용을 담은 DTO 객체
+     * @return 등록 성공 여부
+     *
+     * 채팅방 메시지 등록
+     */
+    @Transactional
+    int saveChatMsg(String chatRoomId, InsertChatMsgDTO request);
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return List<ChatMsgDTO> - 채팅방 메시지 목록을 담은 DTO 객체 리스트
+     *
+     * 채팅방 메시지 목록 조회
+     */
+    List<ChatMsgDTO> findAllChatMsgs(String chatRoomId, BaseParam request);
+}
 
src/main/java/kr/co/takensoft/ai/system/chatRoom/service/impl/ChatRoomServiceImpl.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatRoom/service/impl/ChatRoomServiceImpl.java
@@ -0,0 +1,93 @@
+package kr.co.takensoft.ai.system.chatRoom.service.impl;
+
+import kr.co.takensoft.ai.system.chatMsg.dto.ChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.dto.InsertChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.service.ChatMsgService;
+import kr.co.takensoft.ai.system.chatMsg.vo.ChatMsgVO;
+import kr.co.takensoft.ai.system.chatRoom.dao.ChatRoomDAO;
+import kr.co.takensoft.ai.system.chatRoom.service.ChatRoomService;
+import kr.co.takensoft.ai.system.chatRoom.vo.ChatRoomVO;
+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.feedback.vo.FeedbackVO;
+import kr.co.takensoft.ai.system.projectMember.service.ProjectMemberService;
+import lombok.RequiredArgsConstructor;
+import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.16
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.16  |     박현정    | 최초 등록
+ *
+ * 피드백 채팅방 관련 서비스
+ */
+@Service("chatRoomService")
+@RequiredArgsConstructor
+public class ChatRoomServiceImpl extends EgovAbstractServiceImpl implements ChatRoomService {
+
+    private final IdgenService chatRoomIdgn;
+    private final ChatRoomDAO chatRoomDAO;
+    private final ChatMsgService chatMsgService;
+    private final ProjectMemberService projectMemberService;
+
+    /**
+     * @param feedbackVO - 피드백 정보를 담은 VO 객체
+     * @return 등록 성공 여부
+     *
+     * 채팅방 등록
+     */
+    @Override
+    @Transactional
+    public int saveChatRoom(FeedbackVO feedbackVO) {
+        try {
+            String chatRoomId = chatRoomIdgn.getNextStringId(); // 채팅방 구별 아이디 생성
+            ChatRoomVO chatRoomVO = new ChatRoomVO(chatRoomId, feedbackVO.getProjectGroupId(), feedbackVO.getFeedbackId()); // 채팅방 정보 등록
+            chatMsgService.saveChatMsg(chatRoomId, feedbackVO.getMemberId(), feedbackVO.getFeedbackContent()); // 채팅 메시지 저장
+            return chatRoomDAO.saveChatRoom(chatRoomVO); // 채팅방 저장
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 메시지 관련 내용을 담은 DTO 객체
+     * @return 등록 성공 여부
+     *
+     * 채팅방 메시지 등록
+     */
+    @Override
+    @Transactional
+    public int saveChatMsg(String chatRoomId, InsertChatMsgDTO request) {
+        return chatMsgService.saveChatMsg(chatRoomId, request.getMemberId(), request.getMsgContent()); // 채팅 메시지 등록
+    }
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return List<ChatMsgDTO> - 채팅방 메시지 목록을 담은 DTO 객체 리스트
+     *
+     * 채팅방 메시지 목록 조회
+     */
+    @Override
+    public List<ChatMsgDTO> findAllChatMsgs(String chatRoomId, BaseParam request) {
+        try {
+            String memberId = request.getMemberId(); // 사용자 아이디 꺼내기
+            ChatRoomVO chatRoomVO = chatRoomDAO.findById(chatRoomId)
+                    .orElseThrow(() -> new IllegalArgumentException("채팅방이 존재하지 않습니다."));
+            projectMemberService.validateProjectMember(chatRoomVO.getProjectGroupId(), memberId);
+            List<ChatMsgDTO> chatMsgDTOS = chatMsgService.findAllChatMsgs(chatRoomId);
+            return chatMsgDTOS;
+        }  catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/chatRoom/vo/ChatRoomVO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatRoom/vo/ChatRoomVO.java
@@ -0,0 +1,35 @@
+package kr.co.takensoft.ai.system.chatRoom.vo;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정     | 최초 등록
+ *
+ *
+ * 피드백 채팅방 관련 VO
+ */
+@Getter
+@NoArgsConstructor
+public class ChatRoomVO {
+
+    private String chatRoomId; // 피드백 채팅방 아이디
+    private String projectGroupId; // 프로젝트 그룹 아이디
+    private String feedbackId; // 피드백 아이디 (피드백 채팅방을 개설한 피드백)
+    private String useAt; // 사용 여부 (N : 사용 안함, Y : 사용)
+    private String createdAt; // 생성일자
+    private String updatedAt; // 수정일자
+
+    // 피드백 채팅 생성용 생성자
+    public ChatRoomVO(String chatRoomId, String projectGroupId, String feedbackId) {
+
+        this.chatRoomId = chatRoomId;
+        this.projectGroupId = projectGroupId;
+        this.feedbackId = feedbackId;
+        this.useAt = "Y";
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/chatRoom/web/ChatRoomController.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/chatRoom/web/ChatRoomController.java
@@ -0,0 +1,58 @@
+package kr.co.takensoft.ai.system.chatRoom.web;
+
+import kr.co.takensoft.ai.system.chatMsg.dto.InsertChatMsgDTO;
+import kr.co.takensoft.ai.system.chatMsg.service.ChatMsgService;
+import kr.co.takensoft.ai.system.chatRoom.service.ChatRoomService;
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.feedback.dto.InsertFeedbackDTO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.16
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.16  |     박현정    | 최초 등록
+ *
+ * 채팅방 관련 Controller
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/chat")
+public class ChatRoomController {
+
+    private final ChatRoomService chatRoomService;
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 생성할 채팅 메시지 정보
+     * @return ResponseEntity - 메시지 등록 결과를 포함하는 응답
+     *
+     * 채팅 메시지 등록
+     */
+    @PostMapping("/{chatRoomId}/saveChatMsg.json")
+    public ResponseEntity<?> saveChatMsg(@PathVariable String chatRoomId, @RequestBody InsertChatMsgDTO request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", chatRoomService.saveChatMsg(chatRoomId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param chatRoomId - 채팅방 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 메시지 목록 조회 결과를 포함하는 응답
+     *
+     * 채팅 메시지 목록 조회
+     */
+    @PostMapping("/{chatRoomId}/findAllChatMsgs.json")
+    public ResponseEntity<?> findAllChatMsgs(@PathVariable String chatRoomId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", chatRoomService.findAllChatMsgs(chatRoomId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/common/dto/BaseParam.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/common/dto/BaseParam.java
@@ -0,0 +1,26 @@
+package kr.co.takensoft.ai.system.common.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.17
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.17  |    박현정    | 최초 등록
+ *
+ * memberId 요청 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class BaseParam {
+
+    @NotBlank
+    private String memberId; // 사용자 아이디
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/dao/FeedbackDAO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/dao/FeedbackDAO.java
@@ -0,0 +1,54 @@
+package kr.co.takensoft.ai.system.feedback.dao;
+
+import kr.co.takensoft.ai.system.feedback.dto.FeedbackDTO;
+import kr.co.takensoft.ai.system.feedback.vo.FeedbackVO;
+import kr.co.takensoft.ai.system.project.vo.ProjectVO;
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author 박현정
+ * @since 2025.07.10
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.10  |    박현정     | 최초 등록
+ *
+ * 피드백 관련 DAO
+ */
+@Mapper("feedbackDAO")
+public interface FeedbackDAO {
+
+    /**
+     * @param feedbackId - 피드백 아이디
+     * @return FeedbackVO - 피드백 정보
+     *
+     * 피드백 정보 조회
+     */
+    Optional<FeedbackVO> findById(String feedbackId);
+
+    /**
+     * @param feedbackVO - 피드백 정보
+     * @return int - 피드백 등록 결과
+     *
+     * 피드백 등록
+     */
+    int saveFeedback(FeedbackVO feedbackVO);
+
+    /**
+     * @param feedbackId - 피드백 아이디
+     * @return int - 피드백 확인 결과 (isChecked = 'Y')
+     *
+     * 피드백 확인 (isChecked = 'Y')
+     */
+    int setFeedbackCheck(String feedbackId);
+
+    /**
+     * @param memberId - 사용자 아이디
+     * @return List<FeedbackDTO> - 피드백 목록 조회 결과
+     *
+     * 피드백 목록 조회(사용자가 참여하는 모든 프로젝트를 대상으로 함)
+     */
+    List<FeedbackDTO> findAllByMemberId(String memberId);
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/dto/FeedbackDTO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/dto/FeedbackDTO.java
@@ -0,0 +1,32 @@
+package kr.co.takensoft.ai.system.feedback.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정    | 최초 등록
+ *
+ * 피드백 조회 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class FeedbackDTO {
+
+    private String projectGroupId; // 프로젝트 그룹 아이디
+    private String projectName; // 프로젝트 이름
+    private String chatRoomId; // 채팅방 아이디
+    private String memberId; // 피드백 작성자 아이디
+    private String memberName; // 피드백 작성자 이름
+    private String feedbackContent; // 피드백 내용
+    private String isChecked; // 피드백 확인 여부
+    private String createdAt; // 생성 일자
+    private String updatedAt; // 수정 일자
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/dto/InsertFeedbackDTO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/dto/InsertFeedbackDTO.java
@@ -0,0 +1,23 @@
+package kr.co.takensoft.ai.system.feedback.dto;
+
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정    | 최초 등록
+ *
+ * 피드백 등록 관련 DTO
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class InsertFeedbackDTO extends BaseParam {
+
+    private String feedbackContent; // 피드백 내용
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/service/FeedbackService.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/service/FeedbackService.java
@@ -0,0 +1,48 @@
+package kr.co.takensoft.ai.system.feedback.service;
+
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.feedback.dto.FeedbackDTO;
+import kr.co.takensoft.ai.system.feedback.dto.InsertFeedbackDTO;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author 박현정
+ * @since 2025.07.16
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.16  |    박현정   | 최초 등록
+ *
+ * 피드백 관련 인터페이스
+ */
+public interface FeedbackService {
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param request - 생성할 피드백 정보
+     * @return 등록 성공 여부
+     *
+     * 피드백 등록
+     */
+    @Transactional
+    int saveFeedback(String projectGroupId, InsertFeedbackDTO request);
+
+    /**
+     * @param feedbackId - 피드백 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return 피드백 확인 성공 여부 (isChecked = 'Y')
+     *
+     * 피드백 확인(프로젝트 대표자만 가능)
+     */
+    @Transactional
+    int checkFeedback(String feedbackId, BaseParam request);
+
+    /**
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return List<FeedbackDTO> - 피드백 정보를 담은 DTO 객체 리스트
+     *
+     * 피드백 목록 조회(사용자가 참여하는 모든 프로젝트를 대상으로 함)
+     */
+    List<FeedbackDTO> findAllFeedbacks(BaseParam request);
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/service/impl/FeedbackServiceImpl.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/service/impl/FeedbackServiceImpl.java
@@ -0,0 +1,102 @@
+package kr.co.takensoft.ai.system.feedback.service.impl;
+
+import kr.co.takensoft.ai.system.chatRoom.service.ChatRoomService;
+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.feedback.dao.FeedbackDAO;
+import kr.co.takensoft.ai.system.feedback.dto.FeedbackDTO;
+import kr.co.takensoft.ai.system.feedback.dto.InsertFeedbackDTO;
+import kr.co.takensoft.ai.system.feedback.service.FeedbackService;
+import kr.co.takensoft.ai.system.feedback.vo.FeedbackVO;
+import kr.co.takensoft.ai.system.projectMember.service.ProjectMemberService;
+import lombok.RequiredArgsConstructor;
+import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.16
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.16  |     박현정    | 최초 등록
+ *
+ * 피드백 관련 서비스
+ */
+@Service("feedbackService")
+@RequiredArgsConstructor
+public class FeedbackServiceImpl extends EgovAbstractServiceImpl implements FeedbackService {
+
+    private final FeedbackDAO feedbackDAO;
+    private final IdgenService feedbackIdgn;
+    private final ProjectMemberService projectMemberService;
+    private final ChatRoomService chatRoomService;
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param request - 생성할 피드백 정보
+     * @return 등록 성공 여부
+     *
+     * 피드백 등록
+     */
+    @Override
+    @Transactional
+    public int saveFeedback(String projectGroupId, InsertFeedbackDTO request) {
+
+        try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
+            projectMemberService.validateProjectMember(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
+
+            String feedbackId = feedbackIdgn.getNextStringId(); // 피드백 구분 아이디 생성
+            FeedbackVO feedbackVO = new FeedbackVO(feedbackId, projectGroupId, memberId, request.getFeedbackContent()); // 피드백 정보 등록
+            chatRoomService.saveChatRoom(feedbackVO); // 피드백 채팅방 등록
+            return feedbackDAO.saveFeedback(feedbackVO); // 피드백 저장
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    /**
+     * @param feedbackId - 피드백 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return 피드백 확인 성공 여부 (isChecked = 'Y')
+     *
+     * 피드백 확인(프로젝트 대표자만 가능)
+     */
+    @Override
+    @Transactional
+    public int checkFeedback(String feedbackId, BaseParam request) {
+
+        try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
+            FeedbackVO feedbackVO = feedbackDAO.findById(feedbackId)
+                    .orElseThrow(() -> new IllegalArgumentException("피드백이 존재하지 않습니다."));
+            projectMemberService.validateProjectOwner(feedbackVO.getProjectGroupId(), memberId); // 프로젝트 대표자인지 검증
+            return feedbackDAO.setFeedbackCheck(feedbackVO.getFeedbackId()); // 피드백 확인
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    /**
+     * @param baseParam - 사용자 아이디를 담은 DTO 객체
+     * @return List<FeedbackDTO> - 피드백 정보를 담은 DTO 객체 리스트
+     *
+     * 피드백 목록 조회(사용자가 참여하는 모든 프로젝트를 대상으로 함)
+     */
+    @Override
+    public List<FeedbackDTO> findAllFeedbacks(BaseParam baseParam) {
+
+        try {
+            String memberId = baseParam.getMemberId(); // 사용자 아이디 가져오기
+            return feedbackDAO.findAllByMemberId(memberId); // 피드백 목록 조회
+        }  catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/vo/FeedbackVO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/vo/FeedbackVO.java
@@ -0,0 +1,41 @@
+package kr.co.takensoft.ai.system.feedback.vo;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author 박현정
+ * @since 2025.07.10
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.10  |    박현정     | 최초 등록
+ *
+ *
+ * 피드백 관련 VO
+ */
+@Getter
+@NoArgsConstructor
+public class FeedbackVO {
+
+    private String feedbackId; // 피드백 아이디
+    private String projectGroupId; // 프로젝트 그룹 아이디
+    private String projectName; // 프로젝트 이름
+    private String memberId; // 피드백을 작성한 사용자 아이디
+    private String memberName; // 피드백 작성자 이름
+    private String chatRoomId; // 채팅방 아이디
+    private String feedbackContent; // 피드백 내용
+    private String isChecked; // 피드백 확인 여부 ( N: 확인 안함, Y: 확인함)
+    private String useAt; // 사용 여부 (N : 사용 안함, Y : 사용)
+    private String createdAt; // 생성일자
+    private String updatedAt; // 수정일자
+
+    // 피드백 생성용 생성자
+    public FeedbackVO(String feedbackId, String projectGroupId, String memberId, String feedbackContent) {
+        this.feedbackId = feedbackId;
+        this.projectGroupId = projectGroupId;
+        this.memberId = memberId;
+        this.feedbackContent = feedbackContent;
+        this.isChecked = "N";
+        this.useAt = "Y";
+    }
+}
 
src/main/java/kr/co/takensoft/ai/system/feedback/web/FeedbackController.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/feedback/web/FeedbackController.java
@@ -0,0 +1,71 @@
+package kr.co.takensoft.ai.system.feedback.web;
+
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import kr.co.takensoft.ai.system.feedback.dto.InsertFeedbackDTO;
+import kr.co.takensoft.ai.system.feedback.service.FeedbackService;
+import kr.co.takensoft.ai.system.project.dto.InsertProjectDTO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+
+/**
+ * @author : 박현정
+ * @since  : 2025.07.16
+ * @modification
+ *      since   |    author    | description
+ *  2025.07.16  |     박현정    | 최초 등록
+ *
+ * 피드백 관련 Controller
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api")
+public class FeedbackController {
+
+    private final FeedbackService feedbackService;
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param request - 생성할 피드백 정보
+     * @return ResponseEntity - 피드백 등록 결과를 포함하는 응답
+     *
+     * 피드백 등록
+     */
+    @PostMapping("/project/{projectGroupId}/feedback/saveFeedback.json")
+    public ResponseEntity<?> saveFeedback(@PathVariable String projectGroupId, @RequestBody InsertFeedbackDTO request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", feedbackService.saveFeedback(projectGroupId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param feedbackId - 피드백 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 피드백 확인 결과를 포함하는 응답
+     *
+     * 피드백 확인
+     */
+    @PostMapping("/feedback/{feedbackId}/checkFeedback.json")
+    public ResponseEntity<?> checkFeedback(@PathVariable String feedbackId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", feedbackService.checkFeedback(feedbackId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 피드백 목록 조회 결과를 포함하는 응답
+     *
+     * 피드백 목록 조회
+     */
+    @PostMapping("/feedback/findAllFeedbacks.json")
+    public ResponseEntity<?> findAllFeedbacks(@RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", feedbackService.findAllFeedbacks(request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+}
 
src/main/java/kr/co/takensoft/ai/system/projectLog/dao/ProjectLogDAO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/dao/ProjectLogDAO.java
@@ -0,0 +1,26 @@
+package kr.co.takensoft.ai.system.projectLog.dao;
+
+import kr.co.takensoft.ai.system.projectComment.vo.ProjectCommentVO;
+import kr.co.takensoft.ai.system.projectLog.vo.ProjectLogVO;
+import org.egovframe.rte.psl.dataaccess.mapper.Mapper;
+
+/**
+ * @author 박현정
+ * @since 2025.07.10
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.10  |    박현정     | 최초 등록
+ *
+ * 프로젝트 활동 로그 관련 DAO
+ */
+@Mapper("projectLogDAO")
+public interface ProjectLogDAO {
+
+    /**
+     * @param projectLogVO - 프로젝트 활동 로그 정보
+     * @return int - 프로젝트 활동 로그 등록 결과
+     *
+     * 프로젝트 활동 로그 등록
+     */
+    int saveProjectLog(ProjectLogVO projectLogVO);
+}
 
src/main/java/kr/co/takensoft/ai/system/projectLog/service/ProjectLogService.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/service/ProjectLogService.java
@@ -0,0 +1,4 @@
+package kr.co.takensoft.ai.system.projectLog.service;
+
+public interface ProjectLogService {
+}
 
src/main/java/kr/co/takensoft/ai/system/projectLog/service/impl/ProjectLogServiceImpl.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/service/impl/ProjectLogServiceImpl.java
@@ -0,0 +1,4 @@
+package kr.co.takensoft.ai.system.projectLog.service.impl;
+
+public class ProjectLogServiceImpl {
+}
 
src/main/java/kr/co/takensoft/ai/system/projectLog/vo/ProjectLogVO.java (added)
+++ src/main/java/kr/co/takensoft/ai/system/projectLog/vo/ProjectLogVO.java
@@ -0,0 +1,34 @@
+package kr.co.takensoft.ai.system.projectLog.vo;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author 박현정
+ * @since 2025.07.10
+ * @modification
+ *     since    |    author    | description
+ *  2025.07.10  |    박현정     | 최초 등록
+ *
+ *
+ * 프로젝트 로그 관련 VO
+ */
+@Getter
+@NoArgsConstructor
+public class ProjectLogVO {
+
+    private String projectLogId; // 프로젝트 로그 아이디
+    private String projectGroupId; // 프로젝트 그룹 아이디
+    private String actionType; // 로그 내용(E : 수정, S : 공유)
+    private String useAt; // 사용 여부 (N : 사용 안함, Y : 사용)
+    private String createdAt; // 생성일자
+    private String updatedAt; // 수정일자
+
+    // 프로젝트 로그 생성용 생성자
+    public ProjectLogVO(String projectLogId, String projectGroupId, String actionType) {
+        this.projectLogId = projectLogId;
+        this.projectGroupId = projectGroupId;
+        this.actionType = actionType;
+        this.useAt = "Y";
+    }
+}
 
src/main/resources/mybatis/mapper/chatMsg/chatMsg-SQL.xml (added)
+++ src/main/resources/mybatis/mapper/chatMsg/chatMsg-SQL.xml
@@ -0,0 +1,69 @@
+<?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.chatMsg.dao.ChatMsgDAO">
+
+    <!--
+    작 성 자 : 박현정
+    작 성 일 : 2025.07.17
+    내   용 :  채팅 메시지 resultMap
+    -->
+    <resultMap id="ChatMsgMap" type="ChatMsgVO">
+        <result property="chatMsgId" column="chat_msg_id"/>
+        <result property="chatRoomId" column="chat_room_id"/>
+        <result property="senderId" column="sender_id"/>
+        <result property="senderName" column="member_name"/>
+        <result property="msgContent" column="msg_content"/>
+        <result property="useAt" column="use_at"/>
+        <result property="createdAt" column="created_at"/>
+        <result property="updatedAt" column="updated_at"/>
+    </resultMap>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.16
+        내    용 : 채팅 메시지 등록
+    -->
+    <insert id="saveChatMsg" parameterType="ChatMsgVO">
+        INSERT INTO chat_msg
+            (chat_msg_id,
+            chat_room_id,
+            sender_id,
+            msg_content,
+            use_at,
+            created_at,
+            updated_at
+            )
+        VALUES (
+            #{chatMsgId},
+            #{chatRoomId},
+            #{senderId},
+            #{msgContent},
+            #{useAt},
+            CURRENT_TIMESTAMP,
+            CURRENT_TIMESTAMP
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.17
+        내    용 : 채팅 메시지 전체 목록 조회
+    -->
+    <select id="findAllChatMsgsByChatRoomId" parameterType="String" resultMap="ChatMsgMap">
+        SELECT
+            cm.chat_msg_id,
+            cm.chat_room_id,
+            cm.sender_id,
+            m.member_name,
+            cm.msg_content,
+            cm.use_at,
+            cm.created_at,
+            cm.updated_at
+        FROM chat_msg cm
+        LEFT JOIN member m ON cm.sender_id = m.member_id
+        WHERE chat_room_id = #{chatRoomId}
+    </select>
+
+
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/mybatis/mapper/chatRoom/chatRoom-SQL.xml (added)
+++ src/main/resources/mybatis/mapper/chatRoom/chatRoom-SQL.xml
@@ -0,0 +1,59 @@
+<?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.chatRoom.dao.ChatRoomDAO">
+
+    <!--
+    작 성 자 : 박현정
+    작 성 일 : 2025.07.17
+    내   용 :  채팅방 resultMap
+-->
+    <resultMap id="ChatRoomMap" type="ChatRoomVO">
+        <result property="chatRoomId" column="chat_room_id"/>
+        <result property="projectGroupId" column="project_group_id"/>
+        <result property="feedbackId" column="feedback_id"/>
+        <result property="useAt" column="use_at"/>
+        <result property="createdAt" column="created_at"/>
+        <result property="updatedAt" column="updated_at"/>
+    </resultMap>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.16
+        내    용 : 피드백 채팅방 등록
+    -->
+    <insert id="saveChatRoom" parameterType="ChatRoomVO">
+        INSERT INTO chat_room
+            (chat_room_id,
+            project_group_id,
+            feedback_id,
+            use_at,
+            created_at,
+            updated_at)
+        VALUES (
+            #{chatRoomId},
+            #{projectGroupId},
+            #{feedbackId},
+            #{useAt},
+            CURRENT_TIMESTAMP,
+            CURRENT_TIMESTAMP
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.17
+        내    용 : 채팅방 조회
+    -->
+    <select id="findById" parameterType="String" resultMap="ChatRoomMap">
+        SELECT
+            chat_room_id,
+            project_group_id,
+            feedback_id,
+            use_at,
+            created_at,
+            updated_at
+        FROM chat_room
+        WHERE chat_room_id = #{chatRoomId}
+    </select>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/mybatis/mapper/feedback/feedback-SQL.xml (added)
+++ src/main/resources/mybatis/mapper/feedback/feedback-SQL.xml
@@ -0,0 +1,114 @@
+<?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.feedback.dao.FeedbackDAO">
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.16
+        내   용 :  피드백 resultMap
+    -->
+    <resultMap id="FeedbackMap" type="FeedbackVO">
+        <result property="feedbackId" column="feedback_id"/>
+        <result property="projectGroupId" column="project_group_id"/>
+        <result property="projectName" column="project_name"/>
+        <result property="memberId" column="member_id"/>
+        <result property="memberName" column="member_name"/>
+        <result property="chatRoomId" column="chat_room_id"/>
+        <result property="feedbackContent" column="feedback_content"/>
+        <result property="isChecked" column="is_checked"/>
+        <result property="useAt" column="use_at"/>
+        <result property="createdAt" column="created_at"/>
+        <result property="updatedAt" column="updated_at"/>
+    </resultMap>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.16
+        내    용 : 피드백 조회
+    -->
+    <select id="findById" parameterType="String" resultMap="FeedbackMap">
+        SELECT
+            f.feedback_id,
+            f.project_group_id,
+            p.project_name,
+            f.member_id,
+            m.member_name,
+            cr.chat_room_id,
+            f.feedback_content,
+            f.is_checked,
+            f.use_at,
+            TO_CHAR(f.created_at, 'YYYY-MM-DD HH24:MI') AS created_at,
+            TO_CHAR(f.updated_at, 'YYYY-MM-DD HH24:MI') AS updated_at
+        FROM feedback f
+        LEFT JOIN project p ON f.project_group_id = p.project_group_id AND p.is_main = 'Y'
+        LEFT JOIN member m ON f.member_id = m.member_id
+        LEFT JOIN chat_room cr ON f.feedback_id = cr.feedback_id
+        WHERE f.feedback_id = #{feedbackId}
+        AND f.use_at = 'Y'
+    </select>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.16
+        내    용 : 피드백 등록
+    -->
+    <insert id="saveFeedback" parameterType="FeedbackVO">
+        INSERT INTO feedback
+            (feedback_id,
+            project_group_id,
+            member_id,
+            feedback_content,
+            is_checked,
+            use_at,
+            created_at,
+            updated_at
+            )
+        VALUES (
+            #{feedbackId},
+            #{projectGroupId},
+            #{memberId},
+            #{feedbackContent},
+            #{isChecked},
+            #{useAt},
+            CURRENT_TIMESTAMP,
+            CURRENT_TIMESTAMP
+        )
+    </insert>
+
+    <!--
+    작 성 자 : 박현정
+    작 성 일 : 2025.07.16
+    내    용 : 피드백 목록 조회 (사용자 아이디로 검색)
+    -->
+    <select id="findAllByMemberId" resultMap="FeedbackMap" parameterType="String">
+        SELECT
+            f.feedback_id,
+            f.project_group_id,
+            p.project_name,
+            f.member_id,
+            m.member_name,
+            cr.chat_room_id,
+            f.feedback_content,
+            f.is_checked,
+            f.use_at,
+            f.created_at,
+            f.updated_at
+        FROM feedback f
+        LEFT JOIN project p ON f.project_group_id = p.project_group_id AND p.is_main = 'Y'
+        LEFT JOIN member m ON f.member_id = m.member_id
+        LEFT JOIN chat_room cr ON f.feedback_id = cr.feedback_id
+        WHERE f.member_id = #{member_id}
+        AND f.use_at = 'Y'
+    </select>
+
+    <update id="setFeedbackCheck" parameterType="String">
+        UPDATE feedback
+        <set>
+            is_checked = 'Y',
+            updated_at = CURRENT_TIMESTAMP
+        </set>
+        WHERE feedback_id = #{feedbackId}
+        AND use_at = 'Y'
+    </update>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
 
src/main/resources/mybatis/mapper/projectLog/projectLog-SQL.xml (added)
+++ src/main/resources/mybatis/mapper/projectLog/projectLog-SQL.xml
@@ -0,0 +1,36 @@
+<?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.10
+        내    용 : 프로젝트 로그 등록
+    -->
+    <insert id="saveProjectLog" parameterType="projectLogVO">
+        INSERT INTO project_log
+            (project_log_id,
+            project_group_id,
+            action_type,
+            use_at,
+            created_at,
+            updated_at)
+        VALUES (
+            #{projectLogId},
+            #{projectGroupId},
+            #{actionType},
+            #{useAt},
+            CURRENT_TIMESTAMP,
+            CURRENT_TIMESTAMP
+        )
+    </insert>
+
+    <!--
+        작 성 자 : 박현정
+        작 성 일 : 2025.07.11
+        내    용 : 활성(사용중) 데이터만 조회하도록 필터링
+    -->
+    <sql id="activeOnly">
+        use_at = 'Y'
+    </sql>
+
+</mapper>(파일 끝에 줄바꿈 문자 없음)
Add a comment
List