Skip to content

Commit 10ad8a2

Browse files
committed
Merge branch 'dev' into feat#154
2 parents 3cafbed + 435ab6f commit 10ad8a2

40 files changed

+932
-148
lines changed

build.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,20 @@ dependencies {
4848
implementation("org.springframework.boot:spring-boot-starter-data-redis")
4949
implementation("org.springframework.session:spring-session-data-redis")
5050

51+
// AWS S3
52+
implementation("io.awspring.cloud:spring-cloud-aws-starter-s3:3.4.0")
53+
5154
runtimeOnly("com.h2database:h2")
5255
runtimeOnly("com.mysql:mysql-connector-j")
5356

5457
annotationProcessor("org.projectlombok:lombok")
5558

59+
//json
60+
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
61+
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5")
62+
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5")
63+
// json 파싱용
64+
5665
//Spring AI
5766
implementation(platform("org.springframework.ai:spring-ai-bom:1.0.0-M4"))
5867

cookies.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Netscape HTTP Cookie File
2+
# https://curl.se/docs/http-cookies.html
3+
# This file was generated by libcurl! Edit at your own risk.
4+

src/main/java/com/back/domain/cocktail/comment/entity/CocktailComment.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
@Entity
1818
@Getter
19-
@Table(name = "cocktailcomment")
2019
@EntityListeners(AuditingEntityListener.class)
2120
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
2221
@AllArgsConstructor
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.back.domain.cocktail.controller;
2+
3+
import com.back.domain.cocktail.dto.CocktailRecommendResponseDto;
4+
import com.back.domain.cocktail.service.RecommendService;
5+
import com.back.global.rsData.RsData;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
import java.util.List;
15+
16+
@RestController
17+
@RequestMapping("/cocktails/recommend")
18+
@Tag(name = "ApiCocktailRecommendController", description = "API 칵테일 추천 컨트롤러")
19+
@RequiredArgsConstructor
20+
public class CocktailRecommendController {
21+
22+
private final RecommendService recommendService;
23+
24+
// 상세페이지 추천 (DTO로 반환)
25+
@Operation(summary = "상세페이지 유사 칵테일 추천", description = "현재 칵테일과 유사한 칵테일 최대 3개를 반환합니다.")
26+
@GetMapping("/related")
27+
public RsData<List<CocktailRecommendResponseDto>> recommendRelated(@RequestParam Long cocktailId) {
28+
return RsData.successOf(recommendService.recommendRelatedCocktails(cocktailId, 3));
29+
}
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.back.domain.cocktail.dto;
2+
3+
public record CocktailRecommendResponseDto(
4+
Long id, // 상세페이지 이동용 ID
5+
String cocktailNameKo, // 한글 이름
6+
String cocktailName, // 영문 이름
7+
String cocktailImgUrl, // 이미지 URL (썸네일)
8+
String alcoholStrength, // 도수 (라이트/미디엄/스트롱 등)
9+
String alcoholBaseType // 베이스 주종 (진, 럼, 보드카 등)
10+
) {
11+
}
12+

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,12 @@ Page<Cocktail> searchWithFilters(@Param("keyword") String keyword,
3636
@Param("types") List<CocktailType> types,
3737
@Param("bases") List<AlcoholBaseType> bases,
3838
Pageable pageable);
39+
//유사칵테일 추천관련
40+
List<Cocktail> findByAlcoholStrengthAndIdNot(AlcoholStrength strength, Long excludeId);
41+
42+
//유사칵테일 추천관련
43+
List<Cocktail> findByCocktailTypeAndIdNot(CocktailType type, Long excludeId);
44+
45+
//유사칵테일 추천관련
46+
List<Cocktail> findByAlcoholBaseTypeAndIdNot(AlcoholBaseType baseType, Long excludeId);
3947
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.back.domain.cocktail.service;
2+
3+
import com.back.domain.cocktail.dto.CocktailRecommendResponseDto;
4+
import com.back.domain.cocktail.entity.Cocktail;
5+
import com.back.domain.cocktail.repository.CocktailRepository;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.util.ArrayList;
10+
import java.util.LinkedHashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class RecommendService {
17+
18+
private final CocktailRepository cocktailRepository;
19+
20+
public List<CocktailRecommendResponseDto> recommendRelatedCocktails(Long cocktailId, int maxSize) {
21+
Cocktail current = cocktailRepository.findById(cocktailId)
22+
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 칵테일입니다."));
23+
24+
// 3가지 조건으로 유사 칵테일 조회
25+
List<Cocktail> byAlcoholStrength = cocktailRepository.findByAlcoholStrengthAndIdNot(current.getAlcoholStrength(), current.getId());
26+
List<Cocktail> byCocktailType = cocktailRepository.findByCocktailTypeAndIdNot(current.getCocktailType(), current.getId());
27+
List<Cocktail> byAlcoholBase = cocktailRepository.findByAlcoholBaseTypeAndIdNot(current.getAlcoholBaseType(), current.getId());
28+
29+
// 합치고 중복 제거
30+
Set<Cocktail> combined = new LinkedHashSet<>();
31+
combined.addAll(byAlcoholStrength);
32+
combined.addAll(byCocktailType);
33+
combined.addAll(byAlcoholBase);
34+
35+
List<Cocktail> combinedList = new ArrayList<>(combined);
36+
if (combinedList.size() > maxSize) {
37+
combinedList = combinedList.subList(0, maxSize);
38+
}
39+
40+
// DTO로 변환
41+
return combinedList.stream()
42+
.map(c -> new CocktailRecommendResponseDto(
43+
c.getId(),
44+
c.getCocktailNameKo(),
45+
c.getCocktailName(),
46+
c.getCocktailImgUrl(),
47+
c.getAlcoholStrength().name(),
48+
c.getAlcoholBaseType().name()
49+
))
50+
.toList();
51+
}
52+
}
53+

src/main/java/com/back/domain/post/category/entity/Category.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,12 @@
11
package com.back.domain.post.category.entity;
22

3-
import jakarta.persistence.Column;
4-
import jakarta.persistence.Entity;
5-
import jakarta.persistence.EntityListeners;
6-
import jakarta.persistence.GeneratedValue;
7-
import jakarta.persistence.GenerationType;
8-
import jakarta.persistence.Id;
9-
import jakarta.persistence.Table;
10-
import lombok.AllArgsConstructor;
11-
import lombok.Builder;
12-
import lombok.Getter;
13-
import lombok.NoArgsConstructor;
14-
import lombok.Setter;
3+
import jakarta.persistence.*;
4+
import lombok.*;
155
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
166

177
@Entity
188
@Getter
199
@Setter
20-
@Table(name = "category")
2110
@EntityListeners(AuditingEntityListener.class)
2211
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
2312
@AllArgsConstructor

src/main/java/com/back/domain/post/comment/entity/Comment.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,8 @@
22

33
import com.back.domain.post.comment.enums.CommentStatus;
44
import com.back.domain.post.post.entity.Post;
5-
import com.back.domain.post.post.enums.PostStatus;
65
import com.back.domain.user.entity.User;
7-
import jakarta.persistence.Column;
8-
import jakarta.persistence.Entity;
9-
import jakarta.persistence.EntityListeners;
10-
import jakarta.persistence.EnumType;
11-
import jakarta.persistence.Enumerated;
12-
import jakarta.persistence.FetchType;
13-
import jakarta.persistence.GeneratedValue;
14-
import jakarta.persistence.GenerationType;
15-
import jakarta.persistence.Id;
16-
import jakarta.persistence.JoinColumn;
17-
import jakarta.persistence.ManyToOne;
18-
import jakarta.persistence.Table;
19-
import java.time.LocalDateTime;
6+
import jakarta.persistence.*;
207
import lombok.AllArgsConstructor;
218
import lombok.Builder;
229
import lombok.Getter;
@@ -25,9 +12,10 @@
2512
import org.springframework.data.annotation.LastModifiedDate;
2613
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
2714

15+
import java.time.LocalDateTime;
16+
2817
@Entity
2918
@Getter
30-
@Table(name = "comment")
3119
@EntityListeners(AuditingEntityListener.class)
3220
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
3321
@AllArgsConstructor

src/main/java/com/back/domain/post/post/entity/Post.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,7 @@
33
import com.back.domain.post.category.entity.Category;
44
import com.back.domain.post.post.enums.PostStatus;
55
import com.back.domain.user.entity.User;
6-
import jakarta.persistence.CascadeType;
7-
import jakarta.persistence.Column;
8-
import jakarta.persistence.Entity;
9-
import jakarta.persistence.EntityListeners;
10-
import jakarta.persistence.EnumType;
11-
import jakarta.persistence.Enumerated;
12-
import jakarta.persistence.FetchType;
13-
import jakarta.persistence.GeneratedValue;
14-
import jakarta.persistence.GenerationType;
15-
import jakarta.persistence.Id;
16-
import jakarta.persistence.JoinColumn;
17-
import jakarta.persistence.ManyToOne;
18-
import jakarta.persistence.OneToMany;
19-
import jakarta.persistence.Table;
20-
import java.time.LocalDateTime;
21-
import java.util.ArrayList;
22-
import java.util.List;
6+
import jakarta.persistence.*;
237
import lombok.AllArgsConstructor;
248
import lombok.Builder;
259
import lombok.Getter;
@@ -28,9 +12,12 @@
2812
import org.springframework.data.annotation.LastModifiedDate;
2913
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
3014

15+
import java.time.LocalDateTime;
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
3119
@Entity
3220
@Getter
33-
@Table(name = "post")
3421
@EntityListeners(AuditingEntityListener.class)
3522
@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
3623
@AllArgsConstructor

0 commit comments

Comments
 (0)