Skip to content

Commit 3a91912

Browse files
authored
Merge pull request #15 from Searchweb-Dev/feat/#14
Feat/#14 [Folder] 폴더 도메인 추가 및 CRUD 구현
2 parents d5c759c + f79a890 commit 3a91912

23 files changed

+735
-139
lines changed

src/main/java/com/web/SearchWeb/bookmark/controller/BookmarkApiController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public ResponseEntity<Integer> checkBookmark(@PathVariable final int websiteId){
8383
**/
8484
@GetMapping("/{memberId}/bookmarks")
8585
public List<Bookmark> selectBookmarkList(@PathVariable final int memberId){
86-
return bookmarkService.selectBookmarkList(memberId, "Oldest"); //JSON 형태로 객체 리스트 반환
86+
return bookmarkService.selectBookmarkList(memberId, null, "Oldest", null, null); //JSON 형태로 객체 리스트 반환
8787
}
8888

8989

src/main/java/com/web/SearchWeb/bookmark/dao/BookmarkDao.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import com.web.SearchWeb.bookmark.dto.BookmarkCheckDto;
66
import com.web.SearchWeb.bookmark.dto.BookmarkDto;
77
import com.web.SearchWeb.bookmark.domain.BookmarkWebsite;
8+
import com.web.SearchWeb.bookmark.dto.request.BookmarkSearchRequestDto;
89

910
import java.util.List;
10-
import java.util.Map;
1111

1212
public interface BookmarkDao {
1313
//북마크 확인
@@ -16,12 +16,8 @@ public interface BookmarkDao {
1616
int checkBoardBookmark(BoardBookmarkCheckDto checkDto);
1717
//북마크 단일 조회
1818
Bookmark selectBookmark(int memberId, int bookmarkId);
19-
//북마크 목록 조회 (시간)
20-
List<Bookmark> selectBookmarkList(int memberId, String sort);
21-
//북마크 목록 조회 (시간, 태그)
22-
List<Bookmark> selectBookmarkListByTag(Map<String, Object> params);
23-
//북마크 목록 조회 (검색어)
24-
List<Bookmark> selectBookmarkListByQuery(int memberId, String tag, String sort, String query);
19+
//북마크 목록 조회
20+
List<Bookmark> selectBookmarkList(BookmarkSearchRequestDto searchRequest);
2521
//북마크 추가
2622
int insertBookmark(BookmarkDto bookmark);
2723
//북마크 추가 (사용자 직접 추가)
@@ -39,7 +35,7 @@ public interface BookmarkDao {
3935
//북마크-웹사이트 조회
4036
List<BookmarkWebsite> selectBookmarkWebsite(int memberId);
4137
//사용자 태그 목록 조회
42-
List<String> selectTags(int memberId);
38+
List<String> selectTags(int memberId, Long folderId);
4339
//게시글 북마크 여부 확인
4440
int isBookmarked(int boardId, int memberId);
4541
}

src/main/java/com/web/SearchWeb/bookmark/dao/MybatisBookmarkDao.java

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import com.web.SearchWeb.bookmark.dto.BookmarkCheckDto;
66
import com.web.SearchWeb.bookmark.dto.BookmarkDto;
77
import com.web.SearchWeb.bookmark.domain.BookmarkWebsite;
8+
import com.web.SearchWeb.bookmark.dto.request.BookmarkSearchRequestDto;
89
import org.apache.ibatis.session.SqlSession;
910
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.stereotype.Repository;
1112

1213
import java.util.List;
13-
import java.util.Map;
1414

1515
@Repository
1616
public class MybatisBookmarkDao implements BookmarkDao {
@@ -25,29 +25,11 @@ public MybatisBookmarkDao(SqlSession sqlSession) {
2525

2626

2727
/**
28-
* 북마크 목록 조회 (시간)
28+
* 북마크 목록 조회
2929
*/
3030
@Override
31-
public List<Bookmark> selectBookmarkList(int memberId, String sort) {
32-
return mapper.selectBookmarkList(memberId, sort);
33-
}
34-
35-
36-
/**
37-
* //북마크 목록 조회 (시간, 태그)
38-
*/
39-
@Override
40-
public List<Bookmark> selectBookmarkListByTag(Map<String, Object> params) {
41-
return mapper.selectBookmarkListByTag(params);
42-
}
43-
44-
45-
/**
46-
* 북마크 목록 조회 (검색어)
47-
*/
48-
@Override
49-
public List<Bookmark> selectBookmarkListByQuery(int memberId, String tag, String sort, String query) {
50-
return mapper.selectBookmarkListByQuery(memberId, tag, sort, query);
31+
public List<Bookmark> selectBookmarkList(BookmarkSearchRequestDto searchRequest) {
32+
return mapper.selectBookmarkList(searchRequest);
5133
}
5234

5335

@@ -153,8 +135,8 @@ public List<BookmarkWebsite> selectBookmarkWebsite(int memberId) {
153135
* 사용자 태그 목록 조회
154136
*/
155137
@Override
156-
public List<String> selectTags(int memberId) {
157-
return mapper.selectTags(memberId);
138+
public List<String> selectTags(int memberId, Long folderId) {
139+
return mapper.selectTags(memberId, folderId);
158140
}
159141

160142

src/main/java/com/web/SearchWeb/bookmark/domain/Bookmark.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class Bookmark {
1313
private int member_memberId;
1414
private int website_websiteId;
1515
private int board_boardId;
16+
private int folder_folderId;
1617
private String name;
1718
private String description;
1819
private String url;

src/main/java/com/web/SearchWeb/bookmark/dto/BookmarkDto.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class BookmarkDto {
1313
private int member_memberId;
1414
private int website_websiteId;
1515
private int board_boardId;
16+
private Long folder_folderId;
1617
private String name;
1718
private String description;
1819
private String url;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.web.SearchWeb.bookmark.dto.request;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
12+
public class BookmarkSearchRequestDto {
13+
private int memberId;
14+
private String tag;
15+
private String sort;
16+
private String query;
17+
private Long folderId;
18+
}

src/main/java/com/web/SearchWeb/bookmark/service/BookmarkService.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,8 @@ public interface BookmarkService {
1717
int checkBoardBookmark(BoardBookmarkCheckDto checkDto);
1818
//북마크 단일 조회
1919
Bookmark selectBookmark(int memberId, int bookmarkId);
20-
//북마크 목록 조회 (시간)
21-
List<Bookmark> selectBookmarkList(int memberId, String sort);
22-
//북마크 목록 조회 (시간, 태그)
23-
List<Bookmark> selectBookmarkListByTag(int memberId, String tag, String sort);
24-
//북마크 목록 조회 (검색어)
25-
List<Bookmark> selectBookmarkListByQuery(int memberId, String tag, String sort, String query);
20+
//북마크 목록 조회
21+
List<Bookmark> selectBookmarkList(int memberId, String tag, String sort, String query, Long folderId);
2622
//북마크 추가 (메인리스트에서 추가)
2723
int insertBookmark(BookmarkDto bookmark);
2824
//북마크 추가 (마이페이지에서 추가)
@@ -40,7 +36,7 @@ public interface BookmarkService {
4036
//북마크-웹사이트 조회
4137
List<BookmarkWebsite> selectBookmarkWebsite(int memberId);
4238
//사용자 태그 목록 조회
43-
List<String> selectTags(int memberId);
39+
List<String> selectTags(int memberId, Long folderId);
4440
//게시글 북마크 여부 확인
4541
int isBookmarked(int boardId, int memberId);
4642
}

src/main/java/com/web/SearchWeb/bookmark/service/BookmarkServiceImpl.java

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66
import com.web.SearchWeb.bookmark.dto.BookmarkCheckDto;
77
import com.web.SearchWeb.bookmark.dto.BookmarkDto;
88
import com.web.SearchWeb.bookmark.domain.BookmarkWebsite;
9+
import com.web.SearchWeb.bookmark.dto.request.BookmarkSearchRequestDto;
910
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.stereotype.Service;
1112

12-
13-
import java.util.HashMap;
1413
import java.util.List;
15-
import java.util.Map;
1614

1715
@Service
1816
public class BookmarkServiceImpl implements BookmarkService {
@@ -52,33 +50,18 @@ public Bookmark selectBookmark(int memberId, int bookmarkId) {
5250

5351

5452
/**
55-
* 북마크 목록 조회 (시간)
56-
*/
57-
@Override
58-
public List<Bookmark> selectBookmarkList(int memberId, String sort) {
59-
return bookmarkDao.selectBookmarkList(memberId, sort);
60-
}
61-
62-
63-
/**
64-
* 북마크 목록 조회 (시간, 태그)
65-
*/
66-
@Override
67-
public List<Bookmark> selectBookmarkListByTag(int memberId, String tag, String sort) {
68-
Map<String, Object> params = new HashMap<>();
69-
params.put("member_memberId", memberId);
70-
params.put("tag", tag);
71-
params.put("sort", sort);
72-
return bookmarkDao.selectBookmarkListByTag(params);
73-
}
74-
75-
76-
/**
77-
* 북마크 목록 조회 (검색어)
53+
* 북마크 목록 조회
7854
*/
7955
@Override
80-
public List<Bookmark> selectBookmarkListByQuery(int memberId, String tag, String sort, String query) {
81-
return bookmarkDao.selectBookmarkListByQuery(memberId, tag, sort, query);
56+
public List<Bookmark> selectBookmarkList(int memberId, String tag, String sort, String query, Long folderId) {
57+
BookmarkSearchRequestDto searchRequest = BookmarkSearchRequestDto.builder()
58+
.memberId(memberId)
59+
.tag(tag)
60+
.sort(sort)
61+
.query(query)
62+
.folderId(folderId)
63+
.build();
64+
return bookmarkDao.selectBookmarkList(searchRequest);
8265
}
8366

8467

@@ -159,8 +142,8 @@ public List<BookmarkWebsite> selectBookmarkWebsite(int memberId) {
159142
* 사용자 태그 목록 조회
160143
*/
161144
@Override
162-
public List<String> selectTags(int memberId) {
163-
return bookmarkDao.selectTags(memberId);
145+
public List<String> selectTags(int memberId, Long folderId) {
146+
return bookmarkDao.selectTags(memberId, folderId);
164147
}
165148

166149

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.web.SearchWeb.folder.controller;
2+
3+
import com.web.SearchWeb.aop.OwnerCheck;
4+
import com.web.SearchWeb.folder.dto.request.FolderCreateRequestDto;
5+
import com.web.SearchWeb.folder.dto.request.FolderUpdateRequestDto;
6+
import com.web.SearchWeb.folder.dto.response.FolderResponseDto;
7+
import com.web.SearchWeb.folder.service.FolderService;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.stereotype.Controller;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import java.util.List;
14+
15+
16+
/**
17+
* 코드 작성자:
18+
* - 서진영(jin2304)
19+
*
20+
* 코드 설명:
21+
* - 사용자의 폴더 관리 API (CRUD + 태그 조회).
22+
* - 모든 요청은 OwnerCheck AOP를 통해 권한을 검증.
23+
*
24+
* 코드 주요 기능:
25+
* - 폴더 생성
26+
* - 폴더 단일 조회
27+
* - 폴더 목록 조회
28+
* - 폴더 수정
29+
* - 폴더 삭제
30+
* - 폴더 태그 목록 조회
31+
*
32+
* 코드 작성일:
33+
* - 2025.12.31 ~ 2026.01.02
34+
*/
35+
@Controller
36+
public class FolderController {
37+
38+
private final FolderService folderService;
39+
40+
@Autowired
41+
public FolderController(FolderService folderService) {
42+
this.folderService = folderService;
43+
}
44+
45+
46+
/**
47+
* 폴더 생성
48+
*/
49+
@PostMapping("/myPage/{memberId}/folder")
50+
@OwnerCheck(idParam = "memberId", service = "memberService")
51+
public ResponseEntity<FolderResponseDto> insertFolder(@PathVariable final int memberId,
52+
@RequestBody FolderCreateRequestDto folderCreateRequestDto) {
53+
FolderResponseDto folder = folderService.insertFolder(memberId, folderCreateRequestDto);
54+
return ResponseEntity.ok(folder);
55+
}
56+
57+
58+
/**
59+
* 폴더 단일 조회
60+
*/
61+
@GetMapping("/myPage/{memberId}/folder/{folderId}")
62+
@OwnerCheck(idParam = "memberId", service = "memberService")
63+
public ResponseEntity<FolderResponseDto> getFolder(@PathVariable final int memberId,
64+
@PathVariable final int folderId) {
65+
FolderResponseDto folder = folderService.selectFolder(memberId, folderId);
66+
return ResponseEntity.ok(folder);
67+
}
68+
69+
70+
/**
71+
* 폴더 목록 조회
72+
*/
73+
@GetMapping("/myPage/{memberId}/folders")
74+
@OwnerCheck(idParam = "memberId", service = "memberService")
75+
public ResponseEntity<List<FolderResponseDto>> getFolders(@PathVariable final int memberId,
76+
@RequestParam(required = false, defaultValue = "All") String tag,
77+
@RequestParam(required = false, defaultValue = "Newest") String sort) {
78+
List<FolderResponseDto> folders = folderService.selectFolderList(memberId, tag, sort);
79+
return ResponseEntity.ok(folders);
80+
}
81+
82+
83+
/**
84+
* 폴더 수정
85+
*/
86+
@PutMapping("/myPage/{memberId}/folder/{folderId}")
87+
@OwnerCheck(idParam = "memberId", service = "memberService")
88+
public ResponseEntity<Integer> updateFolder(@PathVariable final int memberId,
89+
@PathVariable final int folderId,
90+
@RequestBody FolderUpdateRequestDto folderUpdateRequestDto) {
91+
int result = folderService.updateFolder(memberId, folderId, folderUpdateRequestDto);
92+
return ResponseEntity.ok(result);
93+
}
94+
95+
96+
/**
97+
* 폴더 삭제
98+
*/
99+
@DeleteMapping("/myPage/{memberId}/folder/{folderId}")
100+
@OwnerCheck(idParam = "memberId", service = "memberService")
101+
public ResponseEntity<Integer> deleteFolder(@PathVariable final int memberId,
102+
@PathVariable final int folderId) {
103+
int result = folderService.deleteFolder(memberId, folderId);
104+
return ResponseEntity.ok(result);
105+
}
106+
107+
108+
/**
109+
* 폴더 태그 목록 조회
110+
*/
111+
@GetMapping("/myPage/{memberId}/folderTags")
112+
@OwnerCheck(idParam = "memberId", service = "memberService")
113+
public ResponseEntity<List<String>> getFolderTags(@PathVariable final int memberId) {
114+
List<String> tags = folderService.selectFolderTags(memberId);
115+
return ResponseEntity.ok(tags);
116+
}
117+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.web.SearchWeb.folder.dao;
2+
3+
import com.web.SearchWeb.folder.domain.Folder;
4+
import com.web.SearchWeb.folder.dto.request.FolderSearchRequestDto;
5+
6+
import java.util.List;
7+
8+
public interface FolderDao {
9+
// 폴더 생성
10+
int insertFolder(Folder folder);
11+
// 폴더 단일 조회
12+
Folder selectFolder(int memberId, int folderId);
13+
// 폴더 목록 조회
14+
List<Folder> selectFolderList(FolderSearchRequestDto searchRequest);
15+
// 폴더 수정
16+
int updateFolder(Folder folder);
17+
// 폴더 삭제
18+
int deleteFolder(int memberId, int folderId);
19+
// 폴더 태그 목록 조회
20+
List<String> selectFolderTags(int memberId);
21+
}

0 commit comments

Comments
 (0)