Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,5 @@ db_dev.mv.db
db_dev.trace.db

### Environment Variables ###
.env
.env

Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.back.domain.cocktail.dto;

import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
Expand All @@ -16,12 +18,12 @@ public class CocktailRequestDto {
private String cocktailName;

@NotNull
private Cocktail.AlcoholStrength alcoholStrength;
private AlcoholStrength alcoholStrength;

private String cocktailStory;
private Cocktail.CocktailType cocktailType;
private CocktailType cocktailType;
private AlcoholBaseType alcoholBaseType;
private String ingredient;
private String recipe;
private String imageUrl;

private String cocktailImgUrl;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.back.domain.cocktail.dto;

import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
Expand All @@ -14,12 +16,13 @@ public class CocktailResponseDto {

private long cocktailId;
private String cocktailName;
private Cocktail.AlcoholStrength alcoholStrength;
private AlcoholStrength alcoholStrength;
private String cocktailStory;
private Cocktail.CocktailType cocktailType;
private CocktailType cocktailType;
private AlcoholBaseType alcoholBaseType;
private String ingredient;
private String recipe;
private String imageUrl;
private String cocktailImgUrl;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/back/domain/cocktail/dto/CocktailSummaryDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.back.domain.cocktail.dto;

import lombok.Getter;

@Getter
public class CocktailSummaryDto {
private Long cocktailId;
private String cocktailName;
private String cocktailImgUrl;

public CocktailSummaryDto(Long id, String name, String imageUrl) {
this.cocktailId = id;
this.cocktailName = name;
this.cocktailImgUrl = imageUrl;
}
}
49 changes: 10 additions & 39 deletions src/main/java/com/back/domain/cocktail/entity/Cocktail.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.back.domain.cocktail.entity;

import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;

import java.time.LocalDateTime;

Expand All @@ -13,6 +14,9 @@
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Entity
public class Cocktail {
@Id
Expand All @@ -24,52 +28,19 @@ public class Cocktail {
@Enumerated(EnumType.STRING)
private AlcoholStrength alcoholStrength; // 칵테일 알콜 도수

public enum AlcoholStrength {
NON_ALCOHOLIC("논알콜 (0%)"),
WEAK("약한 도수 (1~5%)"),
LIGHT("가벼운 도수 (6~15%)"),
MEDIUM("중간 도수 (16~25%)"),
STRONG("센 도수 (26~35%)"),
VERY_STRONG("매우 센 도수 (36%~)");

private final String description;

AlcoholStrength(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}

private String cocktailStory; // 칵테일 유래 등 이야기

@Enumerated(EnumType.STRING)
private CocktailType cocktailType; // 칵테일 컵에 따른 분류

public enum CocktailType {
SHORT("숏"),
LONG("롱"),
SHOOTER("슈터"),
CLASSIC("클래식");

private final String description;

CocktailType(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}
@Enumerated(EnumType.STRING)
private AlcoholBaseType alcoholBaseType; // 칵테일 베이스에 따른 분류

private String ingredient;

private String recipe;

private String imageUrl;
private String cocktailImgUrl;

private LocalDateTime createdAt;

Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/back/domain/cocktail/enums/AlcoholBaseType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.back.domain.cocktail.enums;

public enum AlcoholBaseType {
GIN("진"),
BRANDY("브랜디"),
RUM("럼"),
VODKA("보드카"),
LIQUEUR("리큐르"),
WHISKY("위스키"),
TEQUILA("데낄라"),
WINE("와인"),
OTHER("기타");

private final String description;

AlcoholBaseType(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/back/domain/cocktail/enums/AlcoholStrength.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.back.domain.cocktail.enums;

public enum AlcoholStrength {
NON_ALCOHOLIC("논알콜 (0%)"),
WEAK("약한 도수 (1~5%)"),
LIGHT("가벼운 도수 (6~15%)"),
MEDIUM("중간 도수 (16~25%)"),
STRONG("센 도수 (26~35%)"),
VERY_STRONG("매우 센 도수 (36%~)");

private final String description;

AlcoholStrength(String description) {
this.description = description;
}

public String getDescription() {
return description;
}

}
18 changes: 18 additions & 0 deletions src/main/java/com/back/domain/cocktail/enums/CocktailType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.back.domain.cocktail.enums;

public enum CocktailType {
SHORT("숏"),
LONG("롱"),
SHOOTER("슈터"),
CLASSIC("클래식");

private final String description;

CocktailType(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
package com.back.domain.cocktail.repository;

import com.back.domain.cocktail.entity.Cocktail;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface CocktailRepository extends JpaRepository<Cocktail, Long> {

// 첫 요청 → 최신순(내림차순)으로 정렬해서 가져오기
List<Cocktail> findAllByOrderByCocktailIdDesc(Pageable pageable);

// 무한스크롤 → lastId보다 작은 ID들 가져오기
List<Cocktail> findByCocktailIdLessThanOrderByCocktailIdDesc(Long lastId, Pageable pageable);

List<Cocktail> findByCocktailNameContainingIgnoreCaseOrIngredientContainingIgnoreCase(String cocktailName, String ingredient);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.back.domain.cocktail.service;

import com.back.domain.cocktail.dto.CocktailSummaryDto;
import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.repository.CocktailRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class CocktailService {

private final CocktailRepository cocktailRepository;

private static final int DEFAULT_SIZE = 20;

@Transactional(readOnly = true)
public Cocktail getCocktailById(Long id) {
return cocktailRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("User not found. id=" + id));
}

// 칵테일 무한스크롤 조회
@Transactional(readOnly = true)
public List<CocktailSummaryDto> getCocktails(Long lastId, Integer size) { // 무한스크롤 조회, 클라이언트 쪽에서 lastId와 size 정보를 받음.(스크롤 이벤트)
int fetchSize = (size != null) ? size : DEFAULT_SIZE;

List<Cocktail> cocktails;
if (lastId == null) {
// 첫 요청 → 최신 데이터부터
cocktails = cocktailRepository.findAllByOrderByCocktailIdDesc(PageRequest.of(0, fetchSize));
} else {
// 무한스크롤 → 마지막 ID보다 작은 데이터 조회
cocktails = cocktailRepository.findByCocktailIdLessThanOrderByCocktailIdDesc(lastId, PageRequest.of(0, fetchSize));
}

return cocktails.stream()
.map(c -> new CocktailSummaryDto(c.getCocktailId(), c.getCocktailName(), c.getCocktailImgUrl()))
.collect(Collectors.toList());
}

// 칵테일 검색기능
public List<Cocktail> cocktailSearch(String keyword) {
// cockTailName, ingredient이 하나만 있을 수도 있고 둘 다 있을 수도 있음
if (keyword == null || keyword.trim().isEmpty()) {
// 아무 검색어 없으면 전체 반환 처리
return cocktailRepository.findAll();
} else {
// 이름 또는 재료 둘 중 하나라도 매칭되면 결과 반환
return cocktailRepository.findByCocktailNameContainingIgnoreCaseOrIngredientContainingIgnoreCase(keyword, keyword);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static MyBarItemResponseDto from(MyBar m) {
.id(m.getId())
.cocktailId(m.getCocktail().getCocktailId())
.cocktailName(m.getCocktail().getCocktailName())
.imageUrl(m.getCocktail().getImageUrl())
.imageUrl(m.getCocktail().getCocktailImgUrl())
.createdAt(m.getCreatedAt())
.build();
}
Expand Down
37 changes: 29 additions & 8 deletions src/main/java/com/back/global/init/DevInitData.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
package com.back.global.init;

import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.repository.CocktailRepository;
import com.back.domain.cocktail.service.CocktailService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.Transactional;

@Configuration
@Profile("dev")
@RequiredArgsConstructor
public class DevInitData {

private final CocktailRepository cocktailRepository;
private final CocktailService cocktailService;

@Autowired
@Lazy
private DevInitData self;
Expand All @@ -20,16 +29,28 @@ public class DevInitData {
@Bean
ApplicationRunner devInitDataApplicationRunner() {
return args -> {
// self.memberInit();

self.cocktailInit(); // 테스트용 데이터 삽입
};
}

// @Transactional
// public void memberInit() {
// if (memberService.count() > 0) {
// return;
// }
// }
@Transactional
public void cocktailInit() {
if (cocktailRepository.count() > 0) {
return;
}

for (int i = 1; i <= 20; i++) { // 20개의 테스트 칵테일 생성
cocktailRepository.save(Cocktail.builder()
.cocktailName("Cocktail " + i)
.cocktailImgUrl("http://example.com/img" + i + ".jpg")
.ingredient("Ingredient "+ i)
.alcoholStrength(AlcoholStrength.NON_ALCOHOLIC)
.build());
}
System.out.println("DevInitData: 테스트 칵테일 20개 삽입");
System.out.println(cocktailService.getCocktailById(2l));
System.out.println(cocktailService.cocktailSearch("cocktail 3"));
System.out.println(cocktailService.cocktailSearch("Ingredient 4"));
}
}