From 6e3af343d56ce46fe70a507faadd19400ac17862 Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 01:57:49 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20query=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20hibernate=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a2cd234..5128ca5 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -77,12 +77,12 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.MySQLDialect - # format_sql: true - # show_sql: true + format_sql: true + show_sql: true use_sql_comments: true hbm2ddl: auto: update - default_batch_fetch_size: 1000 + #default_batch_fetch_size: 100 --- @@ -108,4 +108,4 @@ spring: use_sql_comments: true hbm2ddl: auto: update - default_batch_fetch_size: 1000 + default_batch_fetch_size: 100 From 81df218a741dda2b21af0d8b82b2d7de52d01612 Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 02:03:02 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20optional=EB=A1=9C=20enhanceItem?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=ED=95=B4=EC=84=9C=20=EC=97=86=EB=8B=A4?= =?UTF-8?q?=EB=A9=B4=20=EB=9E=AD=ED=82=B9=20-1=EB=A1=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enhance/service/EnhanceItemService.java | 6 +++++- .../backend/ranking/service/RankingService.java | 14 ++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/LuckyVicky/backend/enhance/service/EnhanceItemService.java b/src/main/java/LuckyVicky/backend/enhance/service/EnhanceItemService.java index 3691811..73c53fe 100644 --- a/src/main/java/LuckyVicky/backend/enhance/service/EnhanceItemService.java +++ b/src/main/java/LuckyVicky/backend/enhance/service/EnhanceItemService.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.time.LocalDate; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -37,9 +38,12 @@ public EnhanceItem findByUserAndItem(User user, Item item) { .orElseThrow(() -> new GeneralException(ErrorCode.ENHANCE_ITEM_NOT_FOUND)); } + public Optional findByUserAndItemInOptional(User user, Item item) { + return enhanceItemRepository.findByUserAndItem(user, item); + } + public EnhanceItem findByUserAndItemOrCreateEnhanceItem(User user, Item item) { return enhanceItemRepository.findByUserAndItem(user, item) - // 없으면 새로운 Entity 생성 .orElseGet(() -> { Integer lastRanking = enhanceItemRepository.countByItem(item) + 1; EnhanceItem newEnhanceItem = EnhanceConverter.createEnhanceItem(user, item, lastRanking); diff --git a/src/main/java/LuckyVicky/backend/ranking/service/RankingService.java b/src/main/java/LuckyVicky/backend/ranking/service/RankingService.java index 4c3fcba..eeec6cd 100644 --- a/src/main/java/LuckyVicky/backend/ranking/service/RankingService.java +++ b/src/main/java/LuckyVicky/backend/ranking/service/RankingService.java @@ -13,11 +13,11 @@ import LuckyVicky.backend.ranking.dto.RankingResponseDto.UserRankingResDto; import LuckyVicky.backend.ranking.dto.RankingResponseDto.WeekRankingResDto; import LuckyVicky.backend.user.domain.User; -import jakarta.transaction.Transactional; +import java.time.LocalDate; import java.time.temporal.WeekFields; import java.util.List; import java.util.Locale; -import java.time.LocalDate; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -44,14 +44,15 @@ public ItemRankingResDto getItemRankingResDto(User user, Item item) { List enhanceItemList = enhanceItemRepository.findEnhanceItemsByItemOrderByEnhanceLevelAndReachedTime(item); - Integer myRanking = enhanceItemService.findByUserAndItemOrCreateEnhanceItem(user, item).getRanking(); + Optional enhanceItem = enhanceItemService.findByUserAndItemInOptional(user, item); + Integer myRanking = enhanceItem.map(EnhanceItem::getRanking).orElse(-1); List userRankingResDtoList = enhanceItemList.stream() .map(RankingConverter::userRankingResDto) .toList(); - return RankingConverter.itemRankingResDto(item, myRanking ,userRankingResDtoList); + return RankingConverter.itemRankingResDto(item, myRanking, userRankingResDtoList); } public WeekRankingResDto getWeekRankingResDto(User user, List weekItemList, LocalDate date) { @@ -67,7 +68,8 @@ public WeekRankingResDto getWeekRankingResDto(User user, List weekItemList LocalDate enhanceStartDate = weekItemList.get(0).getEnhanceStartDate(); LocalDate enhanceEndDate = weekItemList.get(0).getEnhanceEndDate(); - return RankingConverter.weekRankingResDto(enhanceMonthWeek, itemRankingResDtoList, enhanceStartDate, enhanceEndDate); + return RankingConverter.weekRankingResDto(enhanceMonthWeek, itemRankingResDtoList, enhanceStartDate, + enhanceEndDate); } public CurrentItemRankingResDto getCurrentItemRankingResDto(Item item, EnhanceItem enhanceItem) { @@ -75,7 +77,7 @@ public CurrentItemRankingResDto getCurrentItemRankingResDto(Item item, EnhanceIt enhanceItemRepository.findEnhanceItemsByItemOrderByEnhanceLevelAndReachedTime(item); List userRankingResDtoList - = enhanceItemList.stream() + = enhanceItemList.stream() .map(RankingConverter::userRankingResDto) .toList(); From edc8d6d8c60fda1984271c552dbcb8234fc3ad91 Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 02:03:54 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20=EA=B0=95=ED=99=94=EC=8B=9C?= =?UTF-8?q?=EB=8F=84=20=EC=A0=84=EC=A0=81=EC=9D=B4=20=EC=97=86=EC=96=B4=20?= =?UTF-8?q?=EB=9E=AD=ED=82=B9=EC=9D=B4=20-1=EC=9D=B8=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=20=ED=96=89=ED=82=B9=EC=9D=B4=20"-"=EB=A1=9C=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LuckyVicky/backend/ranking/converter/RankingConverter.java | 2 +- .../LuckyVicky/backend/ranking/dto/RankingResponseDto.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/LuckyVicky/backend/ranking/converter/RankingConverter.java b/src/main/java/LuckyVicky/backend/ranking/converter/RankingConverter.java index 56b3b10..94f8523 100644 --- a/src/main/java/LuckyVicky/backend/ranking/converter/RankingConverter.java +++ b/src/main/java/LuckyVicky/backend/ranking/converter/RankingConverter.java @@ -31,7 +31,7 @@ public static ItemRankingResDto itemRankingResDto(Item item, Integer myRanking, return ItemRankingResDto.builder() .userRankingResDtoList(userRankingResDtoList) .itemName(item.getName()) - .myRanking(myRanking) + .myRanking(myRanking > 0 ? Integer.toString(myRanking) : "-") .build(); } diff --git a/src/main/java/LuckyVicky/backend/ranking/dto/RankingResponseDto.java b/src/main/java/LuckyVicky/backend/ranking/dto/RankingResponseDto.java index d2a0545..8bef33f 100644 --- a/src/main/java/LuckyVicky/backend/ranking/dto/RankingResponseDto.java +++ b/src/main/java/LuckyVicky/backend/ranking/dto/RankingResponseDto.java @@ -1,7 +1,6 @@ package LuckyVicky.backend.ranking.dto; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.xml.bind.annotation.XmlType.DEFAULT; import java.time.LocalDate; import java.util.List; import lombok.AllArgsConstructor; @@ -48,7 +47,7 @@ public static class ItemRankingResDto { private String itemName; @Schema(description = "사용자 랭킹") - private Integer myRanking; + private String myRanking; } // 주차별 랭킹 정보 From e319dcb42932bd22c027f8fbe0a09eac162696dc Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 03:39:18 +0900 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20Batch=20Size=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9C=BC=EB=A1=9C=20Lazy=20Loading=20=EC=B5=9C?= =?UTF-8?q?=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5128ca5..2e2a036 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -82,7 +82,7 @@ spring: use_sql_comments: true hbm2ddl: auto: update - #default_batch_fetch_size: 100 + default_batch_fetch_size: 100 --- From e7a823ffead631a5c1c66294145b2b59a618a2f4 Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 03:40:33 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20Fetch=20Join=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20=ED=95=9C=20=EB=B2=88?= =?UTF-8?q?=EC=9D=98=20=EC=BF=BC=EB=A6=AC=EB=A1=9C=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/enhance/repository/EnhanceItemRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java b/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java index 5ba4b45..247dd84 100644 --- a/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java +++ b/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java @@ -1,7 +1,7 @@ package LuckyVicky.backend.enhance.repository; -import LuckyVicky.backend.item.domain.Item; import LuckyVicky.backend.enhance.domain.EnhanceItem; +import LuckyVicky.backend.item.domain.Item; import LuckyVicky.backend.user.domain.User; import java.util.List; import java.util.Optional; @@ -13,7 +13,7 @@ public interface EnhanceItemRepository extends JpaRepository Optional findByUserAndItem(User user, Item item); - @Query("SELECT e FROM EnhanceItem e WHERE e.item = :item ORDER BY e.enhanceLevel DESC, e.enhanceLevelReachedAt ASC") + @Query("SELECT e FROM EnhanceItem e JOIN FETCH e.user WHERE e.item = :item ORDER BY e.enhanceLevel DESC, e.enhanceLevelReachedAt ASC") List findEnhanceItemsByItemOrderByEnhanceLevelAndReachedTime(@Param("item") Item item); Integer countByItem(Item item); From 97a5473be9ff09700f9d82a0826a70498ff476d0 Mon Sep 17 00:00:00 2001 From: persi Date: Thu, 16 Jan 2025 03:44:37 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20EntityGraph=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=B4=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EC=97=90=EB=A7=8C=20=EC=97=B0=EA=B4=80=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/enhance/repository/EnhanceItemRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java b/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java index 247dd84..415f5e5 100644 --- a/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java +++ b/src/main/java/LuckyVicky/backend/enhance/repository/EnhanceItemRepository.java @@ -5,6 +5,7 @@ import LuckyVicky.backend.user.domain.User; import java.util.List; import java.util.Optional; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -13,8 +14,14 @@ public interface EnhanceItemRepository extends JpaRepository Optional findByUserAndItem(User user, Item item); + @EntityGraph(attributePaths = {"user"}) // N+1 문제 해결 위한 EntityGraph 방식 + @Query("SELECT e FROM EnhanceItem e WHERE e.item = :item ORDER BY e.enhanceLevel DESC, e.enhanceLevelReachedAt ASC") + List findEnhanceItemsByItemOrderByEnhanceLevelAndReachedTime(@Param("item") Item item); + + /* N+1 문제 해결 위한 JOIN FETCH 방식 @Query("SELECT e FROM EnhanceItem e JOIN FETCH e.user WHERE e.item = :item ORDER BY e.enhanceLevel DESC, e.enhanceLevelReachedAt ASC") List findEnhanceItemsByItemOrderByEnhanceLevelAndReachedTime(@Param("item") Item item); + */ Integer countByItem(Item item); } \ No newline at end of file