Skip to content

Commit e2ba7db

Browse files
committed
refactor : add getCocktails conditions
1 parent 470273d commit e2ba7db

File tree

3 files changed

+76
-29
lines changed

3 files changed

+76
-29
lines changed

src/main/java/com/back/domain/cocktail/controller/CocktailController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,20 @@ public RsData<CocktailDetailResponseDto> getCocktailDetailById(@PathVariable lon
3131
return RsData.successOf(cocktailDetailResponseDto);
3232
}
3333

34+
// @param lastValue 다음 페이지에서 이 값보다 작은 항목만 가져오기 위해 사용
3435
// @param lastId 마지막으로 가져온 칵테일 ID (첫 요청 null 가능)
3536
// @param size 가져올 데이터 개수 (기본값 DEFAULT_SIZE)
3637
// @return RsData 형태의 칵테일 요약 정보 리스트
3738
@GetMapping
3839
@Transactional
3940
@Operation(summary = "칵테일 다건 조회")
4041
public RsData<List<CocktailSummaryResponseDto>> getCocktails(
42+
@RequestParam(value = "lastValue", required = false) Long lastValue,
4143
@RequestParam(value = "lastId", required = false) Long lastId,
42-
@RequestParam(value = "size", required = false) Integer size
44+
@RequestParam(value = "size", required = false) Integer size,
45+
@RequestParam(value = "sortBy", required = false, defaultValue = "recent") String sortBy
4346
) {
44-
List<CocktailSummaryResponseDto> cocktails = cocktailService.getCocktails(lastId, size);
47+
List<CocktailSummaryResponseDto> cocktails = cocktailService.getCocktails(lastValue, lastId, size, sortBy);
4548
return RsData.successOf(cocktails);
4649
}
4750

src/main/java/com/back/domain/cocktail/repository/CocktailRepository.java

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,54 @@
1616
@Repository
1717
public interface CocktailRepository extends JpaRepository<Cocktail, Long> {
1818

19-
// 첫 요청 → 최신순(내림차순)으로 정렬해서 가져오기
19+
// 전체조회 : 최신순
2020
List<Cocktail> findAllByOrderByIdDesc(Pageable pageable);
21-
22-
// 무한스크롤 → lastId보다 작은 ID들 가져오기
2321
List<Cocktail> findByIdLessThanOrderByIdDesc(Long lastId, Pageable pageable);
2422

25-
List<Cocktail> findByCocktailNameContainingIgnoreCaseOrIngredientContainingIgnoreCase(String cocktailName, String ingredient);
23+
// 전체 조회: keepsCount 기준 내림차순
24+
@Query("""
25+
SELECT c FROM Cocktail c
26+
LEFT JOIN MyBar m ON m.cocktail = c AND m.status = 'ACTIVE'
27+
GROUP BY c.id
28+
ORDER BY COUNT(m) DESC, c.id DESC
29+
""")
30+
List<Cocktail> findAllOrderByKeepCountDesc(Pageable pageable);
31+
32+
// 무한스크롤 조회: lastKeepCount 이하
33+
@Query("""
34+
SELECT c FROM Cocktail c
35+
LEFT JOIN MyBar m ON m.cocktail = c AND m.status = 'ACTIVE'
36+
GROUP BY c.id
37+
HAVING COUNT(m) < :lastKeepCount OR (COUNT(m) = :lastKeepCount AND c.id < :lastId)
38+
ORDER BY COUNT(m) DESC, c.id DESC
39+
""")
40+
List<Cocktail> findByKeepCountLessThanOrderByKeepCountDesc(
41+
@Param("lastKeepCount") Long lastKeepCount,
42+
@Param("lastId") Long lastId,
43+
Pageable pageable
44+
);
45+
46+
// 댓글순
47+
@Query("SELECT c FROM Cocktail c " +
48+
"LEFT JOIN CocktailComment cm ON cm.cocktail = c " +
49+
"GROUP BY c.id " +
50+
"ORDER BY COUNT(cm) DESC, c.id DESC")
51+
List<Cocktail> findAllOrderByCommentsCountDesc(Pageable pageable);
52+
53+
@Query("""
54+
SELECT c FROM Cocktail c
55+
LEFT JOIN CocktailComment cm ON cm.cocktail = c
56+
GROUP BY c.id
57+
HAVING COUNT(cm) < :lastCommentsCount OR (COUNT(cm) = :lastCommentsCount AND c.id < :lastId)
58+
ORDER BY COUNT(cm) DESC, c.id DESC
59+
""")
60+
List<Cocktail> findByCommentsCountLessThanOrderByCommentsCountDesc(
61+
@Param("lastCommentsCount") Long lastCommentsCount,
62+
@Param("lastId") Long lastId,
63+
Pageable pageable
64+
);
2665

66+
//검색, 필터
2767
@Query("SELECT c FROM Cocktail c " +
2868
"WHERE (:keyword IS NULL OR :keyword = '' OR " +
2969
" LOWER(c.cocktailName) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +

src/main/java/com/back/domain/cocktail/service/CocktailService.java

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,37 +37,41 @@ public Cocktail getCocktailById(Long id) {
3737
.orElseThrow(() -> new IllegalArgumentException("Cocktail not found. id=" + id));
3838
}
3939

40-
// 칵테일 무한스크롤 조회
4140
@Transactional(readOnly = true)
42-
public List<CocktailSummaryResponseDto> getCocktails(Long lastId, Integer size) { // 무한스크롤 조회, 클라이언트 쪽에서 lastId와 size 정보를 받음.(스크롤 이벤트)
41+
public List<CocktailSummaryResponseDto> getCocktails(Long lastValue, Long lastId, Integer size, String sortBy) {
4342
int fetchSize = (size != null) ? size : DEFAULT_SIZE;
44-
43+
Pageable pageable = PageRequest.of(0, fetchSize);
4544
List<Cocktail> cocktails;
46-
if (lastId == null) {
47-
// 첫 요청 → 최신 데이터부터
48-
cocktails = cocktailRepository.findAllByOrderByIdDesc(PageRequest.of(0, fetchSize));
49-
} else {
50-
// 무한스크롤 → 마지막 ID보다 작은 데이터 조회
51-
cocktails = cocktailRepository.findByIdLessThanOrderByIdDesc(lastId, PageRequest.of(0, fetchSize));
45+
46+
switch (sortBy != null ? sortBy.toLowerCase() : "") {
47+
case "keeps":
48+
cocktails = (lastValue == null)
49+
? cocktailRepository.findAllOrderByKeepCountDesc(pageable)
50+
: cocktailRepository.findByKeepCountLessThanOrderByKeepCountDesc(lastValue, lastId, pageable);
51+
break;
52+
case "comments":
53+
cocktails = (lastValue == null)
54+
? cocktailRepository.findAllOrderByCommentsCountDesc(pageable)
55+
: cocktailRepository.findByCommentsCountLessThanOrderByCommentsCountDesc(lastValue, lastId, pageable);
56+
break;
57+
default:
58+
cocktails = (lastValue == null)
59+
? cocktailRepository.findAllByOrderByIdDesc(pageable)
60+
: cocktailRepository.findByIdLessThanOrderByIdDesc(lastValue, pageable);
61+
break;
5262
}
63+
5364
return cocktails.stream()
54-
.map(c -> new CocktailSummaryResponseDto(c.getId(), c.getCocktailName(), c.getCocktailNameKo(), c.getCocktailImgUrl(), c.getAlcoholStrength().getDescription()))
65+
.map(c -> new CocktailSummaryResponseDto(
66+
c.getId(),
67+
c.getCocktailName(),
68+
c.getCocktailNameKo(),
69+
c.getCocktailImgUrl(),
70+
c.getAlcoholStrength().getDescription()
71+
))
5572
.collect(Collectors.toList());
5673
}
5774

58-
// 칵테일 검색기능
59-
@Transactional(readOnly = true)
60-
public List<Cocktail> cocktailSearch(String keyword) {
61-
// cockTailName, ingredient이 하나만 있을 수도 있고 둘 다 있을 수도 있음
62-
if (keyword == null || keyword.trim().isEmpty()) {
63-
// 아무 검색어 없으면 전체 반환 처리
64-
return cocktailRepository.findAll();
65-
} else {
66-
// 이름 또는 재료 둘 중 하나라도 매칭되면 결과 반환
67-
return cocktailRepository.findByCocktailNameContainingIgnoreCaseOrIngredientContainingIgnoreCase(keyword, keyword);
68-
}
69-
}
70-
7175
// 칵테일 검색,필터기능
7276
@Transactional(readOnly = true)
7377
public List<CocktailSearchResponseDto> searchAndFilter(CocktailSearchRequestDto cocktailSearchRequestDto) {

0 commit comments

Comments
 (0)