From 92ab2b5af9169b080883ac65a696660ba31650d2 Mon Sep 17 00:00:00 2001 From: LeeKW Date: Sun, 28 Sep 2025 14:07:54 +0900 Subject: [PATCH 1/5] fix : create table bug --- src/main/java/com/back/domain/cocktail/entity/Cocktail.java | 1 + src/main/resources/application-dev.yml | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/back/domain/cocktail/entity/Cocktail.java b/src/main/java/com/back/domain/cocktail/entity/Cocktail.java index d941ca65..a9420762 100644 --- a/src/main/java/com/back/domain/cocktail/entity/Cocktail.java +++ b/src/main/java/com/back/domain/cocktail/entity/Cocktail.java @@ -41,6 +41,7 @@ public class Cocktail { private String ingredient; + @Column(length = 1000) private String recipe; private String cocktailImgUrl; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d29d56b7..24ec43b7 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,8 +1,4 @@ spring: - sql: - init: - mode: always - data-locations: classpath:data-h2.sql # H2 Database 설정 datasource: driver-class-name: org.h2.Driver @@ -18,6 +14,7 @@ spring: # JPA 설정 jpa: + defer-datasource-initialization: true # Hibernate(JPA)가 먼저 DDL(테이블 생성)을 실행 database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: update # 실행전 db_dev 파일 삭제 필요 @@ -25,7 +22,6 @@ spring: hibernate: format_sql: true show_sql: true - cloud: aws: region: From 927c767985b0593c6e837b860fde614d1ac9ea92 Mon Sep 17 00:00:00 2001 From: LeeKW Date: Sun, 28 Sep 2025 15:03:06 +0900 Subject: [PATCH 2/5] fix : recommend logix --- .../repository/CocktailRepository.java | 12 ++++----- .../cocktail/service/RecommendService.java | 27 +++++++------------ 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/back/domain/cocktail/repository/CocktailRepository.java b/src/main/java/com/back/domain/cocktail/repository/CocktailRepository.java index 961be10f..0695c469 100644 --- a/src/main/java/com/back/domain/cocktail/repository/CocktailRepository.java +++ b/src/main/java/com/back/domain/cocktail/repository/CocktailRepository.java @@ -36,12 +36,10 @@ Page searchWithFilters(@Param("keyword") String keyword, @Param("types") List types, @Param("bases") List bases, Pageable pageable); - //유사칵테일 추천관련 - List findByAlcoholStrengthAndIdNot(AlcoholStrength strength, Long excludeId); - //유사칵테일 추천관련 - List findByCocktailTypeAndIdNot(CocktailType type, Long excludeId); - - //유사칵테일 추천관련 - List findByAlcoholBaseTypeAndIdNot(AlcoholBaseType baseType, Long excludeId); + List findByAlcoholStrengthAndAlcoholBaseTypeAndIdNot( + AlcoholStrength alcoholStrength, + AlcoholBaseType alcoholBaseType, + Long id + ); } diff --git a/src/main/java/com/back/domain/cocktail/service/RecommendService.java b/src/main/java/com/back/domain/cocktail/service/RecommendService.java index c0a6c96e..0d8e2681 100644 --- a/src/main/java/com/back/domain/cocktail/service/RecommendService.java +++ b/src/main/java/com/back/domain/cocktail/service/RecommendService.java @@ -6,10 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; @Service @RequiredArgsConstructor @@ -21,24 +18,20 @@ public List recommendRelatedCocktails(Long cocktai Cocktail current = cocktailRepository.findById(cocktailId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 칵테일입니다.")); - // 3가지 조건으로 유사 칵테일 조회 - List byAlcoholStrength = cocktailRepository.findByAlcoholStrengthAndIdNot(current.getAlcoholStrength(), current.getId()); - List byCocktailType = cocktailRepository.findByCocktailTypeAndIdNot(current.getCocktailType(), current.getId()); - List byAlcoholBase = cocktailRepository.findByAlcoholBaseTypeAndIdNot(current.getAlcoholBaseType(), current.getId()); + // 알콜 강도와 베이스 타이이 같은 칵테일만 조회 + List related = cocktailRepository + .findByAlcoholStrengthAndAlcoholBaseTypeAndIdNot( + current.getAlcoholStrength(), + current.getAlcoholBaseType(), + current.getId() + ); - // 합치고 중복 제거 - Set combined = new LinkedHashSet<>(); - combined.addAll(byAlcoholStrength); - combined.addAll(byCocktailType); - combined.addAll(byAlcoholBase); - - List combinedList = new ArrayList<>(combined); - if (combinedList.size() > maxSize) { - combinedList = combinedList.subList(0, maxSize); + if (related.size() > maxSize) { + related = related.subList(0, maxSize); } // DTO로 변환 - return combinedList.stream() + return related.stream() .map(c -> new CocktailRecommendResponseDto( c.getId(), c.getCocktailNameKo(), From da0dd8852de69ff3d9584d0a2ae693e9ff7e3d4d Mon Sep 17 00:00:00 2001 From: LeeKW Date: Mon, 29 Sep 2025 09:15:53 +0900 Subject: [PATCH 3/5] fix : bug --- .../java/com/back/domain/cocktail/service/CocktailService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/back/domain/cocktail/service/CocktailService.java b/src/main/java/com/back/domain/cocktail/service/CocktailService.java index 06eba0de..1a36f507 100644 --- a/src/main/java/com/back/domain/cocktail/service/CocktailService.java +++ b/src/main/java/com/back/domain/cocktail/service/CocktailService.java @@ -78,7 +78,7 @@ public List searchAndFilter (CocktailSearchRequestDto int size = cocktailSearchRequestDto.getSize() != null && cocktailSearchRequestDto.getSize() > 0 ? cocktailSearchRequestDto.getSize() : DEFAULT_SIZE; - // searchWithFilters에서 조회한 결과값을 pageResult에 저장. + // searchAndFilters에서 조회한 결과값을 pageResult에 저장. Pageable pageable = PageRequest.of(page, size); // 빈 리스트(null 또는 [])는 null로 변환 From 6ac1670aa8ab062533c699a4a308fb39b38b6c16 Mon Sep 17 00:00:00 2001 From: LeeKW Date: Mon, 29 Sep 2025 11:29:08 +0900 Subject: [PATCH 4/5] fix : bugs of testCase, init data --- .../com/back/global/init/DevInitData.java | 12 ++++++++ src/main/resources/application-dev.yml | 11 +++++-- src/main/resources/application-test.yml | 4 --- .../controller/CocktailControllerTest.java | 30 +++++++++++++++---- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/back/global/init/DevInitData.java b/src/main/java/com/back/global/init/DevInitData.java index 6101f7e7..e1ebdde3 100644 --- a/src/main/java/com/back/global/init/DevInitData.java +++ b/src/main/java/com/back/global/init/DevInitData.java @@ -55,6 +55,18 @@ ApplicationRunner devInitDataApplicationRunner() { }; } + @Transactional + public void cocktailInit() throws Exception { + // H2 DB에 이미 데이터가 들어가 있는지 확인 + if (cocktailRepository.count() > 0) { + System.out.println("Cocktail 데이터가 이미 존재합니다."); + return; + } + + // data-h2.sql에서 자동 삽입되므로 여기서는 추가하지 않음. + System.out.println("Cocktail 초기화: CSV에서 데이터를 이미 로드합니다."); + } + @Transactional public void userInit() { userRepository.findByNickname("사용자A").orElseGet(() -> diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 24ec43b7..28ebf512 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -14,14 +14,21 @@ spring: # JPA 설정 jpa: - defer-datasource-initialization: true # Hibernate(JPA)가 먼저 DDL(테이블 생성)을 실행 + defer-datasource-initialization: true database-platform: org.hibernate.dialect.H2Dialect hibernate: - ddl-auto: update # 실행전 db_dev 파일 삭제 필요 + ddl-auto: create-drop # 개발용: 시작할 때 테이블 생성, 종료할 때 삭제 / db_dev 에러 방지용으로 update->create-drop 변경 properties: hibernate: format_sql: true show_sql: true + + sql: + init: + mode: always # 항상 실행 + encoding: UTF-8 + data-locations: classpath:data-h2.sql + cloud: aws: region: diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 0d0d39e9..b71450d6 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -1,8 +1,4 @@ spring: - sql: - init: - mode: always - data-locations: classpath:data-h2.sql datasource: url: jdbc:h2:mem:db_test;MODE=MySQL username: sa diff --git a/src/test/java/com/back/domain/cocktail/controller/CocktailControllerTest.java b/src/test/java/com/back/domain/cocktail/controller/CocktailControllerTest.java index 438dae72..2ac0de1e 100644 --- a/src/test/java/com/back/domain/cocktail/controller/CocktailControllerTest.java +++ b/src/test/java/com/back/domain/cocktail/controller/CocktailControllerTest.java @@ -5,14 +5,21 @@ import com.back.domain.cocktail.enums.AlcoholStrength; import com.back.domain.cocktail.enums.CocktailType; import com.back.domain.cocktail.repository.CocktailRepository; -import com.back.domain.cocktail.service.CocktailService; +import com.back.domain.user.service.UserService; +import com.back.global.rq.Rq; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +33,10 @@ @ActiveProfiles("test") @SpringBootTest +@TestPropertySource(properties = { + "custom.cookie.secure=false", + "custom.cookie.same=Strict" +}) @AutoConfigureMockMvc(addFilters = false) @Transactional public class CocktailControllerTest { @@ -35,10 +46,6 @@ public class CocktailControllerTest { @Autowired private CocktailRepository cocktailRepository; - @Autowired - private CocktailService cocktailService; - - @Test @DisplayName("칵테일 단건 조회 - 로그인 없이 성공") void t1() throws Exception { @@ -130,4 +137,17 @@ void t4() throws Exception { .andExpect(jsonPath("$.message").value("success")) .andExpect(jsonPath("$.data").isArray()); } + + @TestConfiguration + static class TestConfig { + @Bean + public Rq rq() { + HttpServletRequest req = Mockito.mock(HttpServletRequest.class); + HttpServletResponse resp = Mockito.mock(HttpServletResponse.class); + UserService userService = Mockito.mock(UserService.class); + + return new Rq(req, resp, userService); + } + } + } From 3c71fc0d8a3c0f451a83087dc1ff3f305802ba9c Mon Sep 17 00:00:00 2001 From: LeeKW Date: Mon, 29 Sep 2025 11:47:34 +0900 Subject: [PATCH 5/5] fix : bug --- .../controller/CocktailRecommendController.java | 2 +- src/main/java/com/back/global/init/DevInitData.java | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/com/back/domain/cocktail/controller/CocktailRecommendController.java b/src/main/java/com/back/domain/cocktail/controller/CocktailRecommendController.java index d8b877f4..3e5a1fb3 100644 --- a/src/main/java/com/back/domain/cocktail/controller/CocktailRecommendController.java +++ b/src/main/java/com/back/domain/cocktail/controller/CocktailRecommendController.java @@ -21,7 +21,7 @@ public class CocktailRecommendController { private final RecommendService recommendService; - // 상세페이지 추천 (DTO로 반환) + // 상세페이지 3개 칵테일 추천 (DTO로 반환) @Operation(summary = "상세페이지 유사 칵테일 추천", description = "현재 칵테일과 유사한 칵테일 최대 3개를 반환합니다.") @GetMapping("/related") public RsData> recommendRelated(@RequestParam Long cocktailId) { diff --git a/src/main/java/com/back/global/init/DevInitData.java b/src/main/java/com/back/global/init/DevInitData.java index e1ebdde3..6101f7e7 100644 --- a/src/main/java/com/back/global/init/DevInitData.java +++ b/src/main/java/com/back/global/init/DevInitData.java @@ -55,18 +55,6 @@ ApplicationRunner devInitDataApplicationRunner() { }; } - @Transactional - public void cocktailInit() throws Exception { - // H2 DB에 이미 데이터가 들어가 있는지 확인 - if (cocktailRepository.count() > 0) { - System.out.println("Cocktail 데이터가 이미 존재합니다."); - return; - } - - // data-h2.sql에서 자동 삽입되므로 여기서는 추가하지 않음. - System.out.println("Cocktail 초기화: CSV에서 데이터를 이미 로드합니다."); - } - @Transactional public void userInit() { userRepository.findByNickname("사용자A").orElseGet(() ->