From b26238d87b037de692d9d9a7656ad0a82fc25ee2 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Thu, 25 Jan 2024 22:28:11 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor(cart)=20:=20findByMemberId=20JPQL?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memberProduct/repository/MemberProductRepository.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java index 64535d1c..ffb5d3d0 100644 --- a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java +++ b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java @@ -4,13 +4,15 @@ import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface MemberProductRepository extends JpaRepository { Optional findByProductIdAndMemberId(Long productId, Long memberId); - - List findByMemberId(Long id); + @Query("SELECT mp FROM MemberProduct mp JOIN FETCH mp.product p JOIN FETCH p.productImageList WHERE mp.member.id = :memberId") + List findByMemberId(@Param("memberId") Long memberId); void deleteAllByMemberId(Long memberId); } From 63b9e13192ab30a82e43d30b6861f915abc89602 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Thu, 25 Jan 2024 22:58:32 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor(purchase)=20:=20findByMemberId=20J?= =?UTF-8?q?PQL=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sportsecho/purchase/repository/PurchaseRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java index c0e86806..bb699dc2 100644 --- a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java +++ b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java @@ -8,6 +8,6 @@ public interface PurchaseRepository extends JpaRepository { - @Query("SELECT p FROM Purchase p WHERE p.member.id = :memberId ORDER BY p.createdAt DESC") + @Query("SELECT p FROM Purchase p JOIN FETCH p.purchaseProductList pp JOIN FETCH pp.product WHERE p.member.id = :memberId ORDER BY p.createdAt DESC") List findByMemberId(@Param("memberId") Long memberId); } From 0bf242fb48a767fc01baa1bb9d80e50a4cb9a501 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Mon, 29 Jan 2024 18:12:48 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor(cart)=20:=20findByMemberId=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B7=B8=EB=9E=98=ED=94=84?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sportsecho/memberProduct/entity/MemberProduct.java | 10 ++++++++++ .../repository/MemberProductRepository.java | 7 +++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sportsecho/memberProduct/entity/MemberProduct.java b/src/main/java/com/sportsecho/memberProduct/entity/MemberProduct.java index 945262f8..381f8e90 100644 --- a/src/main/java/com/sportsecho/memberProduct/entity/MemberProduct.java +++ b/src/main/java/com/sportsecho/memberProduct/entity/MemberProduct.java @@ -9,6 +9,9 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedAttributeNode; +import jakarta.persistence.NamedEntityGraph; +import jakarta.persistence.NamedSubgraph; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -19,6 +22,13 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@NamedEntityGraph( + name = "graph.MemberProduct", + attributeNodes = { + @NamedAttributeNode(value = "product", subgraph = "productGraph") + }, subgraphs = { + @NamedSubgraph(name = "productGraph", attributeNodes = @NamedAttributeNode("productImageList")) +}) public class MemberProduct { @Id diff --git a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java index ffb5d3d0..d982959f 100644 --- a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java +++ b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java @@ -3,16 +3,15 @@ import com.sportsecho.memberProduct.entity.MemberProduct; 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; public interface MemberProductRepository extends JpaRepository { Optional findByProductIdAndMemberId(Long productId, Long memberId); - @Query("SELECT mp FROM MemberProduct mp JOIN FETCH mp.product p JOIN FETCH p.productImageList WHERE mp.member.id = :memberId") - List findByMemberId(@Param("memberId") Long memberId); + @EntityGraph(value = "graph.MemberProduct", type = EntityGraph.EntityGraphType.FETCH) + List findByMemberId(Long memberId); void deleteAllByMemberId(Long memberId); } From ef5a8ae6a6ec939c17e3594aae87df4ea2c6d0fc Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Mon, 29 Jan 2024 19:00:21 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor(purchase)=20:=20findByMemberId=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B7=B8=EB=9E=98=ED=94=84?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sportsecho/purchase/entity/Purchase.java | 11 +++++++++++ .../purchase/repository/PurchaseRepository.java | 6 ++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sportsecho/purchase/entity/Purchase.java b/src/main/java/com/sportsecho/purchase/entity/Purchase.java index 889ab319..71324a32 100644 --- a/src/main/java/com/sportsecho/purchase/entity/Purchase.java +++ b/src/main/java/com/sportsecho/purchase/entity/Purchase.java @@ -11,6 +11,9 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedAttributeNode; +import jakarta.persistence.NamedEntityGraph; +import jakarta.persistence.NamedSubgraph; import jakarta.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @@ -25,6 +28,14 @@ @Builder @AllArgsConstructor @NoArgsConstructor +@NamedEntityGraph(name = "graph.Purchase", + attributeNodes = { + @NamedAttributeNode(value = "purchaseProductList", subgraph = "purchaseProductListGraph") + }, + subgraphs = { + @NamedSubgraph(name = "purchaseProductListGraph", attributeNodes = { + @NamedAttributeNode(value = "product")}) + }) public class Purchase extends TimeStamp { @Id diff --git a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java index bb699dc2..58cc31ef 100644 --- a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java +++ b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java @@ -1,13 +1,15 @@ package com.sportsecho.purchase.repository; import com.sportsecho.purchase.entity.Purchase; -import io.lettuce.core.dynamic.annotation.Param; import java.util.List; +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; public interface PurchaseRepository extends JpaRepository { - @Query("SELECT p FROM Purchase p JOIN FETCH p.purchaseProductList pp JOIN FETCH pp.product WHERE p.member.id = :memberId ORDER BY p.createdAt DESC") + @EntityGraph(value = "graph.Purchase", type = EntityGraph.EntityGraphType.FETCH) + @Query("SELECT p FROM Purchase p WHERE p.member.id = :memberId ORDER BY p.createdAt DESC") List findByMemberId(@Param("memberId") Long memberId); } From ff67c8cc3c328533b65e121a94ddb34a20a98c01 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Mon, 29 Jan 2024 21:11:16 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor(cart)=20:=20deleteAll=20JPQL=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/sportsecho/common/aop/TimeTraceAop.java | 2 +- .../memberProduct/repository/MemberProductRepository.java | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sportsecho/common/aop/TimeTraceAop.java b/src/main/java/com/sportsecho/common/aop/TimeTraceAop.java index e02a5656..f12a7f56 100644 --- a/src/main/java/com/sportsecho/common/aop/TimeTraceAop.java +++ b/src/main/java/com/sportsecho/common/aop/TimeTraceAop.java @@ -24,7 +24,7 @@ public void memberProduct() { public void purchase() { } - @Around("user()") + @Around("user() || memberProduct() || purchase()") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); diff --git a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java index d982959f..810cd4ee 100644 --- a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java +++ b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java @@ -5,6 +5,9 @@ import java.util.Optional; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface MemberProductRepository extends JpaRepository { @@ -13,5 +16,7 @@ public interface MemberProductRepository extends JpaRepository findByMemberId(Long memberId); - void deleteAllByMemberId(Long memberId); + @Modifying + @Query("DELETE FROM MemberProduct mp WHERE mp.member.id = :memberId") + void deleteAllByMemberId(@Param("memberId") Long memberId); } From adaa56e5d7816a2c0ee7cc4e9bb65b38e12aea54 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Wed, 31 Jan 2024 14:06:36 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor(purchase)=20:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PurchaseServiceImplV1.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java b/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java index 020c733c..a1adf8a1 100644 --- a/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java +++ b/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java @@ -44,7 +44,7 @@ public PurchaseResponseDto purchase(PurchaseRequestDto requestDto, Member member } // 재고 확인 후 차감 - updateStock(memberProductList); + decreaseStock(memberProductList); // 구매 인스턴스 생성 Purchase purchase = PurchaseMapper.INSTANCE.fromPurchaseRequestDto(requestDto, member); @@ -86,7 +86,7 @@ public void cancelPurchase(Long purchaseId, Member member) { () -> new GlobalException(PurchaseErrorCode.NOT_FOUND_PURCHASE) ); checkMember(purchase, member); - updateStock(purchase); + increaseStock(purchase); purchaseProductRepository.deleteByPurchaseId(purchaseId); purchaseRepository.deleteById(purchaseId); @@ -117,17 +117,7 @@ private List createPList(List memberProductList, return pList; } - private void updateStock(Purchase purchase) { - List purchaseProductList = purchase.getPurchaseProductList(); - - for (PurchaseProduct purchaseProduct : purchaseProductList) { - Product product = purchaseProduct.getProduct(); - product.increaseQuantity(purchaseProduct.getProductsQuantity()); - productRepository.save(product); - } - } - - private void updateStock(List memberProductList) { + private void decreaseStock(List memberProductList) { for (MemberProduct memberProduct : memberProductList) { Product product = memberProduct.getProduct(); @@ -136,11 +126,19 @@ private void updateStock(List memberProductList) { throw new GlobalException(PurchaseErrorCode.OUT_OF_STOCK); } else { product.decreaseQuantity(memberProduct.getProductsQuantity()); - productRepository.save(product); } } } + private void increaseStock(Purchase purchase) { + List purchaseProductList = purchase.getPurchaseProductList(); + + for (PurchaseProduct purchaseProduct : purchaseProductList) { + Product product = purchaseProduct.getProduct(); + product.increaseQuantity(purchaseProduct.getProductsQuantity()); + } + } + private void checkMember(Purchase purchase, Member member) { if (!purchase.getMember().getId().equals(member.getId())) { throw new GlobalException(PurchaseErrorCode.ACCESS_DENIED); From 2fa544e13ed01dee140f1b865fbb6ace0c37ed64 Mon Sep 17 00:00:00 2001 From: Kim Jihyun Date: Wed, 31 Jan 2024 16:08:39 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor(cart)=20:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memberProduct/repository/MemberProductRepository.java | 2 +- .../memberProduct/service/MemberProductServiceImplV1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java index 810cd4ee..82ef8491 100644 --- a/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java +++ b/src/main/java/com/sportsecho/memberProduct/repository/MemberProductRepository.java @@ -18,5 +18,5 @@ public interface MemberProductRepository extends JpaRepository Date: Wed, 31 Jan 2024 16:19:41 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor(purchase)=20:=20findbyId=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B7=B8=EB=9E=98=ED=94=84=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sportsecho/purchase/repository/PurchaseRepository.java | 5 +++++ .../sportsecho/purchase/service/PurchaseServiceImplV1.java | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java index 58cc31ef..bd9eac74 100644 --- a/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java +++ b/src/main/java/com/sportsecho/purchase/repository/PurchaseRepository.java @@ -2,6 +2,7 @@ import com.sportsecho.purchase.entity.Purchase; 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; @@ -12,4 +13,8 @@ public interface PurchaseRepository extends JpaRepository { @EntityGraph(value = "graph.Purchase", type = EntityGraph.EntityGraphType.FETCH) @Query("SELECT p FROM Purchase p WHERE p.member.id = :memberId ORDER BY p.createdAt DESC") List findByMemberId(@Param("memberId") Long memberId); + + @EntityGraph(value = "graph.Purchase", type = EntityGraph.EntityGraphType.FETCH) + @Query("SELECT p FROM Purchase p WHERE p.id = :purchaseId") + Optional findByIdWithProducts(Long purchaseId); } diff --git a/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java b/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java index a1adf8a1..e5db2b6c 100644 --- a/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java +++ b/src/main/java/com/sportsecho/purchase/service/PurchaseServiceImplV1.java @@ -59,7 +59,7 @@ public PurchaseResponseDto purchase(PurchaseRequestDto requestDto, Member member purchaseRepository.save(purchase); // 장바구니 비우기 - memberProductRepository.deleteAllByMemberId(member.getId()); + memberProductRepository.deleteByMemberId(member.getId()); return PurchaseMapper.INSTANCE.toResponseDto(purchase); } @@ -82,8 +82,8 @@ public List getPurchaseList(Member member) { @Transactional public void cancelPurchase(Long purchaseId, Member member) { - Purchase purchase = purchaseRepository.findById(purchaseId).orElseThrow( - () -> new GlobalException(PurchaseErrorCode.NOT_FOUND_PURCHASE) + Purchase purchase = purchaseRepository.findByIdWithProducts(purchaseId).orElseThrow(() -> + new GlobalException(PurchaseErrorCode.NOT_FOUND_PURCHASE) ); checkMember(purchase, member); increaseStock(purchase);