Skip to content

Commit 73018f7

Browse files
authored
Merge pull request #109 from freeMates/20250602_#105_기능추가_즐겨찾기_public인_즐겨찾기_리스트_가져오기
public인 즐겨찾기 리스트 가져오기
2 parents 86ec537 + 40d25d8 commit 73018f7

3 files changed

Lines changed: 88 additions & 22 deletions

File tree

src/main/java/jombi/freemates/controller/BookmarkController.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
import jombi.freemates.service.BookmarkService;
1717
import jombi.freemates.util.docs.ApiChangeLog;
1818
import jombi.freemates.util.docs.ApiChangeLogs;
19+
import lombok.Builder.Default;
1920
import lombok.RequiredArgsConstructor;
2021
import lombok.extern.slf4j.Slf4j;
22+
import org.springframework.data.domain.Page;
2123
import org.springframework.http.HttpStatus;
2224
import org.springframework.http.MediaType;
2325
import org.springframework.http.ResponseEntity;
@@ -121,12 +123,55 @@ public ResponseEntity<BookmarkResponse> create(
121123
"""
122124
)
123125
@GetMapping("/mylist")
124-
public List<BookmarkResponse> list(
126+
public List<BookmarkResponse> getMyBookmarks(
125127
@AuthenticationPrincipal CustomUserDetails customUserDetails
126128
) {
127-
return bookmarkService.listByMember(customUserDetails);
129+
return bookmarkService.getMyBookmarks(customUserDetails);
128130
}
129131

132+
@ApiChangeLogs({
133+
@ApiChangeLog(
134+
date = "2025-06-02",
135+
author = Author.LEEDAYE,
136+
issueNumber = 105,
137+
description = "public/private 즐겨찾기 목록 가져오기"
138+
)
139+
})
140+
@Operation(
141+
summary = "즐겨찾기 목록 가져오기",
142+
description = """
143+
## 인증(JWT): **필요**
144+
145+
## 요청 파라미터
146+
- **`page`**: 페이지 번호 (0부터 시작, 기본값: 0)
147+
- **`size`**: 페이지 크기 (기본값: 10)
148+
- **`visibility`**: 공개 여부 (ENUM: `PUBLIC`, `PRIVATE`, 선택적)
149+
150+
## 반환값 (`Page<BookmarkResponse>`)
151+
- **`content`**: 즐겨찾기 목록
152+
- **`totalElements`**: 전체 요소 수
153+
- **`totalPages`**: 전체 페이지 수
154+
- **`number`**: 현재 페이지 번호
155+
- **`size`**: 페이지 크기
156+
- **`sort`**: 정렬 정보
157+
- **`numberOfElements`**: 현재 페이지의 요소 수
158+
- **`empty`**: 현재 페이지가 비어있는지 여부
159+
160+
## 에러코드
161+
"""
162+
)
163+
@GetMapping("/list")
164+
public ResponseEntity<Page<BookmarkResponse>> getBookmarks(
165+
@RequestParam(defaultValue = "0") int page,
166+
@RequestParam(defaultValue = "10") int size,
167+
@RequestParam(defaultValue = "PUBLIC") Visibility visibility
168+
) {
169+
log.debug("page:{}, size:{}, visibility:{}", page, size, visibility);
170+
Page<BookmarkResponse> bookmarks = bookmarkService.getBookmarks(page, size, visibility);
171+
return ResponseEntity.ok(bookmarks);
172+
}
173+
174+
130175

131176
/**
132177
* 장소를 즐겨찾기에 추가하는 API입니다.

src/main/java/jombi/freemates/repository/BookmarkRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import java.util.List;
44
import java.util.Optional;
55
import java.util.UUID;
6+
import jombi.freemates.model.constant.Visibility;
67
import jombi.freemates.model.postgres.Bookmark;
78
import jombi.freemates.model.postgres.Member;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.data.domain.Pageable;
811
import org.springframework.data.jpa.repository.JpaRepository;
912
import org.springframework.stereotype.Repository;
1013

@@ -13,4 +16,6 @@ public interface BookmarkRepository extends JpaRepository<Bookmark, UUID> {
1316
List<Bookmark> findAllByMember(Member member);
1417

1518
Optional<Bookmark> findByBookmarkIdAndMember(UUID bookmarkId, Member member);
19+
20+
Page<Bookmark> findByVisibility(Visibility visibility, Pageable pageable);
1621
}

src/main/java/jombi/freemates/service/BookmarkService.java

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44
import java.util.UUID;
55
import java.util.stream.Collectors;
6+
import jombi.freemates.model.constant.Visibility;
67
import jombi.freemates.model.dto.BookmarkRequest;
78
import jombi.freemates.model.dto.BookmarkResponse;
89
import jombi.freemates.model.dto.CustomUserDetails;
@@ -19,6 +20,8 @@
1920
import jombi.freemates.util.exception.ErrorCode;
2021
import lombok.RequiredArgsConstructor;
2122
import lombok.extern.slf4j.Slf4j;
23+
import org.springframework.data.domain.Page;
24+
import org.springframework.data.domain.PageRequest;
2225
import org.springframework.stereotype.Service;
2326
import org.springframework.transaction.annotation.Transactional;
2427
import org.springframework.web.multipart.MultipartFile;
@@ -33,6 +36,10 @@ public class BookmarkService {
3336
private final BookmarkPlaceRepository bookmarkPlaceRepository;
3437
private final PlaceService placeService;
3538

39+
/**
40+
* 즐겨찾기 생성
41+
*
42+
*/
3643
@Transactional
3744
public BookmarkResponse create(
3845
CustomUserDetails customUserDetails,
@@ -64,34 +71,30 @@ public BookmarkResponse create(
6471
log.info("북마크 생성 완료 - ID: {}, 사용자: {}", b.getBookmarkId(), member.getNickname());
6572

6673
// 응답 DTO 반환
67-
return BookmarkResponse.builder()
68-
.bookmarkId(b.getBookmarkId())
69-
.memberId(member.getMemberId())
70-
.nickname(member.getNickname())
71-
.imageUrl(imageUrl)
72-
.title(b.getTitle())
73-
.description(b.getDescription())
74-
.pinColor(b.getPinColor())
75-
.visibility(b.getVisibility())
76-
.build();
74+
return convertToBookmarkResponse(b);
7775
}
7876

77+
/**
78+
* 멤버 별 즐겨찾기 목록 조회
79+
*/
7980
@Transactional(readOnly = true)
80-
public List<BookmarkResponse> listByMember(CustomUserDetails customUserDetails) {
81+
public List<BookmarkResponse> getMyBookmarks(CustomUserDetails customUserDetails) {
8182
Member member = customUserDetails.getMember();
8283
return bookmarkRepository.findAllByMember(member).stream()
83-
.map(b -> BookmarkResponse.builder()
84-
.memberId(member.getMemberId())
85-
.nickname(member.getNickname())
86-
.imageUrl(b.getImageUrl())
87-
.title(b.getTitle())
88-
.description(b.getDescription())
89-
.pinColor(b.getPinColor())
90-
.visibility(b.getVisibility())
91-
.build())
84+
.map(this::convertToBookmarkResponse)
9285
.collect(Collectors.toList());
9386
}
9487

88+
/**
89+
* 즐겨찾기 목록 조회 (페이징)
90+
*/
91+
@Transactional(readOnly = true)
92+
public Page<BookmarkResponse> getBookmarks(int page, int size, Visibility visibility) {
93+
return bookmarkRepository
94+
.findByVisibility(visibility, PageRequest.of(page, size))
95+
.map(this::convertToBookmarkResponse);
96+
}
97+
9598
@Transactional
9699
public void addPlaceToBookmark(
97100
CustomUserDetails customUserDetails,
@@ -158,4 +161,17 @@ public List<PlaceDto> getPlacesByBookmarkId(UUID bookmarkId) {
158161
.collect(Collectors.toList());
159162
}
160163

164+
public BookmarkResponse convertToBookmarkResponse(Bookmark bookmark) {
165+
return BookmarkResponse.builder()
166+
.bookmarkId(bookmark.getBookmarkId())
167+
.memberId(bookmark.getMember().getMemberId())
168+
.nickname(bookmark.getMember().getNickname())
169+
.imageUrl(bookmark.getImageUrl())
170+
.title(bookmark.getTitle())
171+
.description(bookmark.getDescription())
172+
.pinColor(bookmark.getPinColor())
173+
.visibility(bookmark.getVisibility())
174+
.build();
175+
}
176+
161177
}

0 commit comments

Comments
 (0)