-
Notifications
You must be signed in to change notification settings - Fork 1
Feat/#14 [Folder] 폴더 도메인 추가 및 CRUD 구현 #15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
fae5896
7c0b3ea
46257d3
e5143fd
0b86364
bd6d33e
65970b2
ad1471d
149b790
3d126d2
b12de2c
0fc0b6a
8329ae8
f79a890
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -13,6 +13,7 @@ public class BookmarkDto { | |||||
| private int member_memberId; | ||||||
| private int website_websiteId; | ||||||
| private int board_boardId; | ||||||
| private Long folder_folderId; | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial 필드 이름을 Java 명명 규칙에 맞게 수정하세요.
또한 🔎 제안하는 수정 사항- private Long folder_folderId;
+ private Long folderId;📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||
| private String name; | ||||||
| private String description; | ||||||
| private String url; | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| package com.web.SearchWeb.bookmark.dto.request; | ||
|
|
||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.Getter; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| @Getter | ||
| @NoArgsConstructor | ||
| @AllArgsConstructor | ||
| @Builder | ||
| public class BookmarkSearchRequestDto { | ||
| private int memberId; | ||
| private String tag; | ||
| private String sort; | ||
| private String query; | ||
| private Long folderId; | ||
| } | ||
|
Comment on lines
+12
to
+18
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial ID 타입 일관성을 검토하세요.
향후 유지보수를 위해 ID 타입 전략(primitive vs wrapper, int vs Long)을 프로젝트 전체적으로 일관되게 가져가는 것을 권장합니다. 🤖 Prompt for AI Agents |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,117 @@ | ||
| package com.web.SearchWeb.folder.controller; | ||
|
|
||
| import com.web.SearchWeb.aop.OwnerCheck; | ||
| import com.web.SearchWeb.folder.dto.request.FolderCreateRequestDto; | ||
| import com.web.SearchWeb.folder.dto.request.FolderUpdateRequestDto; | ||
| import com.web.SearchWeb.folder.dto.response.FolderResponseDto; | ||
| import com.web.SearchWeb.folder.service.FolderService; | ||
| import org.springframework.beans.factory.annotation.Autowired; | ||
| import org.springframework.http.ResponseEntity; | ||
| import org.springframework.stereotype.Controller; | ||
| import org.springframework.web.bind.annotation.*; | ||
|
|
||
| import java.util.List; | ||
|
|
||
|
|
||
| /** | ||
| * 코드 작성자: | ||
| * - 서진영(jin2304) | ||
| * | ||
| * 코드 설명: | ||
| * - 사용자의 폴더 관리 API (CRUD + 태그 조회). | ||
| * - 모든 요청은 OwnerCheck AOP를 통해 권한을 검증. | ||
| * | ||
| * 코드 주요 기능: | ||
| * - 폴더 생성 | ||
| * - 폴더 단일 조회 | ||
| * - 폴더 목록 조회 | ||
| * - 폴더 수정 | ||
| * - 폴더 삭제 | ||
| * - 폴더 태그 목록 조회 | ||
| * | ||
| * 코드 작성일: | ||
| * - 2025.12.31 ~ 2026.01.02 | ||
| */ | ||
| @Controller | ||
| public class FolderController { | ||
|
|
||
| private final FolderService folderService; | ||
|
|
||
| @Autowired | ||
| public FolderController(FolderService folderService) { | ||
| this.folderService = folderService; | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| * 폴더 생성 | ||
| */ | ||
| @PostMapping("/myPage/{memberId}/folder") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<FolderResponseDto> insertFolder(@PathVariable final int memberId, | ||
| @RequestBody FolderCreateRequestDto folderCreateRequestDto) { | ||
| FolderResponseDto folder = folderService.insertFolder(memberId, folderCreateRequestDto); | ||
| return ResponseEntity.ok(folder); | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| * 폴더 단일 조회 | ||
| */ | ||
| @GetMapping("/myPage/{memberId}/folder/{folderId}") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<FolderResponseDto> getFolder(@PathVariable final int memberId, | ||
| @PathVariable final int folderId) { | ||
| FolderResponseDto folder = folderService.selectFolder(memberId, folderId); | ||
| return ResponseEntity.ok(folder); | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| * 폴더 목록 조회 | ||
| */ | ||
| @GetMapping("/myPage/{memberId}/folders") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<List<FolderResponseDto>> getFolders(@PathVariable final int memberId, | ||
| @RequestParam(required = false, defaultValue = "All") String tag, | ||
| @RequestParam(required = false, defaultValue = "Newest") String sort) { | ||
| List<FolderResponseDto> folders = folderService.selectFolderList(memberId, tag, sort); | ||
| return ResponseEntity.ok(folders); | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| * 폴더 수정 | ||
| */ | ||
| @PutMapping("/myPage/{memberId}/folder/{folderId}") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<Integer> updateFolder(@PathVariable final int memberId, | ||
| @PathVariable final int folderId, | ||
| @RequestBody FolderUpdateRequestDto folderUpdateRequestDto) { | ||
| int result = folderService.updateFolder(memberId, folderId, folderUpdateRequestDto); | ||
| return ResponseEntity.ok(result); | ||
| } | ||
|
Comment on lines
+86
to
+93
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial
🔎 제안된 수정 public ResponseEntity<Integer> updateFolder(@PathVariable final int memberId,
@PathVariable final int folderId,
- @RequestBody FolderUpdateRequestDto folderUpdateRequestDto) {
+ @RequestBody @Valid FolderUpdateRequestDto folderUpdateRequestDto) {🤖 Prompt for AI Agents |
||
|
|
||
|
|
||
| /** | ||
| * 폴더 삭제 | ||
| */ | ||
| @DeleteMapping("/myPage/{memberId}/folder/{folderId}") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<Integer> deleteFolder(@PathVariable final int memberId, | ||
| @PathVariable final int folderId) { | ||
| int result = folderService.deleteFolder(memberId, folderId); | ||
| return ResponseEntity.ok(result); | ||
| } | ||
|
|
||
|
|
||
| /** | ||
| * 폴더 태그 목록 조회 | ||
| */ | ||
| @GetMapping("/myPage/{memberId}/folderTags") | ||
| @OwnerCheck(idParam = "memberId", service = "memberService") | ||
| public ResponseEntity<List<String>> getFolderTags(@PathVariable final int memberId) { | ||
| List<String> tags = folderService.selectFolderTags(memberId); | ||
| return ResponseEntity.ok(tags); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| package com.web.SearchWeb.folder.dao; | ||
|
|
||
| import com.web.SearchWeb.folder.domain.Folder; | ||
| import com.web.SearchWeb.folder.dto.request.FolderSearchRequestDto; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public interface FolderDao { | ||
| // 폴더 생성 | ||
| int insertFolder(Folder folder); | ||
| // 폴더 단일 조회 | ||
| Folder selectFolder(int memberId, int folderId); | ||
| // 폴더 목록 조회 | ||
| List<Folder> selectFolderList(FolderSearchRequestDto searchRequest); | ||
| // 폴더 수정 | ||
| int updateFolder(Folder folder); | ||
| // 폴더 삭제 | ||
| int deleteFolder(int memberId, int folderId); | ||
| // 폴더 태그 목록 조회 | ||
| List<String> selectFolderTags(int memberId); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BookmarkDto와 타입 불일치를 수정하세요.
Bookmark.folder_folderId는int타입이지만,BookmarkDto.folder_folderId는Long타입입니다. 이 타입 불일치는 도메인-DTO 간 매핑 시 문제를 발생시킬 수 있습니다.또한 primitive
int는 null 값을 가질 수 없어 폴더가 할당되지 않은 상태를 표현하기 어렵습니다.Integer타입 사용을 권장합니다.필드명도 Java 명명 규칙에 맞게
folderId로 변경하는 것을 권장합니다.🔎 제안하는 수정 사항
📝 Committable suggestion
🤖 Prompt for AI Agents