박현정 박현정 07-22
250722 박현정 프로젝트 생성시 이미지 파일 요청
@151592c056b6dc6f85e7f2b6a269960dc12a48dd
src/main/java/kr/co/takensoft/ai/system/common/config/SecurityConfig.java
--- src/main/java/kr/co/takensoft/ai/system/common/config/SecurityConfig.java
+++ src/main/java/kr/co/takensoft/ai/system/common/config/SecurityConfig.java
@@ -26,8 +26,8 @@
         http
                 .csrf(csrf -> csrf.disable())  // CSRF 비활성화
                 .authorizeHttpRequests(auth -> auth
-                        .requestMatchers("/api/auth/**").permitAll()  // 로그인, 회원가입 관련 로직 허용
-                        //.requestMatchers("/**").permitAll()  // 테스트 중이라 경로 전부 허용
+//                        .requestMatchers("/api/auth/**").permitAll()  // 로그인, 회원가입 관련 로직 허용
+                        .requestMatchers("/**").permitAll()  // 테스트 중이라 경로 전부 허용
                         .anyRequest().authenticated()  // 나머지 요청은 인증 필요
                 )
                 .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
src/main/java/kr/co/takensoft/ai/system/common/idgen/context/ContextIdgen.java
--- src/main/java/kr/co/takensoft/ai/system/common/idgen/context/ContextIdgen.java
+++ src/main/java/kr/co/takensoft/ai/system/common/idgen/context/ContextIdgen.java
@@ -40,14 +40,25 @@
         return idgenServiceImpl;
     }
 
-    // 피드백 채팅 정보
-    @Bean(name = "feedbackChatIdgn")
-    public IdgenService feedbackChat() {
+    // 피드백 채팅방 정보
+    @Bean(name = "chatRoomIdgn")
+    public IdgenService chatRoom() {
         IdgenService idgenServiceImpl = new IdgenService();
         idgenServiceImpl.setCipers(15);
         idgenServiceImpl.setFillChar('0');
-        idgenServiceImpl.setPrefix("FBCH_");
-        idgenServiceImpl.setTblNm("FBCH");
+        idgenServiceImpl.setPrefix("CHRM_");
+        idgenServiceImpl.setTblNm("CHRM");
+        return idgenServiceImpl;
+    }
+
+    // 채팅 메시지 정보
+    @Bean(name = "chatMsgIdgn")
+    public IdgenService chatMsg() {
+        IdgenService idgenServiceImpl = new IdgenService();
+        idgenServiceImpl.setCipers(15);
+        idgenServiceImpl.setFillChar('0');
+        idgenServiceImpl.setPrefix("CHMG_");
+        idgenServiceImpl.setTblNm("CHMG");
         return idgenServiceImpl;
     }
 
src/main/java/kr/co/takensoft/ai/system/project/dao/ProjectDAO.java
--- src/main/java/kr/co/takensoft/ai/system/project/dao/ProjectDAO.java
+++ src/main/java/kr/co/takensoft/ai/system/project/dao/ProjectDAO.java
@@ -28,12 +28,12 @@
     int saveProject(ProjectVO projectVO);
 
     /**
-     * @param memberId - 사용자 아이디
-     * @return List<ProjectVO> - 사용자가 참여하는 프로젝트 목록
+     * @param searchReqDTO - 프로젝트 목록 검색 조건
+     * @return List<ProjectVO> - 프로젝트 목록 정보
      *
      * 프로젝트 목록 조회
      */
-    List<ProjectDTO> findProjectsByMemberId(String memberId);
+    List<ProjectVO> findAllProjects(ProjectSearchReqDTO searchReqDTO);
 
     /**
      * @param projectId - 프로젝트 아이디
@@ -108,12 +108,4 @@
      * 그룹 내에서 기준 프로젝트 이후에 생성된 프로젝트 모두 삭제 (use_at = 'N')
      */
     int deactivateProjectsCreatedAfter(String projectGroupId, String projectId);
-
-    /**
-     * @param searchReqDTO - 프로젝트 목록 검색 조건
-     * @return List<ProjectVO> - 프로젝트 목록 정보
-     *
-     * 프로젝트 목록 조회
-     */
-    List<ProjectVO> findAllProjects(ProjectSearchReqDTO searchReqDTO);
 }
src/main/java/kr/co/takensoft/ai/system/project/dto/InsertProjectDTO.java
--- src/main/java/kr/co/takensoft/ai/system/project/dto/InsertProjectDTO.java
+++ src/main/java/kr/co/takensoft/ai/system/project/dto/InsertProjectDTO.java
@@ -1,8 +1,11 @@
 package kr.co.takensoft.ai.system.project.dto;
 
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @author 박현정
@@ -16,11 +19,16 @@
 @Setter
 @Getter
 @NoArgsConstructor
-public class InsertProjectDTO {
+public class InsertProjectDTO extends BaseParam {
 
-    private String imageFileName; // 프로젝트 이미지 파일 이름
-    private String imageFileUrl; // 프로젝트 이미지 파일 경로
+    private MultipartFile imageFile; // 프로젝트 이미지 파일
     private String summary; // 프로젝트 주석 요약
     private String comment; // 프로젝트 주석 내용
 
+    public InsertProjectDTO(String memberId, MultipartFile imageFile, String summary, String comment) {
+        this.setMemberId(memberId);
+        this.imageFile = imageFile;
+        this.summary = summary;
+        this.comment = comment;
+    }
 }
src/main/java/kr/co/takensoft/ai/system/project/dto/ProjectSearchReqDTO.java
--- src/main/java/kr/co/takensoft/ai/system/project/dto/ProjectSearchReqDTO.java
+++ src/main/java/kr/co/takensoft/ai/system/project/dto/ProjectSearchReqDTO.java
@@ -1,5 +1,6 @@
 package kr.co.takensoft.ai.system.project.dto;
 
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -16,9 +17,8 @@
 @Setter
 @Getter
 @NoArgsConstructor
-public class ProjectSearchReqDTO {
+public class ProjectSearchReqDTO extends BaseParam {
 
-    private String memberId; // 사용자 아이디
     private String projectGroupId; // 프로젝트 그룹 아이디
     private String projectName; // 프로젝트 이름
     private String isMain; // 대표 프로젝트 여부('N' : 대표 아님, 'Y' : 대표)
src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectDTO.java
--- src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectDTO.java
+++ src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectDTO.java
@@ -1,8 +1,10 @@
 package kr.co.takensoft.ai.system.project.dto;
 
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @author 박현정
@@ -16,10 +18,11 @@
 @Setter
 @Getter
 @NoArgsConstructor
-public class UpdateProjectDTO {
+public class UpdateProjectDTO extends BaseParam {
 
-    private String imageFileName; // 프로젝트 이미지 파일 이름
-    private String imageFileUrl; // 프로젝트 이미지 파일 경로
+//    private String imageFileName; // 프로젝트 이미지 파일 이름
+//    private String imageFileUrl; // 프로젝트 이미지 파일 경로
+    private MultipartFile imageFile; // 프로젝트 이미지 파일
     private String summary; // 프로젝트 주석 요약
     private String comment; // 프로젝트 주석 내용
 }
src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectNameDTO.java
--- src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectNameDTO.java
+++ src/main/java/kr/co/takensoft/ai/system/project/dto/UpdateProjectNameDTO.java
@@ -1,5 +1,6 @@
 package kr.co.takensoft.ai.system.project.dto;
 
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -16,6 +17,6 @@
 @Setter
 @Getter
 @NoArgsConstructor
-public class UpdateProjectNameDTO {
+public class UpdateProjectNameDTO extends BaseParam {
     private String projectName;
 }
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,5 +1,6 @@
 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 org.springframework.transaction.annotation.Transactional;
@@ -20,14 +21,13 @@
 public interface ProjectService {
 
     /**
-     * @param memberId - 사용자 아이디
-     * @param projectDTO - 생성할 프로젝트 정보
+     * @param request - 생성할 프로젝트 정보
      * @return 등록 성공 여부
      *
      * 프로젝트 등록
      */
     @Transactional
-    public int saveProject(String memberId, InsertProjectDTO projectDTO);
+    int saveProject(InsertProjectDTO request);
 
     /**
      * @param memberId - 사용자 아이디
@@ -35,7 +35,7 @@
      *
      * 프로젝트 이름 자동 생성
      */
-    public String generateProjectNameForMember(String memberId);
+    String generateProjectNameForMember(String memberId);
 
     /**
      * @param index - 숫자
@@ -43,91 +43,72 @@
      *
      * 숫자를 알파벳으로 변경(0 -> 'A', 1 -> 'B', ... 25 -> 'Z', 26 -> 'AA', ...)
      */
-    public String numberToAlphabet(int index);
+    String numberToAlphabet(int index);
 
     /**
-     * @param memberId - 사용자 아이디
-     * @return 프로젝트 리스트
+     * @param request - 프로젝트 목록 검색 조건
+     * @return HashMap<String, Object> - 프로젝트 목록 정보를 담은 객체
      *
-     * 사용자가 참여한 프로젝트 목록 조회
+     * 프로젝트 목록 조회
      */
-    public List<ProjectDTO> findProjectsByMemberId(String memberId);
+    HashMap<String, Object> findAllProjects(ProjectSearchReqDTO request);
 
     /**
-     * @param memberId - 사용자 아이디
-     * @return 사용자가 생성한 프로젝트 개수
-     *
-     * 사용자가 생성한 프로젝트 개수 조회
-     */
-    public int countCreatedByMember(String memberId);
-
-    /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 수정 프로젝트 아이디
-     * @param projectDTO - 수정 프로젝트 정보를 담은 DTO 객체
+     * @param request - 수정 프로젝트 정보를 담은 DTO 객체
      * @return 수정 성공 여부
      *
      * 프로젝트 정보 수정
      */
     @Transactional
-    public int updateProject(String memberId, String projectId, UpdateProjectDTO projectDTO);
+    int updateProject(String projectId, UpdateProjectDTO request);
 
     /**
-     * @param memberId - 사용자 아이디
-     * @param projectId - 복제할 프로젝트 아이디
+     * @param currentProjectId - 복제할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 복제 성공 여부
      *
      * 프로젝트 복제
      */
     @Transactional
-    public int duplicateProject(String memberId, String projectId);
+    int duplicateProject(String currentProjectId, BaseParam request);
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 프로젝트 아이디
-     * @param projectDTO - 이름 변경 정보를 담은 DTO 객체
+     * @param request - 이름 변경 정보를 담은 DTO 객체
      * @return 이름 변경 성공 여부
      *
      * 프로젝트 이름 변경
      */
     @Transactional
-    public int renameProject(String memberId, String projectId, UpdateProjectNameDTO projectDTO);
+    int renameProject(String projectId, UpdateProjectNameDTO request);
 
     /**
-     * @param memberId - 사용자 아이디
-     * @param projectId - 프로젝트 아이디
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 프로젝트 삭제 성공 여부
      *
      * 프로젝트 삭제 (use_at = 'N')
      */
     @Transactional
-    public int deleteProject(String memberId, String projectId);
+    int deleteProject(String projectGroupId, BaseParam request);
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 복원할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 복원 성공 여부
      *
      * 이전 프로젝트 복원
      */
     @Transactional
-    public int restoreProject(String memberId, String projectId);
+    int restoreProject(String projectId, BaseParam request);
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 복원할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return HashMap<String, Object> - 프로젝트 상세 정보를 담은 객체
      *
      * 프로젝트 상세 조회
      */
-    public HashMap<String, Object> findProject(String memberId, String projectId);
-
-    /**
-     * @param memberId - 사용자 아이디
-     * @param searchReqDTO - 프로젝트 목록 검색 조건
-     * @return HashMap<String, Object> - 프로젝트 목록 정보를 담은 객체
-     *
-     * 프로젝트 목록 조회
-     */
-    public HashMap<String, Object> findAllProjects(String memberId, ProjectSearchReqDTO searchReqDTO);
+    HashMap<String, Object> findProject(String projectId, 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
@@ -1,5 +1,6 @@
 package kr.co.takensoft.ai.system.project.service.impl;
 
+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.project.dao.ProjectDAO;
 import kr.co.takensoft.ai.system.project.dto.*;
@@ -46,22 +47,26 @@
     //private final ProjectLogService projectLogService;
 
     /**
-     * @param memberId - 사용자 아이디
-     * @param projectDTO - 생성할 프로젝트 정보
+     * @param request - 생성할 프로젝트 정보
      * @return 등록 성공 여부
      *
      * 프로젝트 등록
      */
     @Override
-    public int saveProject(String memberId, InsertProjectDTO projectDTO) {
+    public int saveProject(InsertProjectDTO request) {
 
         try {
+            System.out.println("프로젝트 서비스 들어옴");
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             String projectId = projectIdgn.getNextStringId(); // 프로젝트 구분 아이디 생성
             String projectGroupId = projectGroupService.saveProjectGroup(); // 프로젝트 그룹 객체 아이디 가져오기
             String isOwner = "Y"; // 프로젝트 대표자 여부 'Y'
+
             projectMemberService.saveProjectMember(projectGroupId, memberId, isOwner); // 프로젝트 참여자 객체 생성
-            projectImageService.saveProjectImage(projectId, projectDTO.getImageFileName(), projectDTO.getImageFileUrl()); // 프로젝트 이미지 객체 생성
-            projectCommentService.saveProjectComment(memberId, projectId, projectDTO.getSummary(), projectDTO.getComment()); // 프로젝트 주석 객체 생성
+            System.out.println("이미지 "+ request.getImageFile().getOriginalFilename());
+            projectImageService.saveProjectImage(projectId, request.getImageFile()); // 프로젝트 이미지 객체 생성
+            projectCommentService.saveProjectComment(memberId, projectId, request.getSummary(), request.getComment()); // 프로젝트 주석 객체 생성
+
             String projectName = generateProjectNameForMember(memberId); // 프로젝트 이름 생성
             ProjectVO projectVO = new ProjectVO(projectId, projectGroupId, projectName); // 프로젝트 정보 등록
             return projectDAO.saveProject(projectVO);
@@ -80,7 +85,7 @@
     @Override
     public String generateProjectNameForMember(String memberId) {
 
-        int memberProjectCount = countCreatedByMember(memberId); // 사용자가 생성한 프로젝트 개수
+        int memberProjectCount = projectDAO.countCreatedByMemberId(memberId); // 사용자가 생성한 프로젝트 개수
         return "프로젝트 " + numberToAlphabet(memberProjectCount);
     }
 
@@ -107,39 +112,39 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
-     * @return 프로젝트 리스트
+     * @param request - 프로젝트 목록 검색 조건
+     * @return HashMap<String, Object> - 프로젝트 목록 정보를 담은 객체
      *
-     * 사용자가 참여한 프로젝트 목록 조회
+     * 프로젝트 목록 조회
      */
     @Override
-    public List<ProjectDTO> findProjectsByMemberId(String memberId) {
-        return projectDAO.findProjectsByMemberId(memberId);
+    public HashMap<String, Object> findAllProjects(ProjectSearchReqDTO request) {
+
+        try {
+            List<ProjectDTO> projectDTOS = projectDAO.findAllProjects(request)
+                    .stream().map(ProjectDTO::from).collect(Collectors.toList()); // 프로젝트 목록 조회
+            HashMap<String, Object> result = new HashMap<>(); // 응답 결과 담을 객체 생성
+            result.put("projects", projectDTOS); // 프로젝트 목록을 결과에 담기
+            return result;
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
     }
 
     /**
-     * @param memberId - 사용자 아이디
-     * @return 사용자가 생성한 프로젝트 개수
-     *
-     * 사용자가 생성한 프로젝트 개수 조회
-     */
-    @Override
-    public int countCreatedByMember(String memberId) {
-        return projectDAO.countCreatedByMemberId(memberId);
-    }
-
-    /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 수정 프로젝트 아이디
-     * @param projectDTO - 수정 프로젝트 정보를 담은 DTO 객체
+     * @param request - 수정 프로젝트 정보를 담은 DTO 객체
      * @return 수정 성공 여부
      *
      * 프로젝트 정보 수정
      */
     @Override
     @Transactional
-    public int updateProject(String memberId, String projectId, UpdateProjectDTO projectDTO) {
+    public int updateProject(String projectId, UpdateProjectDTO request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             ProjectVO projectVO = projectDAO.findById(projectId)
                     .orElseThrow(() -> new IllegalArgumentException("프로젝트가 존재하지 않습니다.")); // 기존 프로젝트 가져오기
             if(!projectVO.getIsMain().equals("Y")) { // 기존 프로젝트 대표 여부 확인하기
@@ -150,8 +155,8 @@
             projectDAO.unsetProjectMain(projectVO.getProjectGroupId()); // 기존 프로젝트를 대표 프로젝트 해제
 
             String updateProjectId = projectIdgn.getNextStringId(); // 프로젝트 구분 아이디 생성
-            projectImageService.saveProjectImage(updateProjectId, projectDTO.getImageFileName(), projectDTO.getImageFileUrl()); // 프로젝트 이미지 객체 생성
-            projectCommentService.saveProjectComment(memberId, updateProjectId, projectDTO.getSummary(), projectDTO.getComment()); // 프로젝트 주석 객체 생성
+            projectImageService.saveProjectImage(projectId, request.getImageFile()); // 프로젝트 이미지 객체 생성
+            projectCommentService.saveProjectComment(memberId, updateProjectId, request.getSummary(), request.getComment()); // 프로젝트 주석 객체 생성
             String projectName = projectVO.getProjectName(); // 기존 프로젝트 이름 가져오기
             ProjectVO updateProjectVO = new ProjectVO(updateProjectId, projectGroupId, projectName); // 프로젝트 정보 등록(새로운 버전)
             return projectDAO.saveProject(updateProjectVO);
@@ -162,16 +167,17 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
      * @param currentProjectId - 복제할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 복제 성공 여부
      *
      * 프로젝트 복제
      */
     @Override
     @Transactional
-    public int duplicateProject(String memberId, String currentProjectId) {
+    public int duplicateProject(String currentProjectId, BaseParam request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             ProjectVO currentProjectVO = projectDAO.findById(currentProjectId)
                     .orElseThrow(() -> new IllegalArgumentException("프로젝트가 존재하지 않습니다.")); // 기존 프로젝트 가져오기
             String currentProjectGroupId = currentProjectVO.getProjectGroupId(); // 기존 프로젝트 그룹 아이디 가져오기
@@ -181,10 +187,12 @@
             String projectGroupId = projectGroupService.saveProjectGroup(); // 복제 프로젝트 그룹 객체 아이디 가져오기
             String isOwner = "Y"; // 프로젝트 대표자 여부 'Y'
             projectMemberService.saveProjectMember(projectGroupId, memberId, isOwner); // 복제 프로젝트 참여자 객체 생성
+
             ProjectImageVO imageVO = projectImageService.findImage(currentProjectVO.getImageId()); // 기존 프로젝트 이미지 가져오기
             ProjectCommentVO commentVO = projectCommentService.findComment(currentProjectVO.getCommentId()); // 기존 프로젝트 주석 가져오기
-            projectImageService.saveProjectImage(projectId, imageVO.getFileName(), imageVO.getFileUrl()); // 복제 프로젝트 이미지 객체 생성(기존 프로젝트 이미지 복사)
+            projectImageService.copyProjectImage(projectId, imageVO.getFileName(), imageVO.getFileUrl()); // 복제 프로젝트 이미지 객체 생성(기존 프로젝트 이미지 복사)
             projectCommentService.saveProjectComment(memberId, projectId, commentVO.getSummary(), commentVO.getComment()); // 복제 프로젝트 주석 객체 생성(기존 프로젝트 주석 복사)
+
             String projectName = "";
             if(currentProjectVO.getIsMain().equals("Y")){ // 대표 프로젝트를 복제하는 경우 이름 생성
                 projectName = "[복사본] " + currentProjectVO.getProjectName();
@@ -201,22 +209,22 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 프로젝트 아이디
-     * @param projectDTO - 이름 변경 정보를 담은 DTO 객체
+     * @param request - 이름 변경 정보를 담은 DTO 객체
      * @return 이름 변경 성공 여부
      *
      * 프로젝트 이름 변경
      */
     @Override
     @Transactional
-    public int renameProject(String memberId, String projectId, UpdateProjectNameDTO projectDTO) {
+    public int renameProject(String projectId, UpdateProjectNameDTO request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             ProjectVO projectVO = projectDAO.findById(projectId)
                     .orElseThrow(() -> new IllegalArgumentException("프로젝트가 존재하지 않습니다.")); // 프로젝트 가져오기
             String projectGroupId = projectVO.getProjectGroupId(); // 프로젝트 그룹 아이디 가져오기
             projectMemberService.validateProjectMember(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
-            return projectDAO.updateProjectName(projectId, projectDTO.getProjectName()); // 프로젝트 이름 변경
+            return projectDAO.updateProjectName(projectId, request.getProjectName()); // 프로젝트 이름 변경
         }  catch (Exception e) {
             e.printStackTrace();
             return -1;
@@ -224,18 +232,19 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 프로젝트 삭제 성공 여부
      *
      * 프로젝트 삭제 (use_at = 'N')
      */
     @Override
     @Transactional
-    public int deleteProject(String memberId, String projectGroupId) {
+    public int deleteProject(String projectGroupId, BaseParam request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             projectGroupService.validateExistence(projectGroupId);  // 프로젝트 그룹 존재 여부 검증
-            projectMemberService.validateProjectMember(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
+            projectMemberService.validateProjectOwner(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
             projectGroupService.deleteProjectGroup(projectGroupId); // 프로젝트 그룹 삭제(use_at = 'N')
             return projectDAO.deactivateProjectsByGroupId(projectGroupId); // 프로젝트 삭제(use_at = 'N')
         }  catch (Exception e) {
@@ -245,20 +254,22 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 복원할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return 복원 성공 여부
      *
      * 이전 프로젝트 복원
      */
     @Override
     @Transactional
-    public int restoreProject(String memberId, String projectId) {
+    public int restoreProject(String projectId, BaseParam request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             ProjectVO projectVO = projectDAO.findById(projectId)
                     .orElseThrow(() -> new IllegalArgumentException("프로젝트가 존재하지 않습니다.")); // 프로젝트 가져오기
             String projectGroupId = projectVO.getProjectGroupId(); // 프로젝트 그룹 아이디 가져오기
             projectMemberService.validateProjectMember(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
+
             projectDAO.unsetProjectMain(projectGroupId); // 현재 프로젝트 대표 프로젝트 해제
             projectDAO.setProjectMain(projectId); // 복원할 프로젝트를 대표 프로젝트로 설정
             return projectDAO.deactivateProjectsCreatedAfter(projectGroupId, projectId); // 복원할 프로젝트 이후에 생성된 프로젝트 삭제
@@ -269,55 +280,36 @@
     }
 
     /**
-     * @param memberId - 사용자 아이디
      * @param projectId - 복원할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
      * @return HashMap<String, Object> - 프로젝트 상세 정보를 담은 객체
      *
      * 프로젝트 상세 조회
      */
     @Override
-    public HashMap<String, Object> findProject(String memberId, String projectId) {
+    public HashMap<String, Object> findProject(String projectId, BaseParam request) {
         try {
+            String memberId = request.getMemberId(); // 사용자 아이디 가져오기
             HashMap<String, Object> result = new HashMap<>();
             ProjectVO projectVO = projectDAO.findById(projectId)
                     .orElseThrow(() -> new IllegalArgumentException("프로젝트가 존재하지 않습니다.")); // 프로젝트 가져오기
             String projectGroupId = projectVO.getProjectGroupId(); // 프로젝트 그룹 아이디 가져오기
+
             projectMemberService.validateProjectMember(projectGroupId, memberId); // 프로젝트 참여자 존재 여부 검증
             List<ProjectMemberVO> projectMemberVOS = projectMemberService.findProjectMembers(projectGroupId); // 프로젝트 참여자 목록 가져오기
+
             ProjectImageVO imageVO = projectImageService.findImage(projectVO.getImageId()); // 프로젝트 이미지 가져오기
             ProjectCommentVO commentVO = projectCommentService.findComment(projectVO.getCommentId()); // 프로젝트 주석 가져오기
             List<ProjectMemberDTO> projectMemberDTOS = projectMemberVOS.stream()
                     .map(ProjectMemberDTO::from).collect(Collectors.toList()); // 프로젝트 참여자 목록 dto 객체에 담기
+
+            // 응답 결과 생성하기
             result.put("project", ProjectDTO.from(projectVO));
             result.put("projectMember", projectMemberDTOS);
             result.put("projectComment", ProjectCommentDTO.from(commentVO));
             result.put("projectImage", ProjectImageDTO.from(imageVO));
             return result; // 프로젝트 상세 조회 결과 응답
         }  catch (Exception e) {
-            e.printStackTrace();
-            throw e;
-        }
-    }
-
-    /**
-     * @param memberId - 사용자 아이디
-     * @param searchReqDTO - 프로젝트 목록 검색 조건
-     * @return HashMap<String, Object> - 프로젝트 목록 정보를 담은 객체
-     *
-     * 프로젝트 목록 조회
-     */
-    @Override
-    public HashMap<String, Object> findAllProjects(String memberId, ProjectSearchReqDTO searchReqDTO) {
-
-        try {
-            HashMap<String, Object> result = new HashMap<>();
-            searchReqDTO.setMemberId(memberId); // 검색 조건에 사용자 아이디 추가
-            List<ProjectDTO> projectDTOS = projectDAO.findAllProjects(searchReqDTO)
-                    .stream().map(ProjectDTO::from).collect(Collectors.toList()); // 프로젝트 목록 조회
-            result.put("projects", projectDTOS); // 프로젝트 목록을 결과에 담기
-            return result;
-        }
-        catch (Exception e) {
             e.printStackTrace();
             throw e;
         }
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
@@ -1,6 +1,7 @@
 package kr.co.takensoft.ai.system.project.web;
 
 import kr.co.takensoft.ai.system.auth.vo.MemberVO;
+import kr.co.takensoft.ai.system.common.dto.BaseParam;
 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;
@@ -10,17 +11,18 @@
 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;
 
-/*
+/**
  * @author : 박현정
  * @since  : 2025.07.09
  * @modification
  *      since   |    author    | description
  *  2025.07.09  |     박현정    | 최초 등록
  *
- * 사용자 정보 관련 서비스
+ * 프로젝트 관련 Controller
  */
 @RestController
 @RequiredArgsConstructor
@@ -28,130 +30,116 @@
 public class ProjectController {
 
     private final ProjectService projectService;
-    private final String MEMBER_ID = "test";
 
     /**
-     * @param insertProjectDTO - 생성할 프로젝트 정보
+//     * @param request - 생성할 프로젝트 정보
      * @return ResponseEntity - 프로젝트 등록 결과를 포함하는 응답
      *
      * 프로젝트 등록
      */
     @PostMapping("/saveProject.json")
-    public ResponseEntity<?> saveProject(@RequestBody InsertProjectDTO insertProjectDTO) {
+    public ResponseEntity<?> saveProject(
+            @ModelAttribute InsertProjectDTO request) {
         HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.saveProject(memberId, insertProjectDTO));
+        System.out.println("컨트롤러 이미지 파일: " + request.getImageFile().getOriginalFilename());
+        result.put("result", projectService.saveProject(request));
         return new ResponseEntity<>(result, HttpStatus.OK);
     }
 
     /**
-     * @return ResponseEntity - 사용자가 참여한 프로젝트 목록을 포함하는 응답
-     *
-     * 사용자가 참여한 프로젝트 목록 조회
-     */
-    @PostMapping("/findAllByMemberId.json")
-    public ResponseEntity<?> findAllByMemberId() {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.findProjectsByMemberId(memberId));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectId - 수정 프로젝트 아이디
-     * @param updateProjectDTO - 수정 프로젝트 정보
-     * @return ResponseEntity - 프로젝트 정보 수정 처리 결과를 포함하는 응답
-     *
-     * 프로젝트 정보 수정
-     */
-    @PostMapping("/{projectId}/updateProject.json")
-    public ResponseEntity<?> updateCategory(@PathVariable String projectId, @RequestBody UpdateProjectDTO updateProjectDTO) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.updateProject(memberId, projectId, updateProjectDTO));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectId - 복제할 프로젝트 아이디
-     * @return ResponseEntity - 프로젝트 복제 결과를 포함하는 응답
-     *
-     * 프로젝트 복제
-     */
-    @PostMapping("/{projectId}/duplicateProject.json")
-    public ResponseEntity<?> duplicateProject(@PathVariable String projectId) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.duplicateProject(memberId, projectId));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectId - 이름 변경할 프로젝트 아이디
-     * @return ResponseEntity - 프로젝트 이름 수정 결과를 포함하는 응답
-     *
-     * 프로젝트 이름 변경
-     */
-    @PostMapping("/{projectId}/renameProject.json")
-    public ResponseEntity<?> renameProject(@PathVariable String projectId, @RequestBody UpdateProjectNameDTO updateProjectNameDTO) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.renameProject(memberId, projectId, updateProjectNameDTO));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectGroupId - 삭제할 프로젝트 그룹 아이디
-     * @return ResponseEntity - 프로젝트 삭제 결과를 포함하는 응답
-     *
-     * 프로젝트 삭제 (use_at = 'N')
-     */
-    @PostMapping("/{projectGroupId}/deleteProject.json")
-    public ResponseEntity<?> deleteProject(@PathVariable String projectGroupId) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.deleteProject(memberId, projectGroupId));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectId - 복원할 프로젝트 아이디
-     * @return ResponseEntity - 프로젝트 복원 결과를 포함하는 응답
-     *
-     * 프로젝트 이전 버전 복원
-     */
-    @PostMapping("/{projectId}/restoreProject.json")
-    public ResponseEntity<?> restoreProject(@PathVariable String projectId) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.restoreProject(memberId, projectId));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
-     * @param projectId - 프로젝트 아이디
-     * @return ResponseEntity - 프로젝트 상세 조회 정보를 포함하는 응답
-     *
-     * 프로젝트 상세 조회
-     */
-    @PostMapping("/{projectId}/findProject.json")
-    public ResponseEntity<?> findProject(@PathVariable String projectId) {
-        HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.findProject(memberId, projectId));
-        return new ResponseEntity<>(result, HttpStatus.OK);
-    }
-
-    /**
+     * @param request - 프로젝트 검색 조건을 담은 DTO 객체
      * @return ResponseEntity - 프로젝트 목록 정보를 포함하는 응답
      *
      * 프로젝트 목록 조회
      */
     @PostMapping("/findAllProjects.json")
-    public ResponseEntity<?> findAllProjects(@RequestBody ProjectSearchReqDTO projectSearchReqDTO) {
+    public ResponseEntity<?> findAllProjects(@RequestBody ProjectSearchReqDTO request) {
         HashMap<String, Object> result = new HashMap<>();
-        String memberId = MEMBER_ID;
-        result.put("result", projectService.findAllProjects(memberId, projectSearchReqDTO));
+        result.put("result", projectService.findAllProjects(request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectId - 수정 프로젝트 아이디
+     * @param request - 수정 프로젝트 정보
+     * @return ResponseEntity - 프로젝트 정보 수정 처리 결과를 포함하는 응답
+     *
+     * 프로젝트 정보 수정
+     */
+    @PostMapping("/{projectId}/updateProject.json")
+    public ResponseEntity<?> updateCategory(@PathVariable String projectId, @RequestBody UpdateProjectDTO request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.updateProject(projectId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectId - 복제할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 복제 결과를 포함하는 응답
+     *
+     * 프로젝트 복제
+     */
+    @PostMapping("/{projectId}/duplicateProject.json")
+    public ResponseEntity<?> duplicateProject(@PathVariable String projectId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.duplicateProject(projectId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectId - 이름 변경할 프로젝트 아이디
+     * @param request - 변경할 이름을 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 이름 수정 결과를 포함하는 응답
+     *
+     * 프로젝트 이름 변경
+     */
+    @PostMapping("/{projectId}/renameProject.json")
+    public ResponseEntity<?> renameProject(@PathVariable String projectId, @RequestBody UpdateProjectNameDTO request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.renameProject(projectId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectGroupId - 삭제할 프로젝트 그룹 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 삭제 결과를 포함하는 응답
+     *
+     * 프로젝트 삭제 (use_at = 'N')
+     */
+    @PostMapping("/{projectGroupId}/deleteProject.json")
+    public ResponseEntity<?> deleteProject(@PathVariable String projectGroupId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.deleteProject(projectGroupId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectId - 복원할 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 복원 결과를 포함하는 응답
+     *
+     * 프로젝트 이전 버전 복원
+     */
+    @PostMapping("/{projectId}/restoreProject.json")
+    public ResponseEntity<?> restoreProject(@PathVariable String projectId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.restoreProject(projectId, request));
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * @param projectId - 프로젝트 아이디
+     * @param request - 사용자 아이디를 담은 DTO 객체
+     * @return ResponseEntity - 프로젝트 상세 조회 정보를 포함하는 응답
+     *
+     * 프로젝트 상세 조회
+     */
+    @PostMapping("/{projectId}/findProject.json")
+    public ResponseEntity<?> findProject(@PathVariable String projectId, @RequestBody BaseParam request) {
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("result", projectService.findProject(projectId, request));
         return new ResponseEntity<>(result, HttpStatus.OK);
     }
 }
src/main/java/kr/co/takensoft/ai/system/projectImage/service/ProjectImageService.java
--- src/main/java/kr/co/takensoft/ai/system/projectImage/service/ProjectImageService.java
+++ src/main/java/kr/co/takensoft/ai/system/projectImage/service/ProjectImageService.java
@@ -2,6 +2,7 @@
 
 import kr.co.takensoft.ai.system.projectImage.vo.ProjectImageVO;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @author 박현정
@@ -16,14 +17,13 @@
 
     /**
      * @param projectId - 프로젝트 아이디
-     * @param fileName - 이미지 파일 이름
-     * @param fileUrl - 이미지 파일 경로
+     * @param file - 이미지 파일
      * @return 등록 성공 여부
      *
      * 프로젝트 이미지 등록
      */
     @Transactional
-    public int saveProjectImage(String projectId, String fileName, String fileUrl);
+    int saveProjectImage(String projectId, MultipartFile file);
 
     /**
      * @param imageId - 프로젝트 이미지 아이디
@@ -31,5 +31,16 @@
      *
      * 프로젝트 이미지 정보 조회
      */
-    public ProjectImageVO findImage(String imageId);
+    ProjectImageVO findImage(String imageId);
+
+    /**
+     * @param projectId - 프로젝트 아이디
+     * @param fileName - 이미지 파일 이름
+     * @param fileUrl - 이미지 파일 경로
+     * @return 복사 성공 여부
+     *
+     * 프로젝트 이미지 복사
+     */
+    @Transactional
+    int copyProjectImage(String projectId, String fileName, String fileUrl);
 }
src/main/java/kr/co/takensoft/ai/system/projectImage/service/impl/ProjectImageServiceImpl.java
--- src/main/java/kr/co/takensoft/ai/system/projectImage/service/impl/ProjectImageServiceImpl.java
+++ src/main/java/kr/co/takensoft/ai/system/projectImage/service/impl/ProjectImageServiceImpl.java
@@ -9,6 +9,10 @@
 import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.UUID;
 
 /**
  * @author : 박현정
@@ -25,21 +29,46 @@
 
     private final ProjectImageDAO projectImageDAO;
     private final IdgenService projectImageIdgn;
+    private static final String SAVE_DIR = System.getProperty("user.dir") + "/images/"; // 실제 저장 경로 (물리 경로)
+    private static final String ACCESS_URL_PREFIX = "/static/images/"; // 브라우저가 접근할 경로 (URL 경로)
 
     /**
      * @param projectId - 프로젝트 아이디
-     * @param fileName - 이미지 파일 이름
-     * @param fileUrl - 이미지 파일 경로
+     * @param file - 이미지 파일
      * @return 등록 성공 여부
      *
      * 프로젝트 이미지 등록
      */
     @Override
-    public int saveProjectImage(String projectId, String fileName, String fileUrl) {
+    public int saveProjectImage(String projectId, MultipartFile file) {
 
-        String projectImageId = projectImageIdgn.getNextStringId(); // 프로젝트 주석 구분 아이디 생성
-        ProjectImageVO projectImageVO = new ProjectImageVO(projectImageId, projectId, fileName, fileUrl); // 주석 정보 등록
-        return projectImageDAO.saveProjectImage(projectImageVO);
+        if(file.isEmpty()) {
+            System.out.println("파일이 없음");
+            return -1; // 파일 비어있음 오류
+        }
+
+        try {
+            String originalName = file.getOriginalFilename(); // 업로드 한 파일 이름
+            String uuid = UUID.randomUUID().toString(); // UUID 생성
+            String newFileName = uuid + '_' + originalName; // 서버에 저장할 파일명 새성
+
+            File directory = new File(SAVE_DIR); // 서버에 저장할 디렉터리 생성
+            if(!directory.exists()) {
+                directory.mkdir();
+            }
+
+            File dest = new File(SAVE_DIR + newFileName); // 서버에 저장할 파일 경로 지정
+            file.transferTo(dest); // 업로드 한 파일을 서버에 복사
+
+            String projectImageId = projectImageIdgn.getNextStringId(); // 프로젝트 이미지 구분 아이디 생성
+            String imageUrl = ACCESS_URL_PREFIX + newFileName; // 브라우저로 접근할 수 있는 이미지 경로
+            ProjectImageVO projectImageVO = new ProjectImageVO(projectImageId, projectId, originalName, imageUrl); // 이미지 정보 등록
+            System.out.println("이미지 저장 경로: "+ dest.getPath());
+            return projectImageDAO.saveProjectImage(projectImageVO);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
     }
 
     /**
@@ -52,4 +81,21 @@
     public ProjectImageVO findImage(String imageId) {
         return projectImageDAO.findById(imageId);
     }
+
+    /**
+     * @param projectId - 프로젝트 아이디
+     * @param fileName - 이미지 파일 이름
+     * @param fileUrl - 이미지 파일 경로
+     * @return 복사 성공 여부
+     *
+     * 프로젝트 이미지 복사
+     */
+    @Override
+    @Transactional
+    public int copyProjectImage(String projectId, String fileName, String fileUrl){
+
+        String projectImageId = projectImageIdgn.getNextStringId(); // 프로젝트 이미지 구분 아이디 생성
+        ProjectImageVO projectImageVO = new ProjectImageVO(projectImageId, projectId, fileName, fileUrl); // 이미지 정보 등록
+        return projectImageDAO.saveProjectImage(projectImageVO);
+    }
 }
src/main/java/kr/co/takensoft/ai/system/projectMember/dao/ProjectMemberDAO.java
--- src/main/java/kr/co/takensoft/ai/system/projectMember/dao/ProjectMemberDAO.java
+++ src/main/java/kr/co/takensoft/ai/system/projectMember/dao/ProjectMemberDAO.java
@@ -42,4 +42,13 @@
      * 프로젝트 참여자 목록 조회
      */
     List<ProjectMemberVO> findAllByGroupId(String projectGroupId);
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param memberId - 사용자 아이디
+     * @return boolean - 프로젝트 대표자 여부 검증
+     *
+     * 프로젝트 대표자 여부 검증
+     */
+    boolean existsByProjectGroupIdAndMemberIdAndIsOwner(String projectGroupId, String memberId);
 }
src/main/java/kr/co/takensoft/ai/system/projectMember/service/ProjectMemberService.java
--- src/main/java/kr/co/takensoft/ai/system/projectMember/service/ProjectMemberService.java
+++ src/main/java/kr/co/takensoft/ai/system/projectMember/service/ProjectMemberService.java
@@ -40,4 +40,12 @@
      * 프로젝트 참여자 목록 조회
      */
     List<ProjectMemberVO> findProjectMembers(String projectGroupId);
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param memberId - 사용자 아이디
+     *
+     * 프로젝트 대표자 여부 검증
+     */
+    void validateProjectOwner(String projectGroupId, String memberId);
 }
src/main/java/kr/co/takensoft/ai/system/projectMember/service/impl/ProjectMemberServiceImpl.java
--- src/main/java/kr/co/takensoft/ai/system/projectMember/service/impl/ProjectMemberServiceImpl.java
+++ src/main/java/kr/co/takensoft/ai/system/projectMember/service/impl/ProjectMemberServiceImpl.java
@@ -74,4 +74,21 @@
     public List<ProjectMemberVO> findProjectMembers(String projectGroupId) {
         return projectMemberDAO.findAllByGroupId(projectGroupId);
     }
+
+    /**
+     * @param projectGroupId - 프로젝트 그룹 아이디
+     * @param memberId - 사용자 아이디
+     *
+     * 프로젝트 대표자 여부 검증
+     */
+    @Override
+    public void validateProjectOwner(String projectGroupId, String memberId) {
+        if(!projectMemberDAO.existsByProjectGroupIdAndMemberIdAndIsOwner(projectGroupId, memberId)){
+            try {
+                throw new IllegalAccessException("이 프로젝트의 대표자가 아닙니다.");
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
src/main/resources/application.yml
--- src/main/resources/application.yml
+++ src/main/resources/application.yml
@@ -8,6 +8,10 @@
     secret: 58abbb9886f2b0e3af5f13242d27feedf1ecf59a0eca4996716bc1f8e76b5464
     accessTime: 600000      # 10분 600000
     refreshTime: 86400000   # 24시간 86400000
+  servlet:
+    multipart:
+      max-file-size: 50MB
+      max-request-size: 50MB
 
 # front url
 frontUrls: http://localhost:10910/
src/main/resources/mybatis/mapper/project/project-SQL.xml
--- src/main/resources/mybatis/mapper/project/project-SQL.xml
+++ src/main/resources/mybatis/mapper/project/project-SQL.xml
@@ -56,29 +56,6 @@
 
     <!--
         작 성 자 : 박현정
-        작 성 일 : 2025.07.11
-        내    용 : 사용자가 참여하는 모든 프로젝트 조회
-    -->
-    <select id="findProjectsByMemberId" resultMap="ProjectMap" parameterType="String">
-        SELECT
-            p.project_id,
-            p.project_group_id,
-            p.project_name,
-            p.is_main,
-            p.use_at,
-            pm.is_owner,
-            TO_CHAR(p.created_at, 'YYYY-MM-DD HH24:MI') AS created_at,
-            TO_CHAR(p.updated_at, 'YYYY-MM-DD HH24:MI') AS updated_at
-        FROM project_member pm
-        JOIN project p ON pm.project_group_id = p.project_group_id
-        WHERE pm.member_id = #{memberId}
-        AND pm.use_at = 'Y'
-        AND p.use_at = 'Y'
-        AND p.is_main = 'Y'
-    </select>
-
-    <!--
-        작 성 자 : 박현정
         작 성 일 : 2025.07.14
         내    용 : 프로젝트 조회
     -->
@@ -234,9 +211,7 @@
         FROM project p
         JOIN project_member pm ON p.project_group_id = pm.project_group_id
         <where>
-            <if test="memberId != null">
                 pm.member_id = #{memberId}
-            </if>
             <if test="projectGroupId != null">
                 AND p.project_group_id = #{projectGroupId}
             </if>
src/main/resources/mybatis/mapper/projectMember/projectMember-SQL.xml
--- src/main/resources/mybatis/mapper/projectMember/projectMember-SQL.xml
+++ src/main/resources/mybatis/mapper/projectMember/projectMember-SQL.xml
@@ -58,17 +58,36 @@
     작 성 일 : 2025.07.10
     내    용 : 프로젝트 참여자 존재 여부 확인
     -->
-    <select id="existsByProjectGroupIdAndMemberId" resultType="boolean">
+    <select id="existsByProjectGroupIdAndMemberId" parameterType="String" resultType="boolean">
         SELECT EXISTS (
             SELECT 1
             FROM project_member
             WHERE project_group_id = #{projectGroupId}
             AND member_id = #{memberId}
+            AND use_at = 'Y'
         )
     </select>
 
     <!--
     작 성 자 : 박현정
+    작 성 일 : 2025.07.16
+    내    용 : 프로젝트 대표자 여부 확인
+    -->
+    <select id="existsByProjectGroupIdAndMemberIdAndIsOwner" parameterType="String" resultType="boolean">
+        SELECT EXISTS (
+            SELECT 1
+            FROM project_member
+            WHERE project_group_id = #{projectGroupId}
+            AND member_id = #{memberId}
+            AND is_owner = 'Y'
+            AND use_at = 'Y'
+        )
+    </select>
+
+
+
+    <!--
+    작 성 자 : 박현정
     작 성 일 : 2025.07.15
     내    용 : 프로젝트 참여자 조회 (프로젝트 그룹 아이디로 검색)
     -->
Add a comment
List