Skip to content

Commit 36838e1

Browse files
authored
[feat] 나만의 Bar(킵) 목록 조회 기능 구현 #23 (#29)
* refactor: Wishlist 엔티티를 MyBar 엔티티로 리팩토링 및 개선 - Wishlist 도메인을 MyBar 도메인으로 명칭 변경 - `createdAt` 필드에 `@CreatedDate` 어노테이션 적용하여 생성 시간 자동화 - Soft Delete 구현을 위해 `deletedAt` 필드 추가 - `WishlistStatus` enum을 `KeepStatus` enum으로 변경 * refactor: WishlistStatus enum을 KeepStatus enum으로 변경 - 도메인 명칭 변경에 맞춰 WishlistStatus enum 클래스를 KeepStatus로 변경 - enum 패키지 위치를 'wishlist'에서 'mybar'으로 이동 * refactor: 불필요한 Dto 삭제 * feat: 마이바 목록 조회 DTO 추가 - 마이바 목록 조회 시 사용될 MyBarListResponseDto 클래스 추가 - 페이징 처리를 위한 nextCursor 필드 추가 * refactor: WishlistResponseDto를 MyBarItemResponseDto로 리팩토링 - WishlistResponseDto 클래스를 MyBarItemResponseDto로 명칭 변경 - DTO가 사용자(User) 정보 대신 킵한 칵테일(Cocktail) 정보를 직접 포함하도록 수정 * refactor: WishlistRepository를 MyBarRepository로 리팩토링 및 쿼리 메소드 추가 - WishlistRepository 인터페이스를 MyBarRepository로 명칭 변경 - '나만의 바' 기능의 데이터 접근을 위해 쿼리 메소드 2개 추가 - `findByUserIdAndStatusOrderByIdDesc`: 특정 사용자의 킵 목록을 페이징하여 조회 - `countByUserIdAndStatus`: 특정 사용자의 활성 킵 개수를 카운트 * refactor: API 응답을 커서 기반 페이징 방식에서 오프셋 기반 페이징 방식으로 변경 * feat: 마이바(MyBar) 목록 조회 서비스 로직 구현 * feat: 마이바(MyBar) 목록 조회 API 구현 * fix typo
1 parent 437a1da commit 36838e1

File tree

12 files changed

+183
-109
lines changed

12 files changed

+183
-109
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.back.domain.mybar.controller;
2+
3+
import com.back.domain.mybar.dto.MyBarListResponseDto;
4+
import com.back.domain.mybar.service.MyBarService;
5+
import com.back.global.rsData.RsData;
6+
import jakarta.validation.constraints.Max;
7+
import jakarta.validation.constraints.Min;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10+
import org.springframework.validation.annotation.Validated;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RequestParam;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
@RestController
17+
@RequestMapping("/me/bar")
18+
@RequiredArgsConstructor
19+
@Validated
20+
public class MyBarController {
21+
22+
private final MyBarService myBarService;
23+
24+
@GetMapping
25+
public RsData<MyBarListResponseDto> getMyBarList(
26+
@AuthenticationPrincipal(expression = "id") Long userId,
27+
@RequestParam(defaultValue = "0") @Min(0) int page,
28+
@RequestParam(defaultValue = "20") @Min(1) @Max(100) int pageSize
29+
) {
30+
MyBarListResponseDto body = myBarService.getMyBar(userId, page, pageSize);
31+
return RsData.successOf(body); // code=200, message="success"
32+
}
33+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.back.domain.mybar.dto;
2+
3+
import com.back.domain.mybar.entity.MyBar;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
import java.time.LocalDateTime;
8+
9+
@Getter
10+
@Builder
11+
public class MyBarItemResponseDto {
12+
private Long id;
13+
private Long cocktailId;
14+
private String cocktailName;
15+
private String imageUrl;
16+
private LocalDateTime createdAt;
17+
18+
public static MyBarItemResponseDto from(MyBar m) {
19+
return MyBarItemResponseDto.builder()
20+
.id(m.getId())
21+
.cocktailId(m.getCocktail().getCocktailId())
22+
.cocktailName(m.getCocktail().getCocktailName())
23+
.imageUrl(m.getCocktail().getImageUrl())
24+
.createdAt(m.getCreatedAt())
25+
.build();
26+
}
27+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.back.domain.mybar.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class MyBarListResponseDto {
11+
private List<MyBarItemResponseDto> items;
12+
private boolean hasNext; // 다음 페이지 존재 여부
13+
private Integer nextPage; // 다음 페이지 번호(없으면 null)
14+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.back.domain.mybar.entity;
2+
3+
import com.back.domain.cocktail.entity.Cocktail;
4+
import com.back.domain.mybar.enums.KeepStatus;
5+
import com.back.domain.user.entity.User;
6+
import jakarta.persistence.*;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import org.springframework.data.annotation.CreatedDate;
11+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
12+
13+
import java.time.LocalDateTime;
14+
15+
@Entity
16+
@Getter
17+
@Setter
18+
@NoArgsConstructor
19+
@EntityListeners(AuditingEntityListener.class)
20+
public class MyBar {
21+
22+
@Id
23+
@GeneratedValue(strategy = GenerationType.IDENTITY)
24+
private Long id;
25+
26+
/** 킵 생성 시각 */
27+
@CreatedDate
28+
private LocalDateTime createdAt;
29+
30+
/** 킵 해제 시각 (ACTIVE일 때는 null) */
31+
private LocalDateTime deletedAt;
32+
33+
/** 킵한 사용자 */
34+
@ManyToOne
35+
private User user;
36+
37+
/** 킵한 칵테일 */
38+
@ManyToOne
39+
private Cocktail cocktail;
40+
41+
/** 킵 상태 */
42+
@Enumerated(EnumType.STRING)
43+
@Column(nullable = false)
44+
// 기본값은 ACTIVE (활성 상태)
45+
// ACTIVE: 킵한 상태, DELETED: 킵 해제한 상태 (Soft Delete)
46+
private KeepStatus status = KeepStatus.ACTIVE;
47+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.back.domain.mybar.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum KeepStatus {
7+
ACTIVE,
8+
DELETED
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.back.domain.mybar.repository;
2+
3+
import com.back.domain.mybar.entity.MyBar;
4+
import com.back.domain.mybar.enums.KeepStatus;
5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
7+
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.stereotype.Repository;
9+
10+
@Repository
11+
public interface MyBarRepository extends JpaRepository<MyBar, Long> {
12+
/** 나만의 bar(킵) 목록: ACTIVE만, id desc */
13+
Page<MyBar> findByUserIdAndStatusOrderByIdDesc(Long userId, KeepStatus status, Pageable pageable);
14+
15+
/** 프로필/요약용: ACTIVE 개수 */
16+
long countByUserIdAndStatus(Long userId, KeepStatus status);
17+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.back.domain.mybar.service;
2+
3+
import com.back.domain.mybar.dto.MyBarItemResponseDto;
4+
import com.back.domain.mybar.dto.MyBarListResponseDto;
5+
import com.back.domain.mybar.entity.MyBar;
6+
import com.back.domain.mybar.enums.KeepStatus;
7+
import com.back.domain.mybar.repository.MyBarRepository;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.data.domain.Page;
10+
import org.springframework.data.domain.PageRequest;
11+
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
@Service
18+
@RequiredArgsConstructor
19+
public class MyBarService {
20+
21+
private final MyBarRepository myBarRepository;
22+
23+
@Transactional(readOnly = true)
24+
public MyBarListResponseDto getMyBar(Long userId, int page, int pageSize) {
25+
Page<MyBar> myBarPage = myBarRepository.findByUserIdAndStatusOrderByIdDesc(userId, KeepStatus.ACTIVE, PageRequest.of(page, pageSize));
26+
27+
List<MyBar> myBars = myBarPage.getContent();
28+
List<MyBarItemResponseDto> items = new ArrayList<>();
29+
for (MyBar myBar : myBars) items.add(MyBarItemResponseDto.from(myBar));
30+
31+
boolean hasNext = myBarPage.hasNext();
32+
Integer nextPage = hasNext ? myBarPage.getNumber() + 1 : null;
33+
34+
return new MyBarListResponseDto(items, hasNext, nextPage);
35+
}
36+
}

src/main/java/com/back/domain/wishlist/dto/WishlistRequestDto.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/main/java/com/back/domain/wishlist/dto/WishlistResponseDto.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/main/java/com/back/domain/wishlist/entity/Wishlist.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)