From 235b3612c1519a96b060337daeacf1b0a7159cb7 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 19 Jan 2025 00:14:28 +0900 Subject: [PATCH 01/21] =?UTF-8?q?refactor:=20purgomalum=20infra=20package?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/application/MenuService.java | 2 +- .../java/kitchenpos/products/application/ProductService.java | 2 +- .../infra/{ => purgomalum}/DefaultPurgomalumClient.java | 2 +- .../products/infra/{ => purgomalum}/PurgomalumClient.java | 2 +- src/main/java/kitchenpos/products/tobe/domain/ProductName.java | 2 +- src/test/java/kitchenpos/menus/application/MenuServiceTest.java | 2 +- .../kitchenpos/products/application/FakePurgomalumClient.java | 2 +- .../kitchenpos/products/application/ProductServiceTest.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/kitchenpos/products/infra/{ => purgomalum}/DefaultPurgomalumClient.java (95%) rename src/main/java/kitchenpos/products/infra/{ => purgomalum}/PurgomalumClient.java (64%) diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index d010bfc15..1125d64c1 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -3,7 +3,7 @@ import kitchenpos.menus.domain.*; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index a766a51c6..07cd2efe9 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -6,7 +6,7 @@ import kitchenpos.products.tobe.domain.ProductName; import kitchenpos.products.tobe.domain.ProductPrice; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java similarity index 95% rename from src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java index 87dba885c..0d2403d47 100644 --- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.products.infra.purgomalum; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; diff --git a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java b/src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java similarity index 64% rename from src/main/java/kitchenpos/products/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java index 4002a2bb8..68055d8f5 100644 --- a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.products.infra.purgomalum; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java index 92d4aafe7..b553b0af4 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java +++ b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java @@ -1,6 +1,6 @@ package kitchenpos.products.tobe.domain; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import javax.persistence.Column; import javax.persistence.Embeddable; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 9503ecc3b..6da5c9f98 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -8,7 +8,7 @@ import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java index 3c4114798..781fc5847 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java @@ -1,6 +1,6 @@ package kitchenpos.products.application; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 1380b59a1..5c80e2775 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -3,7 +3,7 @@ import kitchenpos.products.application.dto.ProductRequest; import kitchenpos.products.application.dto.ProductResponse; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.products.infra.purgomalum.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From f2c5e0660a0bb4befad081be8c7be65a6488429a Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 19 Jan 2025 00:15:56 +0900 Subject: [PATCH 02/21] =?UTF-8?q?refactor:=20purgomalumeClient=20class=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=EB=A5=BC=20domain=20package=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/application/MenuService.java | 2 +- .../java/kitchenpos/products/application/ProductService.java | 2 +- .../products/infra/purgomalum/DefaultPurgomalumClient.java | 1 + src/main/java/kitchenpos/products/tobe/domain/ProductName.java | 2 -- .../{infra/purgomalum => tobe/domain}/PurgomalumClient.java | 2 +- src/test/java/kitchenpos/menus/application/MenuServiceTest.java | 2 +- .../kitchenpos/products/application/FakePurgomalumClient.java | 2 +- .../kitchenpos/products/application/ProductServiceTest.java | 2 +- 8 files changed, 7 insertions(+), 8 deletions(-) rename src/main/java/kitchenpos/products/{infra/purgomalum => tobe/domain}/PurgomalumClient.java (64%) diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 1125d64c1..157240b52 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -3,7 +3,7 @@ import kitchenpos.menus.domain.*; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index 07cd2efe9..ae45e13f8 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -6,7 +6,7 @@ import kitchenpos.products.tobe.domain.ProductName; import kitchenpos.products.tobe.domain.ProductPrice; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java index 0d2403d47..df914a89f 100644 --- a/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java @@ -1,5 +1,6 @@ package kitchenpos.products.infra.purgomalum; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java index b553b0af4..0f6164e2f 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductName.java +++ b/src/main/java/kitchenpos/products/tobe/domain/ProductName.java @@ -1,7 +1,5 @@ package kitchenpos.products.tobe.domain; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; - import javax.persistence.Column; import javax.persistence.Embeddable; import java.util.Objects; diff --git a/src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java b/src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java similarity index 64% rename from src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java rename to src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java index 68055d8f5..d2bed1485 100644 --- a/src/main/java/kitchenpos/products/infra/purgomalum/PurgomalumClient.java +++ b/src/main/java/kitchenpos/products/tobe/domain/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra.purgomalum; +package kitchenpos.products.tobe.domain; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 6da5c9f98..cde464ae9 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -8,7 +8,7 @@ import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java index 781fc5847..98622a6eb 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java @@ -1,6 +1,6 @@ package kitchenpos.products.application; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 5c80e2775..cf2cdd01d 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -3,7 +3,7 @@ import kitchenpos.products.application.dto.ProductRequest; import kitchenpos.products.application.dto.ProductResponse; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.infra.purgomalum.PurgomalumClient; +import kitchenpos.products.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 92de5a2dfce9734ec52eddab328217889a09c8a9 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 19 Jan 2025 00:17:04 +0900 Subject: [PATCH 03/21] =?UTF-8?q?refactor:=20JpaProductRepositroy=20class?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=EB=A5=BC=20infra/repository=20pakcage?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain => infra/repository}/JpaProductRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename src/main/java/kitchenpos/products/{tobe/domain => infra/repository}/JpaProductRepository.java (62%) diff --git a/src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java b/src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java similarity index 62% rename from src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java index 4204f5f80..7a34f56a3 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/products/infra/repository/JpaProductRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.products.tobe.domain; +package kitchenpos.products.infra.repository; +import kitchenpos.products.tobe.domain.Product; +import kitchenpos.products.tobe.domain.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; From a4aa6fbb93278ac8ef7e8b80238a38dd05ffbbc3 Mon Sep 17 00:00:00 2001 From: flamme Date: Sat, 25 Jan 2025 22:33:14 +0900 Subject: [PATCH 04/21] =?UTF-8?q?refactor:=20ProductPriceChangeEvent=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuService.java | 61 +++++++++---------- .../ProductPriceChangeListener.java | 40 ------------ .../menus/domain/JpaMenuRepository.java | 2 +- .../java/kitchenpos/menus/domain/Menu.java | 20 ++++++ .../kitchenpos/menus/domain/MenuProduct.java | 35 ++++++----- .../listener/ProductPriceChangeListener.java | 21 +++++++ .../products/tobe/domain/Product.java | 2 +- .../tobe/domain/ProductPriceChangeEvent.java | 22 +++++++ .../ProductPriceChangeEventProduct.java | 15 ----- src/test/java/kitchenpos/Fixtures.java | 6 +- .../application/InMemoryMenuRepository.java | 2 +- .../ProductPriceChangeListenerTest.java | 22 +++++-- 12 files changed, 131 insertions(+), 117 deletions(-) delete mode 100644 src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java create mode 100644 src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java create mode 100644 src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java delete mode 100644 src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 157240b52..e17a53d83 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -19,10 +19,10 @@ public class MenuService { private final PurgomalumClient purgomalumClient; public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final PurgomalumClient purgomalumClient + final MenuRepository menuRepository, + final MenuGroupRepository menuGroupRepository, + final ProductRepository productRepository, + final PurgomalumClient purgomalumClient ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; @@ -37,15 +37,15 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final List menuProductRequests = request.getMenuProducts(); if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { throw new IllegalArgumentException(); } final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .collect(Collectors.toList()) + menuProductRequests.stream() + .map(MenuProduct::getProductId) + .collect(Collectors.toList()) ); if (products.size() != menuProductRequests.size()) { throw new IllegalArgumentException(); @@ -58,13 +58,14 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); sum = sum.add( - product.getPrice() - .multiply(BigDecimal.valueOf(quantity)) + product.getPrice() + .multiply(BigDecimal.valueOf(quantity)) ); final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProduct(product); + menuProduct.setProductId(product.getId()); + menuProduct.setProductPrice(product.getPrice()); menuProduct.setQuantity(quantity); menuProducts.add(menuProduct); } @@ -92,16 +93,10 @@ public Menu changePrice(final UUID menuId, final Menu request) { throw new IllegalArgumentException(); } final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (price.compareTo(sum) > 0) { + .orElseThrow(NoSuchElementException::new); + + + if (price.compareTo(menu.getTotalProductPrice()) > 0) { throw new IllegalArgumentException(); } menu.setPrice(price); @@ -111,16 +106,8 @@ public Menu changePrice(final UUID menuId, final Menu request) { @Transactional public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { + .orElseThrow(NoSuchElementException::new); + if (menu.getPrice().compareTo(menu.getTotalProductPrice()) > 0) { throw new IllegalStateException(); } menu.setDisplayed(true); @@ -130,7 +117,7 @@ public Menu display(final UUID menuId) { @Transactional public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); menu.setDisplayed(false); return menu; } @@ -139,4 +126,12 @@ public Menu hide(final UUID menuId) { public List findAll() { return menuRepository.findAll(); } + + @Transactional + public void changeProductPrice(final UUID productId, final BigDecimal productPrice) { + final List menus = menuRepository.findAllByProductId(productId); + for (final Menu menu : menus) { + menu.updateMenuProductPrice(productId, productPrice); + } + } } diff --git a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java deleted file mode 100644 index 69e6701e8..000000000 --- a/src/main/java/kitchenpos/menus/application/ProductPriceChangeListener.java +++ /dev/null @@ -1,40 +0,0 @@ -package kitchenpos.menus.application; - -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuProduct; -import kitchenpos.menus.domain.MenuRepository; -import kitchenpos.products.tobe.domain.ProductPriceChangeEventProduct; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -import javax.transaction.Transactional; -import java.math.BigDecimal; -import java.util.List; - -@Component -public class ProductPriceChangeListener { - private final MenuRepository menuRepository; - - public ProductPriceChangeListener(MenuRepository menuRepository) { - this.menuRepository = menuRepository; - } - - @Transactional - @EventListener - public void listen(ProductPriceChangeEventProduct event) { - final List menus = menuRepository.findAllByProductId(event.getId()); - for (final Menu menu : menus) { - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProduct : menu.getMenuProducts()) { - sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) - ); - } - if (menu.getPrice().compareTo(sum) > 0) { - menu.setDisplayed(false); - } - } - } -} diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index 796499c30..c8959599e 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -8,7 +8,7 @@ import java.util.UUID; public interface JpaMenuRepository extends MenuRepository, JpaRepository { - @Query("select m from Menu m join m.menuProducts mp where mp.product.id = :productId") + @Query("select m from Menu m join m.menuProducts mp where mp.productId = :productId") @Override List findAllByProductId(@Param("productId") UUID productId); } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index e923a6e5d..5caa38aee 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -99,4 +99,24 @@ public UUID getMenuGroupId() { public void setMenuGroupId(final UUID menuGroupId) { this.menuGroupId = menuGroupId; } + + public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { + this.menuProducts.stream() + .filter(it -> it.getProductId().equals(productId)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("상품을 찾을 수가 없습니다. productId : " + productId)) + .updateProductPrice(productPrice); + + var totalProductPrice = getTotalProductPrice(); + + if (this.price.compareTo(totalProductPrice) > 0) { + this.displayed = false; + } + } + + public BigDecimal getTotalProductPrice() { + return menuProducts.stream() + .map(MenuProduct::getProductPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } } diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java index 276955c22..199ad6074 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -1,8 +1,8 @@ package kitchenpos.menus.domain; -import kitchenpos.products.tobe.domain.Product; import javax.persistence.*; +import java.math.BigDecimal; import java.util.UUID; @Table(name = "menu_product") @@ -13,20 +13,15 @@ public class MenuProduct { @Id private Long seq; - @ManyToOne(optional = false) - @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") - ) - private Product product; - @Column(name = "quantity", nullable = false) private long quantity; - @Transient + @Column(name = "product_id") private UUID productId; + @Column(name = "price") + private BigDecimal productPrice; + public MenuProduct() { } @@ -38,14 +33,6 @@ public void setSeq(final Long seq) { this.seq = seq; } - public Product getProduct() { - return product; - } - - public void setProduct(final Product product) { - this.product = product; - } - public long getQuantity() { return quantity; } @@ -58,7 +45,19 @@ public UUID getProductId() { return productId; } + public BigDecimal getProductPrice() { + return this.productPrice.multiply(BigDecimal.valueOf(this.quantity)); + } + public void setProductId(final UUID productId) { this.productId = productId; } + + public void updateProductPrice(BigDecimal productPrice) { + this.productPrice = productPrice; + } + + public void setProductPrice(BigDecimal productPrice) { + this.productPrice = productPrice; + } } diff --git a/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java new file mode 100644 index 000000000..763879c09 --- /dev/null +++ b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java @@ -0,0 +1,21 @@ +package kitchenpos.menus.infra.listener; + +import kitchenpos.menus.application.MenuService; +import kitchenpos.products.tobe.domain.ProductPriceChangeEvent; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +public class ProductPriceChangeListener { + + private final MenuService menuService; + + public ProductPriceChangeListener(MenuService menuService) { + this.menuService = menuService; + } + + @TransactionalEventListener + public void listen(ProductPriceChangeEvent event) { + menuService.changeProductPrice(event.getId(), event.getProductPrice()); + } +} diff --git a/src/main/java/kitchenpos/products/tobe/domain/Product.java b/src/main/java/kitchenpos/products/tobe/domain/Product.java index 06480439d..48191bc02 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/Product.java +++ b/src/main/java/kitchenpos/products/tobe/domain/Product.java @@ -47,6 +47,6 @@ public BigDecimal getPrice() { public void changePrice(final ProductPrice productPrice) { this.price = productPrice; - registerEvent(new ProductPriceChangeEventProduct(this.id)); + registerEvent(new ProductPriceChangeEvent(this.id, productPrice)); } } diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java new file mode 100644 index 000000000..099dc8197 --- /dev/null +++ b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java @@ -0,0 +1,22 @@ +package kitchenpos.products.tobe.domain; + +import java.math.BigDecimal; +import java.util.UUID; + +public class ProductPriceChangeEvent { + private final UUID id; + private final ProductPrice productPrice; + + public ProductPriceChangeEvent(UUID id, ProductPrice productPrice) { + this.id = id; + this.productPrice = productPrice; + } + + public UUID getId() { + return id; + } + + public BigDecimal getProductPrice() { + return this.productPrice.getPrice(); + } +} diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java deleted file mode 100644 index ef2373851..000000000 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEventProduct.java +++ /dev/null @@ -1,15 +0,0 @@ -package kitchenpos.products.tobe.domain; - -import java.util.UUID; - -public class ProductPriceChangeEventProduct { - private UUID id; - - public ProductPriceChangeEventProduct( UUID id) { - this.id = id; - } - - public UUID getId() { - return id; - } -} diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 347a57f63..7facd84d3 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -50,7 +50,8 @@ public static MenuGroup menuGroup(final String name) { public static MenuProduct menuProduct() { final MenuProduct menuProduct = new MenuProduct(); menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); + menuProduct.setProductId(UUID.randomUUID()); + menuProduct.setProductPrice(BigDecimal.valueOf(16_000)); menuProduct.setQuantity(2L); return menuProduct; } @@ -58,7 +59,8 @@ public static MenuProduct menuProduct() { public static MenuProduct menuProduct(final Product product, final long quantity) { final MenuProduct menuProduct = new MenuProduct(); menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product); + menuProduct.setProductId(product.getId()); + menuProduct.setProductPrice(product.getPrice()); menuProduct.setQuantity(quantity); return menuProduct; } diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index 971ded7e3..6bd827427 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -37,7 +37,7 @@ public List findAllByIdIn(final List ids) { public List findAllByProductId(final UUID productId) { return menus.values() .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) + .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProductId().equals(productId))) .collect(Collectors.toList()); } } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 2757ee7ab..2860629eb 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -1,15 +1,19 @@ package kitchenpos.menus.application; import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.infra.listener.ProductPriceChangeListener; +import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.Product; -import kitchenpos.products.tobe.domain.ProductPriceChangeEventProduct; -import kitchenpos.products.tobe.domain.ProductRepository; +import kitchenpos.products.tobe.domain.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; +import java.util.Random; + import static kitchenpos.Fixtures.*; import static org.assertj.core.api.Assertions.assertThat; @@ -18,14 +22,20 @@ class ProductPriceChangeListenerTest { private ProductPriceChangeListener productPriceChangeListener; private MenuRepository menuRepository; - private Product product; + private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; + private PurgomalumClient purgomalumClient; + private MenuService menuService; + private Product product; @BeforeEach void setUp() { menuRepository = new InMemoryMenuRepository(); - productPriceChangeListener = new ProductPriceChangeListener(menuRepository); + menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); + purgomalumClient = new FakePurgomalumClient(); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + productPriceChangeListener = new ProductPriceChangeListener(menuService); product = productRepository.save(product("후라이드", 16_000L)); } @@ -33,7 +43,7 @@ void setUp() { @Test void changePriceInMenu() { final Menu menu = menuRepository.save(menu(19_000L, menuProduct(product, 2L))); - productPriceChangeListener.listen(new ProductPriceChangeEventProduct(product.getId())); + productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getId(), new ProductPrice(BigDecimal.valueOf(19_000L)))); assertThat(menu.isDisplayed()).isFalse(); } From 6ec6b3d5bcc7a7a77a25738fddc83ce69b33582a Mon Sep 17 00:00:00 2001 From: flamme Date: Sat, 25 Jan 2025 23:18:12 +0900 Subject: [PATCH 05/21] =?UTF-8?q?refactor:=20MenuPrice=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuService.java | 14 +-- .../dto/MenuPriceChangeRequest.java | 18 +++ .../java/kitchenpos/menus/domain/Menu.java | 29 ++--- .../kitchenpos/menus/domain/MenuPrice.java | 38 +++++++ .../menus/ui/MenuRestController.java | 3 +- .../menus/application/MenuServiceTest.java | 105 +++++++++--------- 6 files changed, 129 insertions(+), 78 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java create mode 100644 src/main/java/kitchenpos/menus/domain/MenuPrice.java diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index e17a53d83..b9702a229 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,5 +1,6 @@ package kitchenpos.menus.application; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.*; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; @@ -87,19 +88,10 @@ public Menu create(final Menu request) { } @Transactional - public Menu changePrice(final UUID menuId, final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - - - if (price.compareTo(menu.getTotalProductPrice()) > 0) { - throw new IllegalArgumentException(); - } - menu.setPrice(price); + menu.updateMenuPrice(request.getPrice()); return menu; } diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java new file mode 100644 index 000000000..382fb2841 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuPriceChangeRequest.java @@ -0,0 +1,18 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +public class MenuPriceChangeRequest { + @NotNull + private final BigDecimal price; + + + public MenuPriceChangeRequest(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index 5caa38aee..cc8636ffb 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -15,14 +15,14 @@ public class Menu { @Column(name = "name", nullable = false) private String name; - @Column(name = "price", nullable = false) - private BigDecimal price; + @Embedded + private MenuPrice menuPrice; @ManyToOne(optional = false) @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") + name = "menu_group_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") ) private MenuGroup menuGroup; @@ -31,10 +31,10 @@ public class Menu { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) private List menuProducts; @@ -61,11 +61,11 @@ public void setName(final String name) { } public BigDecimal getPrice() { - return price; + return menuPrice.getPrice(); } public void setPrice(final BigDecimal price) { - this.price = price; + this.menuPrice = new MenuPrice(price); } public MenuGroup getMenuGroup() { @@ -108,8 +108,7 @@ public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { .updateProductPrice(productPrice); var totalProductPrice = getTotalProductPrice(); - - if (this.price.compareTo(totalProductPrice) > 0) { + if (this.menuPrice.isTotalProductPriceOver(totalProductPrice)) { this.displayed = false; } } @@ -119,4 +118,8 @@ public BigDecimal getTotalProductPrice() { .map(MenuProduct::getProductPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); } + + public void updateMenuPrice(BigDecimal price) { + this.menuPrice = menuPrice.updatePrice(price, this.getTotalProductPrice()); + } } diff --git a/src/main/java/kitchenpos/menus/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/domain/MenuPrice.java new file mode 100644 index 000000000..b18f28ef5 --- /dev/null +++ b/src/main/java/kitchenpos/menus/domain/MenuPrice.java @@ -0,0 +1,38 @@ +package kitchenpos.menus.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.Objects; + +@Embeddable +public class MenuPrice { + @Column(name = "price", nullable = false) + private BigDecimal price; + + public MenuPrice() { + } + + public MenuPrice(BigDecimal price) { + if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException(); + } + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } + + public MenuPrice updatePrice(BigDecimal price, BigDecimal totalProductPrice) { + MenuPrice newMenuPrice = new MenuPrice(price); + if (newMenuPrice.isTotalProductPriceOver(totalProductPrice)) { + throw new IllegalArgumentException("총 상품 가격이 메뉴 가격보다 큽니다."); + } + return newMenuPrice; + } + + public boolean isTotalProductPriceOver(BigDecimal totalProductPrice) { + return this.price.compareTo(totalProductPrice) > 0; + } +} diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 3e3a0e23a..7618f5a5f 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,6 +1,7 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -26,7 +27,7 @@ public ResponseEntity create(@RequestBody final Menu request) { } @PutMapping("/{menuId}/price") - public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final Menu request) { + public ResponseEntity changePrice(@PathVariable final UUID menuId, @RequestBody final MenuPriceChangeRequest request) { return ResponseEntity.ok(menuService.changePrice(menuId, request)); } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index cde464ae9..2df06b730 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,5 +1,6 @@ package kitchenpos.menus.application; +import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.domain.MenuProduct; @@ -50,17 +51,17 @@ void setUp() { @Test void create() { final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); final Menu actual = menuService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), - () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), - () -> assertThat(actual.getMenuProducts()).hasSize(1) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getName()).isEqualTo(expected.getName()), + () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), + () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), + () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), + () -> assertThat(actual.getMenuProducts()).hasSize(1) ); } @@ -70,14 +71,14 @@ void create() { void create(final List menuProducts) { final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } private static List menuProducts() { return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) + null, + Arguments.of(Collections.emptyList()), + Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) ); } @@ -85,10 +86,10 @@ private static List menuProducts() { @Test void createNegativeQuantity() { final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴의 가격이 올바르지 않으면 등록할 수 없다.") @@ -97,20 +98,20 @@ void createNegativeQuantity() { @ParameterizedTest void create(final BigDecimal price) { final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴는 특정 메뉴 그룹에 속해야 한다.") @@ -118,10 +119,10 @@ void createExpensiveMenu() { @ParameterizedTest void create(final UUID menuGroupId) { final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(NoSuchElementException.class); + .isInstanceOf(NoSuchElementException.class); } @DisplayName("메뉴의 이름이 올바르지 않으면 등록할 수 없다.") @@ -130,17 +131,17 @@ void create(final UUID menuGroupId) { @ParameterizedTest void create(final String name) { final Menu expected = createMenuRequest( - name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴의 가격을 변경할 수 있다.") @Test void changePrice() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); + final MenuPriceChangeRequest expected = changePriceRequest(16_000L); final Menu actual = menuService.changePrice(menuId, expected); assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); } @@ -151,18 +152,18 @@ void changePrice() { @ParameterizedTest void changePrice(final BigDecimal price) { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(price); + final MenuPriceChangeRequest expected = changePriceRequest(price); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void changePriceToExpensive() { final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(33_000L); + final MenuPriceChangeRequest expected = changePriceRequest(33_000L); assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴를 노출할 수 있다.") @@ -178,7 +179,7 @@ void display() { void displayExpensiveMenu() { final UUID menuId = menuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); assertThatThrownBy(() -> menuService.display(menuId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("메뉴를 숨길 수 있다.") @@ -198,41 +199,41 @@ void findAll() { } private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts + final String name, + final long price, + final UUID menuGroupId, + final boolean displayed, + final MenuProduct... menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final MenuProduct... menuProducts ) { return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts + final String name, + final long price, + final UUID menuGroupId, + final boolean displayed, + final List menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts + final String name, + final BigDecimal price, + final UUID menuGroupId, + final boolean displayed, + final List menuProducts ) { final Menu menu = new Menu(); menu.setName(name); @@ -250,13 +251,11 @@ private static MenuProduct createMenuProductRequest(final UUID productId, final return menuProduct; } - private Menu changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); + private MenuPriceChangeRequest changePriceRequest(BigDecimal price) { + return new MenuPriceChangeRequest(price); } - private Menu changePriceRequest(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setPrice(price); - return menu; + private MenuPriceChangeRequest changePriceRequest(long price) { + return new MenuPriceChangeRequest(BigDecimal.valueOf(price)); } } From 113d0aadf8438322c4d7321380dd37864fe91fdc Mon Sep 17 00:00:00 2001 From: flamme Date: Sat, 25 Jan 2025 23:23:54 +0900 Subject: [PATCH 06/21] =?UTF-8?q?refactor:=20MenuDisplay=20&=20MenuHide=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/menus/application/MenuService.java | 7 ++----- src/main/java/kitchenpos/menus/domain/Menu.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index b9702a229..373c08430 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -99,10 +99,7 @@ public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - if (menu.getPrice().compareTo(menu.getTotalProductPrice()) > 0) { - throw new IllegalStateException(); - } - menu.setDisplayed(true); + menu.display(); return menu; } @@ -110,7 +107,7 @@ public Menu display(final UUID menuId) { public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) .orElseThrow(NoSuchElementException::new); - menu.setDisplayed(false); + menu.hide(); return menu; } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index cc8636ffb..d810b6ac4 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -122,4 +122,15 @@ public BigDecimal getTotalProductPrice() { public void updateMenuPrice(BigDecimal price) { this.menuPrice = menuPrice.updatePrice(price, this.getTotalProductPrice()); } + + public void display() { + if (this.menuPrice.isTotalProductPriceOver(this.getTotalProductPrice())) { + throw new IllegalStateException("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); + } + this.displayed = true; + } + + public void hide() { + this.displayed = false; + } } From e501e4036cfea64089cfbecb436e27832dacf8cd Mon Sep 17 00:00:00 2001 From: flamme Date: Sat, 25 Jan 2025 23:37:05 +0900 Subject: [PATCH 07/21] =?UTF-8?q?refactor:=20MenuProducts=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=ED=99=94=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/domain/JpaMenuRepository.java | 2 +- .../java/kitchenpos/menus/domain/Menu.java | 34 ++++---------- .../kitchenpos/menus/domain/MenuProducts.java | 45 +++++++++++++++++++ 3 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/domain/MenuProducts.java diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index c8959599e..87a28defb 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -8,7 +8,7 @@ import java.util.UUID; public interface JpaMenuRepository extends MenuRepository, JpaRepository { - @Query("select m from Menu m join m.menuProducts mp where mp.productId = :productId") + @Query("select m from Menu m join m.menuProducts.menuProducts mp where mp.productId = :productId") @Override List findAllByProductId(@Param("productId") UUID productId); } diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java index d810b6ac4..8c94cf898 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -29,14 +29,8 @@ public class Menu { @Column(name = "displayed", nullable = false) private boolean displayed; - @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) - @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") - ) - private List menuProducts; + @Embedded + private MenuProducts menuProducts; @Transient private UUID menuGroupId; @@ -85,11 +79,11 @@ public void setDisplayed(final boolean displayed) { } public List getMenuProducts() { - return menuProducts; + return this.menuProducts.getMenuProducts(); } public void setMenuProducts(final List menuProducts) { - this.menuProducts = menuProducts; + this.menuProducts = new MenuProducts(menuProducts); } public UUID getMenuGroupId() { @@ -101,30 +95,18 @@ public void setMenuGroupId(final UUID menuGroupId) { } public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { - this.menuProducts.stream() - .filter(it -> it.getProductId().equals(productId)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("상품을 찾을 수가 없습니다. productId : " + productId)) - .updateProductPrice(productPrice); - - var totalProductPrice = getTotalProductPrice(); - if (this.menuPrice.isTotalProductPriceOver(totalProductPrice)) { + this.menuProducts.updateProductPrice(productId, productPrice); + if (this.menuPrice.isTotalProductPriceOver(this.menuProducts.getTotalProductPrice())) { this.displayed = false; } } - public BigDecimal getTotalProductPrice() { - return menuProducts.stream() - .map(MenuProduct::getProductPrice) - .reduce(BigDecimal.ZERO, BigDecimal::add); - } - public void updateMenuPrice(BigDecimal price) { - this.menuPrice = menuPrice.updatePrice(price, this.getTotalProductPrice()); + this.menuPrice = menuPrice.updatePrice(price, this.menuProducts.getTotalProductPrice()); } public void display() { - if (this.menuPrice.isTotalProductPriceOver(this.getTotalProductPrice())) { + if (this.menuPrice.isTotalProductPriceOver(this.menuProducts.getTotalProductPrice())) { throw new IllegalStateException("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); } this.displayed = true; diff --git a/src/main/java/kitchenpos/menus/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/domain/MenuProducts.java new file mode 100644 index 000000000..697e802cc --- /dev/null +++ b/src/main/java/kitchenpos/menus/domain/MenuProducts.java @@ -0,0 +1,45 @@ +package kitchenpos.menus.domain; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +@Embeddable +public class MenuProducts { + + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn( + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + ) + private List menuProducts; + + public MenuProducts() { + + } + + public MenuProducts(List menuProducts) { + this.menuProducts = menuProducts; + } + + public BigDecimal getTotalProductPrice() { + return this.menuProducts.stream() + .map(MenuProduct::getProductPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + public List getMenuProducts() { + return this.menuProducts; + } + + public void updateProductPrice(UUID productId, BigDecimal productPrice) { + this.menuProducts.stream() + .filter(it -> it.getProductId().equals(productId)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("상품을 찾을 수가 없습니다. productId : " + productId)) + .updateProductPrice(productPrice); + } +} From 0eddfeaad07e7a636912d604b3483c37b695e1a9 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 00:42:29 +0900 Subject: [PATCH 08/21] =?UTF-8?q?refactor:=20Menu=20create=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorders/application/OrderService.java | 2 +- .../eatinorders/domain/OrderLineItem.java | 2 +- .../MenuAntiCorruptionService.java | 44 ++++++++++++ .../menus/application/MenuService.java | 71 +++---------------- .../dto/MenuCreateProductRequest.java | 24 +++++++ .../application/dto/MenuCreateRequest.java | 48 +++++++++++++ .../menus/domain/JpaMenuRepository.java | 1 + .../kitchenpos/menus/domain/MenuProduct.java | 63 ---------------- .../menus/domain/MenuRepository.java | 2 + .../menus/{ => tobe}/domain/Menu.java | 30 +++++--- .../menus/{ => tobe}/domain/MenuPrice.java | 2 +- .../menus/tobe/domain/MenuProduct.java | 50 +++++++++++++ .../menus/{ => tobe}/domain/MenuProducts.java | 6 +- .../kitchenpos/menus/tobe/domain/Product.java | 35 +++++++++ .../menus/ui/MenuRestController.java | 5 +- 15 files changed, 248 insertions(+), 137 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java create mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java create mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java delete mode 100644 src/main/java/kitchenpos/menus/domain/MenuProduct.java rename src/main/java/kitchenpos/menus/{ => tobe}/domain/Menu.java (73%) rename src/main/java/kitchenpos/menus/{ => tobe}/domain/MenuPrice.java (96%) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java rename src/main/java/kitchenpos/menus/{ => tobe}/domain/MenuProducts.java (86%) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/Product.java diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index c20f52c7f..1fe216704 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -2,7 +2,7 @@ import kitchenpos.deliveryorders.infra.KitchenridersClient; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index e1e037caf..e95215a1b 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,6 +1,6 @@ package kitchenpos.eatinorders.domain; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import javax.persistence.*; import java.math.BigDecimal; diff --git a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java new file mode 100644 index 000000000..0386204ac --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java @@ -0,0 +1,44 @@ +package kitchenpos.menus.application; + +import kitchenpos.menus.application.dto.MenuCreateProductRequest; +import kitchenpos.menus.tobe.domain.MenuProduct; +import kitchenpos.menus.tobe.domain.MenuProducts; +import kitchenpos.products.tobe.domain.Product; +import kitchenpos.products.tobe.domain.ProductRepository; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class MenuAntiCorruptionService { + + private final ProductRepository productRepository; + + public MenuAntiCorruptionService(ProductRepository productRepository) { + this.productRepository = productRepository; + } + + public MenuProducts createMenuProducts(List menuCreateProductRequests) { + final List products = productRepository.findAllByIdIn( + menuCreateProductRequests.stream() + .map(MenuCreateProductRequest::getProductId) + .collect(Collectors.toList()) + ); + if (products.size() != menuCreateProductRequests.size()) { + throw new IllegalArgumentException(); + } + + var productMap = products.stream() + .map(it -> new kitchenpos.menus.tobe.domain.Product(it.getId(), it.getPrice())) + .collect(Collectors.toMap(kitchenpos.menus.tobe.domain.Product::getProductId, Function.identity())); + + var menuProducts = menuCreateProductRequests.stream().map(it -> { + var product = productMap.get(it.getProductId()); + return MenuProduct.of(product, it.getQuantity()); + }).collect(Collectors.toList()); + + return new MenuProducts(menuProducts); + } +} diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 373c08430..219e901c9 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,89 +1,40 @@ package kitchenpos.menus.application; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.*; -import kitchenpos.products.tobe.domain.Product; -import kitchenpos.products.tobe.domain.ProductRepository; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; -import java.util.stream.Collectors; @Service public class MenuService { private final MenuRepository menuRepository; private final MenuGroupRepository menuGroupRepository; - private final ProductRepository productRepository; + private final MenuAntiCorruptionService antiCorruptionService; private final PurgomalumClient purgomalumClient; - public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final PurgomalumClient purgomalumClient - ) { + public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupRepository, MenuAntiCorruptionService antiCorruptionService, PurgomalumClient purgomalumClient) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; - this.productRepository = productRepository; + this.antiCorruptionService = antiCorruptionService; this.purgomalumClient = purgomalumClient; } @Transactional - public Menu create(final Menu request) { - final BigDecimal price = request.getPrice(); - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } - final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); - final List menuProductRequests = request.getMenuProducts(); - if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { - throw new IllegalArgumentException(); - } - final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .collect(Collectors.toList()) - ); - if (products.size() != menuProductRequests.size()) { - throw new IllegalArgumentException(); - } - final List menuProducts = new ArrayList<>(); - BigDecimal sum = BigDecimal.ZERO; - for (final MenuProduct menuProductRequest : menuProductRequests) { - final long quantity = menuProductRequest.getQuantity(); - if (quantity < 0) { - throw new IllegalArgumentException(); - } - final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); - sum = sum.add( - product.getPrice() - .multiply(BigDecimal.valueOf(quantity)) - ); - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProductId(product.getId()); - menuProduct.setProductPrice(product.getPrice()); - menuProduct.setQuantity(quantity); - menuProducts.add(menuProduct); - } - if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); - } - final String name = request.getName(); + public Menu create(final MenuCreateRequest request) { + final var name = request.getName(); if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { throw new IllegalArgumentException(); } - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroup(menuGroup); - menu.setDisplayed(request.isDisplayed()); - menu.setMenuProducts(menuProducts); + final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) + .orElseThrow(NoSuchElementException::new); + final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts()); + final var menu = Menu.from(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts); return menuRepository.save(menu); } diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java new file mode 100644 index 000000000..ffd33d73a --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateProductRequest.java @@ -0,0 +1,24 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotNull; +import java.util.UUID; + +public class MenuCreateProductRequest { + @NotNull + private final UUID productId; + @NotNull + private final Long quantity; + + public MenuCreateProductRequest(UUID productId, Long quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public UUID getProductId() { + return productId; + } + + public Long getQuantity() { + return quantity; + } +} diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java new file mode 100644 index 000000000..3d03b5fa1 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuCreateRequest.java @@ -0,0 +1,48 @@ +package kitchenpos.menus.application.dto; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +public class MenuCreateRequest { + @NotNull + private final String name; + @NotNull + private final BigDecimal price; + @NotNull + private final UUID menuGroupId; + @NotNull + private final boolean displayed; + @NotEmpty + private final List menuProducts; + + public MenuCreateRequest(String name, BigDecimal price, UUID menuGroupId, boolean displayed, List menuProducts) { + this.name = name; + this.price = price; + this.menuGroupId = menuGroupId; + this.displayed = displayed; + this.menuProducts = menuProducts; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public UUID getMenuGroupId() { + return menuGroupId; + } + + public boolean isDisplayed() { + return displayed; + } + + public List getMenuProducts() { + return menuProducts; + } +} diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index 87a28defb..3ef05555b 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -1,5 +1,6 @@ package kitchenpos.menus.domain; +import kitchenpos.menus.tobe.domain.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java deleted file mode 100644 index 199ad6074..000000000 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ /dev/null @@ -1,63 +0,0 @@ -package kitchenpos.menus.domain; - - -import javax.persistence.*; -import java.math.BigDecimal; -import java.util.UUID; - -@Table(name = "menu_product") -@Entity -public class MenuProduct { - @Column(name = "seq") - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Id - private Long seq; - - @Column(name = "quantity", nullable = false) - private long quantity; - - @Column(name = "product_id") - private UUID productId; - - @Column(name = "price") - private BigDecimal productPrice; - - public MenuProduct() { - } - - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; - } - - public UUID getProductId() { - return productId; - } - - public BigDecimal getProductPrice() { - return this.productPrice.multiply(BigDecimal.valueOf(this.quantity)); - } - - public void setProductId(final UUID productId) { - this.productId = productId; - } - - public void updateProductPrice(BigDecimal productPrice) { - this.productPrice = productPrice; - } - - public void setProductPrice(BigDecimal productPrice) { - this.productPrice = productPrice; - } -} diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/domain/MenuRepository.java index 5fbaab864..ea4437b76 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/MenuRepository.java @@ -1,5 +1,7 @@ package kitchenpos.menus.domain; +import kitchenpos.menus.tobe.domain.Menu; + import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java similarity index 73% rename from src/main/java/kitchenpos/menus/domain/Menu.java rename to src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 8c94cf898..7eca20628 100644 --- a/src/main/java/kitchenpos/menus/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -1,9 +1,10 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; + +import kitchenpos.menus.domain.MenuGroup; import javax.persistence.*; import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; +import java.util.*; @Table(name = "menu") @Entity @@ -32,12 +33,25 @@ public class Menu { @Embedded private MenuProducts menuProducts; - @Transient - private UUID menuGroupId; + public static Menu from(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts) { + return new Menu(UUID.randomUUID(), name, new MenuPrice(price), menuGroup, displayed, menuProducts); + } public Menu() { } + public Menu(UUID id, String name, MenuPrice menuPrice, MenuGroup menuGroup, boolean displayed, MenuProducts menuProducts) { + if (menuPrice.isTotalProductPriceOver(menuProducts.getTotalProductPrice())) { + throw new IllegalArgumentException(); + } + this.id = id; + this.name = name; + this.menuPrice = menuPrice; + this.menuGroup = menuGroup; + this.displayed = displayed; + this.menuProducts = menuProducts; + } + public UUID getId() { return id; } @@ -87,11 +101,11 @@ public void setMenuProducts(final List menuProducts) { } public UUID getMenuGroupId() { - return menuGroupId; + return menuGroup.getId(); } - public void setMenuGroupId(final UUID menuGroupId) { - this.menuGroupId = menuGroupId; + public void setMenuGroupId(final MenuGroup menuGroup) { + this.menuGroup = menuGroup; } public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { diff --git a/src/main/java/kitchenpos/menus/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java similarity index 96% rename from src/main/java/kitchenpos/menus/domain/MenuPrice.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java index b18f28ef5..08220eb1b 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuPrice.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import javax.persistence.Column; import javax.persistence.Embeddable; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java new file mode 100644 index 000000000..7afe65a40 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java @@ -0,0 +1,50 @@ +package kitchenpos.menus.tobe.domain; + + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.UUID; + +@Table(name = "menu_product") +@Entity +public class MenuProduct { + @Column(name = "seq") + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + private Long seq; + + @Column(name = "quantity", nullable = false) + private long quantity; + + @Embedded + private Product product; + + public MenuProduct() { + } + + public MenuProduct(Long seq, long quantity, Product product) { + this.seq = seq; + this.quantity = quantity; + this.product = product; + } + + public Long getSeq() { + return seq; + } + + public UUID getProductId() { + return this.product.getProductId(); + } + + public BigDecimal getProductPrice() { + return this.product.getProductPrice().multiply(BigDecimal.valueOf(this.quantity)); + } + + public void updateProductPrice(BigDecimal productPrice) { + this.product.updatePrice(productPrice); + } + + public static MenuProduct of(Product product, long quantity) { + return new MenuProduct(null, quantity, product); + } +} diff --git a/src/main/java/kitchenpos/menus/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java similarity index 86% rename from src/main/java/kitchenpos/menus/domain/MenuProducts.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java index 697e802cc..3482118cc 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -1,8 +1,9 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import javax.persistence.*; import java.math.BigDecimal; import java.util.List; +import java.util.Objects; import java.util.UUID; @Embeddable @@ -22,6 +23,9 @@ public MenuProducts() { } public MenuProducts(List menuProducts) { + if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { + throw new IllegalArgumentException(); + } this.menuProducts = menuProducts; } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Product.java b/src/main/java/kitchenpos/menus/tobe/domain/Product.java new file mode 100644 index 000000000..46fd373e2 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/Product.java @@ -0,0 +1,35 @@ +package kitchenpos.menus.tobe.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.math.BigDecimal; +import java.util.UUID; + +@Embeddable +public class Product { + @Column(name = "product_id") + private UUID productId; + + @Column(name = "price") + private BigDecimal productPrice; + + public Product() { + } + + public Product(UUID productId, BigDecimal productPrice) { + this.productId = productId; + this.productPrice = productPrice; + } + + public UUID getProductId() { + return productId; + } + + public BigDecimal getProductPrice() { + return productPrice; + } + + public void updatePrice(BigDecimal productPrice) { + this.productPrice = productPrice; + } +} diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 7618f5a5f..31f80b606 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,8 +1,9 @@ package kitchenpos.menus.ui; import kitchenpos.menus.application.MenuService; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,7 +21,7 @@ public MenuRestController(final MenuService menuService) { } @PostMapping - public ResponseEntity create(@RequestBody final Menu request) { + public ResponseEntity create(@RequestBody final MenuCreateRequest request) { final Menu response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) .body(response); From d6873f4f15d6ed82293faabcda54aecada0d93f0 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:06:24 +0900 Subject: [PATCH 09/21] =?UTF-8?q?test:=20Menu=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EC=9D=B4=ED=9B=84=20test=20Case=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MenuAntiCorruptionService.java | 4 + .../menus/domain/JpaMenuRepository.java | 2 +- .../kitchenpos/menus/tobe/domain/Menu.java | 41 ++-------- .../menus/tobe/domain/MenuProduct.java | 12 +-- src/test/java/kitchenpos/Fixtures.java | 54 +------------ src/test/java/kitchenpos/MenuFixture.java | 45 +++++++++++ .../application/OrderServiceTest.java | 2 + .../application/InMemoryMenuRepository.java | 2 +- .../application/MenuGroupServiceTest.java | 2 +- .../menus/application/MenuServiceTest.java | 77 +++++++++---------- .../ProductPriceChangeListenerTest.java | 15 ++-- 11 files changed, 113 insertions(+), 143 deletions(-) create mode 100644 src/test/java/kitchenpos/MenuFixture.java diff --git a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java index 0386204ac..b44ff9343 100644 --- a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java +++ b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java @@ -21,6 +21,10 @@ public MenuAntiCorruptionService(ProductRepository productRepository) { } public MenuProducts createMenuProducts(List menuCreateProductRequests) { + if (Objects.isNull(menuCreateProductRequests) || menuCreateProductRequests.isEmpty()) { + throw new IllegalArgumentException(); + } + final List products = productRepository.findAllByIdIn( menuCreateProductRequests.stream() .map(MenuCreateProductRequest::getProductId) diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index 3ef05555b..14e0787e7 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -9,7 +9,7 @@ import java.util.UUID; public interface JpaMenuRepository extends MenuRepository, JpaRepository { - @Query("select m from Menu m join m.menuProducts.menuProducts mp where mp.productId = :productId") + @Query("select m from Menu m join m.menuProducts.menuProducts mp where mp.product.productId = :productId") @Override List findAllByProductId(@Param("productId") UUID productId); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 7eca20628..9395e9cff 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -34,16 +34,17 @@ public class Menu { private MenuProducts menuProducts; public static Menu from(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts) { - return new Menu(UUID.randomUUID(), name, new MenuPrice(price), menuGroup, displayed, menuProducts); + var menuPrice = new MenuPrice(price); + if (menuPrice.isTotalProductPriceOver(menuProducts.getTotalProductPrice())) { + throw new IllegalArgumentException(); + } + return new Menu(UUID.randomUUID(), name, menuPrice, menuGroup, displayed, menuProducts); } public Menu() { } public Menu(UUID id, String name, MenuPrice menuPrice, MenuGroup menuGroup, boolean displayed, MenuProducts menuProducts) { - if (menuPrice.isTotalProductPriceOver(menuProducts.getTotalProductPrice())) { - throw new IllegalArgumentException(); - } this.id = id; this.name = name; this.menuPrice = menuPrice; @@ -56,58 +57,26 @@ public UUID getId() { return id; } - public void setId(final UUID id) { - this.id = id; - } - public String getName() { return name; } - public void setName(final String name) { - this.name = name; - } - public BigDecimal getPrice() { return menuPrice.getPrice(); } - public void setPrice(final BigDecimal price) { - this.menuPrice = new MenuPrice(price); - } - public MenuGroup getMenuGroup() { return menuGroup; } - public void setMenuGroup(final MenuGroup menuGroup) { - this.menuGroup = menuGroup; - } - public boolean isDisplayed() { return displayed; } - public void setDisplayed(final boolean displayed) { - this.displayed = displayed; - } - public List getMenuProducts() { return this.menuProducts.getMenuProducts(); } - public void setMenuProducts(final List menuProducts) { - this.menuProducts = new MenuProducts(menuProducts); - } - - public UUID getMenuGroupId() { - return menuGroup.getId(); - } - - public void setMenuGroupId(final MenuGroup menuGroup) { - this.menuGroup = menuGroup; - } - public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { this.menuProducts.updateProductPrice(productId, productPrice); if (this.menuPrice.isTotalProductPriceOver(this.menuProducts.getTotalProductPrice())) { diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java index 7afe65a40..371565440 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java @@ -19,6 +19,10 @@ public class MenuProduct { @Embedded private Product product; + public static MenuProduct of(Product product, long quantity) { + return new MenuProduct(null, quantity, product); + } + public MenuProduct() { } @@ -28,10 +32,6 @@ public MenuProduct(Long seq, long quantity, Product product) { this.product = product; } - public Long getSeq() { - return seq; - } - public UUID getProductId() { return this.product.getProductId(); } @@ -43,8 +43,4 @@ public BigDecimal getProductPrice() { public void updateProductPrice(BigDecimal productPrice) { this.product.updatePrice(productPrice); } - - public static MenuProduct of(Product product, long quantity) { - return new MenuProduct(null, quantity, product); - } } diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java index 7facd84d3..d91bac540 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/Fixtures.java @@ -1,9 +1,6 @@ package kitchenpos; import kitchenpos.eatinorders.domain.*; -import kitchenpos.menus.domain.Menu; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuProduct; import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductName; import kitchenpos.products.tobe.domain.ProductPrice; @@ -14,56 +11,11 @@ import java.util.Random; import java.util.UUID; -public class Fixtures { - public static final UUID INVALID_ID = new UUID(0L, 0L); - - public static Menu menu() { - return menu(19_000L, true, menuProduct()); - } - - public static Menu menu(final long price, final MenuProduct... menuProducts) { - return menu(price, false, menuProducts); - } - - public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName("후라이드+후라이드"); - menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); - menu.setDisplayed(displayed); - menu.setMenuProducts(Arrays.asList(menuProducts)); - return menu; - } +import static kitchenpos.MenuFixture.menu; - public static MenuGroup menuGroup() { - return menuGroup("두마리메뉴"); - } - - public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; - } - - public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProductId(UUID.randomUUID()); - menuProduct.setProductPrice(BigDecimal.valueOf(16_000)); - menuProduct.setQuantity(2L); - return menuProduct; - } +public class Fixtures { - public static MenuProduct menuProduct(final Product product, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProductId(product.getId()); - menuProduct.setProductPrice(product.getPrice()); - menuProduct.setQuantity(quantity); - return menuProduct; - } + public static final UUID INVALID_ID = new UUID(0L, 0L); public static Order order(final OrderStatus status, final String deliveryAddress) { final Order order = new Order(); diff --git a/src/test/java/kitchenpos/MenuFixture.java b/src/test/java/kitchenpos/MenuFixture.java new file mode 100644 index 000000000..fa6a31009 --- /dev/null +++ b/src/test/java/kitchenpos/MenuFixture.java @@ -0,0 +1,45 @@ +package kitchenpos; + +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.*; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Random; +import java.util.UUID; + +public class MenuFixture { + public static final UUID INVALID_ID = new UUID(0L, 0L); + + public static Menu menu() { + return menu(19_000L, true, menuProduct()); + } + + public static Menu menu(final long price, final MenuProduct... menuProducts) { + return menu(price, false, menuProducts); + } + + public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { + return new Menu(UUID.randomUUID(), "후라이드+후라이드", new MenuPrice(BigDecimal.valueOf(price)), menuGroup(), displayed, + new MenuProducts(Arrays.asList(menuProducts))); + } + + public static MenuGroup menuGroup() { + return menuGroup("두마리메뉴"); + } + + public static MenuGroup menuGroup(final String name) { + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(UUID.randomUUID()); + menuGroup.setName(name); + return menuGroup; + } + + public static MenuProduct menuProduct() { + return new MenuProduct(new Random().nextLong(), 2L, new Product(UUID.randomUUID(), BigDecimal.valueOf(16_000))); + } + + public static MenuProduct menuProduct(final Product product, final long quantity) { + return new MenuProduct(new Random().nextLong(), quantity, new Product(product.getProductId(), product.getProductPrice())); + } +} diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 96bf0f286..c39412b6a 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -13,6 +13,8 @@ import java.util.*; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.menu; +import static kitchenpos.MenuFixture.menuProduct; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index 6bd827427..4fa517fb9 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -1,6 +1,6 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuRepository; import java.util.*; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a5fbc71d1..a8ca8b7d2 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -10,7 +10,7 @@ import java.util.List; -import static kitchenpos.Fixtures.menuGroup; +import static kitchenpos.MenuFixture.menuGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 2df06b730..edc3b49fe 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -1,13 +1,15 @@ package kitchenpos.menus.application; +import kitchenpos.MenuFixture; +import kitchenpos.menus.application.dto.MenuCreateProductRequest; +import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuProduct; import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.Product; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; import kitchenpos.products.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; @@ -23,6 +25,7 @@ import java.util.*; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -30,6 +33,7 @@ class MenuServiceTest { private MenuRepository menuRepository; private MenuGroupRepository menuGroupRepository; + private MenuAntiCorruptionService menuAntiCorruptionService; private ProductRepository productRepository; private PurgomalumClient purgomalumClient; private MenuService menuService; @@ -42,16 +46,18 @@ void setUp() { menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + menuAntiCorruptionService = new MenuAntiCorruptionService(productRepository); + menuService = new MenuService(menuRepository, menuGroupRepository, menuAntiCorruptionService, purgomalumClient); menuGroupId = menuGroupRepository.save(menuGroup()).getId(); - product = productRepository.save(product("후라이드", 16_000L)); + var savedProduct = productRepository.save(product()); + product = new Product(savedProduct.getId(), savedProduct.getPrice()); } @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") @Test void create() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); final Menu actual = menuService.create(expected); assertThat(actual).isNotNull(); @@ -68,8 +74,8 @@ void create() { @DisplayName("상품이 없으면 등록할 수 없다.") @MethodSource("menuProducts") @ParameterizedTest - void create(final List menuProducts) { - final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); + void create(final List menuProducts) { + final MenuCreateRequest expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -78,15 +84,15 @@ private static List menuProducts() { return Arrays.asList( null, Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) + Arguments.of(Arrays.asList(createMenuProductRequest(MenuFixture.INVALID_ID, 2L))) ); } @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") @Test void createNegativeQuantity() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), -1L) ); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); @@ -97,8 +103,8 @@ void createNegativeQuantity() { @NullSource @ParameterizedTest void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); @@ -107,8 +113,8 @@ void create(final BigDecimal price) { @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") @Test void createExpensiveMenu() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); @@ -118,8 +124,8 @@ void createExpensiveMenu() { @NullSource @ParameterizedTest void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(NoSuchElementException.class); @@ -130,8 +136,8 @@ void create(final UUID menuGroupId) { @NullSource @ParameterizedTest void create(final String name) { - final Menu expected = createMenuRequest( - name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) + final MenuCreateRequest expected = createMenuRequest( + name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getProductId(), 2L) ); assertThatThrownBy(() -> menuService.create(expected)) .isInstanceOf(IllegalArgumentException.class); @@ -198,57 +204,48 @@ void findAll() { assertThat(actual).hasSize(1); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final MenuCreateProductRequest... menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final BigDecimal price, final UUID menuGroupId, final boolean displayed, - final MenuProduct... menuProducts + final MenuCreateProductRequest... menuProducts ) { return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final long price, final UUID menuGroupId, final boolean displayed, - final List menuProducts + final List menuProducts ) { return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); } - private Menu createMenuRequest( + private MenuCreateRequest createMenuRequest( final String name, final BigDecimal price, final UUID menuGroupId, final boolean displayed, - final List menuProducts + final List menuProducts ) { - final Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setDisplayed(displayed); - menu.setMenuProducts(menuProducts); - return menu; + return new MenuCreateRequest(name, price, menuGroupId, displayed, menuProducts); } - private static MenuProduct createMenuProductRequest(final UUID productId, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProductId(productId); - menuProduct.setQuantity(quantity); - return menuProduct; + private static MenuCreateProductRequest createMenuProductRequest(final UUID productId, final long quantity) { + return new MenuCreateProductRequest(productId, quantity); } private MenuPriceChangeRequest changePriceRequest(BigDecimal price) { diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 2860629eb..79562e33c 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -1,9 +1,10 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.infra.listener.ProductPriceChangeListener; +import kitchenpos.menus.tobe.domain.Product; import kitchenpos.products.application.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.tobe.domain.*; @@ -12,9 +13,10 @@ import org.junit.jupiter.api.Test; import java.math.BigDecimal; -import java.util.Random; import static kitchenpos.Fixtures.*; +import static kitchenpos.MenuFixture.menu; +import static kitchenpos.MenuFixture.menuProduct; import static org.assertj.core.api.Assertions.assertThat; @@ -24,6 +26,7 @@ class ProductPriceChangeListenerTest { private MenuRepository menuRepository; private MenuGroupRepository menuGroupRepository; private ProductRepository productRepository; + private MenuAntiCorruptionService menuAntiCorruptionService; private PurgomalumClient purgomalumClient; private MenuService menuService; private Product product; @@ -34,16 +37,18 @@ void setUp() { menuGroupRepository = new InMemoryMenuGroupRepository(); productRepository = new InMemoryProductRepository(); purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + menuAntiCorruptionService = new MenuAntiCorruptionService(productRepository); + menuService = new MenuService(menuRepository, menuGroupRepository, menuAntiCorruptionService, purgomalumClient); productPriceChangeListener = new ProductPriceChangeListener(menuService); - product = productRepository.save(product("후라이드", 16_000L)); + var savedProduct = productRepository.save(product()); + product = new Product(savedProduct.getId(), savedProduct.getPrice()); } @DisplayName("상품의 가격이 변경될 때 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다.") @Test void changePriceInMenu() { final Menu menu = menuRepository.save(menu(19_000L, menuProduct(product, 2L))); - productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getId(), new ProductPrice(BigDecimal.valueOf(19_000L)))); + productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getProductId(), new ProductPrice(BigDecimal.valueOf(19_000L)))); assertThat(menu.isDisplayed()).isFalse(); } From bc84687202cbf073e6040d57184840ffdf80d37b Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:16:10 +0900 Subject: [PATCH 10/21] =?UTF-8?q?refactor:=20PurgomalumClient=20clients=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purgomalum/DefaultPurgomalumClient.java | 10 +++++----- .../java/kitchenpos/menus/application/MenuService.java | 8 ++------ src/main/java/kitchenpos/menus/tobe/domain/Menu.java | 5 ++++- .../kitchenpos/menus/tobe/domain/PurgomalumClient.java | 5 +++++ .../application => clients}/FakePurgomalumClient.java | 4 ++-- .../kitchenpos/menus/application/MenuServiceTest.java | 4 ++-- .../application/ProductPriceChangeListenerTest.java | 7 +++++-- .../products/application/ProductServiceTest.java | 1 + 8 files changed, 26 insertions(+), 18 deletions(-) rename src/main/java/kitchenpos/{products/infra => clients}/purgomalum/DefaultPurgomalumClient.java (82%) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java rename src/test/java/kitchenpos/{products/application => clients}/FakePurgomalumClient.java (75%) diff --git a/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java similarity index 82% rename from src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java index df914a89f..bed21047d 100644 --- a/src/main/java/kitchenpos/products/infra/purgomalum/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/clients/purgomalum/DefaultPurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra.purgomalum; +package kitchenpos.clients.purgomalum; import kitchenpos.products.tobe.domain.PurgomalumClient; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -9,7 +9,7 @@ import java.net.URI; @Component -public class DefaultPurgomalumClient implements PurgomalumClient { +public class DefaultPurgomalumClient implements PurgomalumClient, kitchenpos.menus.tobe.domain.PurgomalumClient { private final RestTemplate restTemplate; public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @@ -19,9 +19,9 @@ public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @Override public boolean containsProfanity(final String text) { final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity") - .queryParam("text", text) - .build() - .toUri(); + .queryParam("text", text) + .build() + .toUri(); return Boolean.parseBoolean(restTemplate.getForObject(url, String.class)); } } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 219e901c9..8b8929aac 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -4,7 +4,7 @@ import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.*; import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.products.tobe.domain.PurgomalumClient; +import kitchenpos.menus.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,14 +27,10 @@ public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupR @Transactional public Menu create(final MenuCreateRequest request) { - final var name = request.getName(); - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts()); - final var menu = Menu.from(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts); + final var menu = Menu.from(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient); return menuRepository.save(menu); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 9395e9cff..8d8281384 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -33,7 +33,10 @@ public class Menu { @Embedded private MenuProducts menuProducts; - public static Menu from(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts) { + public static Menu from(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { + if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException(); + } var menuPrice = new MenuPrice(price); if (menuPrice.isTotalProductPriceOver(menuProducts.getTotalProductPrice())) { throw new IllegalArgumentException(); diff --git a/src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java b/src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java new file mode 100644 index 000000000..4be378eb2 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/PurgomalumClient.java @@ -0,0 +1,5 @@ +package kitchenpos.menus.tobe.domain; + +public interface PurgomalumClient { + boolean containsProfanity(String text); +} diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/clients/FakePurgomalumClient.java similarity index 75% rename from src/test/java/kitchenpos/products/application/FakePurgomalumClient.java rename to src/test/java/kitchenpos/clients/FakePurgomalumClient.java index 98622a6eb..b35b6940e 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/clients/FakePurgomalumClient.java @@ -1,11 +1,11 @@ -package kitchenpos.products.application; +package kitchenpos.clients; import kitchenpos.products.tobe.domain.PurgomalumClient; import java.util.Arrays; import java.util.List; -public class FakePurgomalumClient implements PurgomalumClient { +public class FakePurgomalumClient implements PurgomalumClient, kitchenpos.menus.tobe.domain.PurgomalumClient { private static final List profanities; static { diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index edc3b49fe..fce3e9423 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -8,10 +8,10 @@ import kitchenpos.menus.domain.MenuGroupRepository; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Product; -import kitchenpos.products.application.FakePurgomalumClient; +import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.tobe.domain.ProductRepository; -import kitchenpos.products.tobe.domain.PurgomalumClient; +import kitchenpos.menus.tobe.domain.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 79562e33c..c0e27f9ef 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -5,9 +5,12 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.infra.listener.ProductPriceChangeListener; import kitchenpos.menus.tobe.domain.Product; -import kitchenpos.products.application.FakePurgomalumClient; +import kitchenpos.clients.FakePurgomalumClient; +import kitchenpos.menus.tobe.domain.PurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.*; +import kitchenpos.products.tobe.domain.ProductPrice; +import kitchenpos.products.tobe.domain.ProductPriceChangeEvent; +import kitchenpos.products.tobe.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index cf2cdd01d..26ae08533 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -1,5 +1,6 @@ package kitchenpos.products.application; +import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.products.application.dto.ProductRequest; import kitchenpos.products.application.dto.ProductResponse; import kitchenpos.products.tobe.domain.ProductRepository; From cefc29c95b25d3a57a6528705f2231c458bba6dd Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:19:13 +0900 Subject: [PATCH 11/21] =?UTF-8?q?refactor:=20ProductPriceChangeEvent?= =?UTF-8?q?=EC=9D=98=20=EA=B0=80=EA=B2=A9=EC=A0=95=EB=B3=B4=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/products/tobe/domain/Product.java | 2 +- .../products/tobe/domain/ProductPriceChangeEvent.java | 6 +++--- .../menus/application/ProductPriceChangeListenerTest.java | 5 +---- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/kitchenpos/products/tobe/domain/Product.java b/src/main/java/kitchenpos/products/tobe/domain/Product.java index 48191bc02..f3c39b57c 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/Product.java +++ b/src/main/java/kitchenpos/products/tobe/domain/Product.java @@ -47,6 +47,6 @@ public BigDecimal getPrice() { public void changePrice(final ProductPrice productPrice) { this.price = productPrice; - registerEvent(new ProductPriceChangeEvent(this.id, productPrice)); + registerEvent(new ProductPriceChangeEvent(this.id, this.getPrice())); } } diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java index 099dc8197..3eda534c7 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java +++ b/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java @@ -5,9 +5,9 @@ public class ProductPriceChangeEvent { private final UUID id; - private final ProductPrice productPrice; + private final BigDecimal productPrice; - public ProductPriceChangeEvent(UUID id, ProductPrice productPrice) { + public ProductPriceChangeEvent(UUID id, BigDecimal productPrice) { this.id = id; this.productPrice = productPrice; } @@ -17,6 +17,6 @@ public UUID getId() { } public BigDecimal getProductPrice() { - return this.productPrice.getPrice(); + return this.productPrice; } } diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index c0e27f9ef..b2b7c814c 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -8,15 +8,12 @@ import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.menus.tobe.domain.PurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.ProductPrice; import kitchenpos.products.tobe.domain.ProductPriceChangeEvent; import kitchenpos.products.tobe.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.math.BigDecimal; - import static kitchenpos.Fixtures.*; import static kitchenpos.MenuFixture.menu; import static kitchenpos.MenuFixture.menuProduct; @@ -51,7 +48,7 @@ void setUp() { @Test void changePriceInMenu() { final Menu menu = menuRepository.save(menu(19_000L, menuProduct(product, 2L))); - productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getProductId(), new ProductPrice(BigDecimal.valueOf(19_000L)))); + productPriceChangeListener.listen(new ProductPriceChangeEvent(product.getProductId(), product.getProductPrice())); assertThat(menu.isDisplayed()).isFalse(); } From 0540594f2fe8908447ba1ac064a2aecc3675b8f8 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:19:49 +0900 Subject: [PATCH 12/21] =?UTF-8?q?move:=20ui=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/{ => infra}/ui/MenuGroupRestController.java | 2 +- .../kitchenpos/menus/{ => infra}/ui/MenuRestController.java | 2 +- .../products/{ => infra}/ui/ProductRestController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/kitchenpos/menus/{ => infra}/ui/MenuGroupRestController.java (96%) rename src/main/java/kitchenpos/menus/{ => infra}/ui/MenuRestController.java (97%) rename src/main/java/kitchenpos/products/{ => infra}/ui/ProductRestController.java (97%) diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java similarity index 96% rename from src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java index 1a5d0fd06..82c29d0f9 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.ui; +package kitchenpos.menus.infra.ui; import kitchenpos.menus.application.MenuGroupService; import kitchenpos.menus.domain.MenuGroup; diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java similarity index 97% rename from src/main/java/kitchenpos/menus/ui/MenuRestController.java rename to src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java index 31f80b606..e35cb28d5 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/infra/ui/MenuRestController.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.ui; +package kitchenpos.menus.infra.ui; import kitchenpos.menus.application.MenuService; import kitchenpos.menus.application.dto.MenuCreateRequest; diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/infra/ui/ProductRestController.java similarity index 97% rename from src/main/java/kitchenpos/products/ui/ProductRestController.java rename to src/main/java/kitchenpos/products/infra/ui/ProductRestController.java index a1a9498a8..50e3b9730 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/infra/ui/ProductRestController.java @@ -1,4 +1,4 @@ -package kitchenpos.products.ui; +package kitchenpos.products.infra.ui; import kitchenpos.products.application.ProductService; import kitchenpos.products.application.dto.ProductRequest; From 778dcec6ea28852e325829108ce37140dce8e89a Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:21:51 +0900 Subject: [PATCH 13/21] =?UTF-8?q?move:=20domain=20package=20=EC=A4=91=20Me?= =?UTF-8?q?nuJpaRepository=20=EC=9D=84=20infra/repository=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/eatinorders/application/OrderService.java | 2 +- src/main/java/kitchenpos/menus/application/MenuService.java | 1 + .../{domain => infra/repository}/JpaMenuGroupRepository.java | 4 +++- .../menus/{domain => infra/repository}/JpaMenuRepository.java | 3 ++- .../kitchenpos/menus/{ => tobe}/domain/MenuRepository.java | 2 +- .../kitchenpos/eatinorders/application/OrderServiceTest.java | 2 +- .../kitchenpos/menus/application/InMemoryMenuRepository.java | 2 +- .../java/kitchenpos/menus/application/MenuServiceTest.java | 2 +- .../menus/application/ProductPriceChangeListenerTest.java | 2 +- 9 files changed, 12 insertions(+), 8 deletions(-) rename src/main/java/kitchenpos/menus/{domain => infra/repository}/JpaMenuGroupRepository.java (58%) rename src/main/java/kitchenpos/menus/{domain => infra/repository}/JpaMenuRepository.java (85%) rename src/main/java/kitchenpos/menus/{ => tobe}/domain/MenuRepository.java (90%) diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index 1fe216704..ad45015d1 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -3,7 +3,7 @@ import kitchenpos.deliveryorders.infra.KitchenridersClient; import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 8b8929aac..22d154394 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -3,6 +3,7 @@ import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.domain.*; +import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.tobe.domain.PurgomalumClient; import org.springframework.stereotype.Service; diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java similarity index 58% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java index 233488198..a16b39aee 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.repository; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuRepository.java similarity index 85% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/infra/repository/JpaMenuRepository.java index 14e0787e7..4bcbd29d5 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuRepository.java @@ -1,5 +1,6 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.repository; +import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/kitchenpos/menus/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java similarity index 90% rename from src/main/java/kitchenpos/menus/domain/MenuRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java index ea4437b76..eb0fa0c15 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import kitchenpos.menus.tobe.domain.Menu; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index c39412b6a..3d765cb5e 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -2,7 +2,7 @@ import kitchenpos.eatinorders.domain.*; import kitchenpos.menus.application.InMemoryMenuRepository; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index 4fa517fb9..b3e19c4e1 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; import java.util.*; import java.util.stream.Collectors; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index fce3e9423..f0ca1d4ad 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -6,7 +6,7 @@ import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Product; import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index b2b7c814c..63770b367 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -2,7 +2,7 @@ import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.domain.MenuGroupRepository; -import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.infra.listener.ProductPriceChangeListener; import kitchenpos.menus.tobe.domain.Product; import kitchenpos.clients.FakePurgomalumClient; From 287979f9a688dcad653cbddbf4605f2586767b01 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:23:57 +0900 Subject: [PATCH 14/21] =?UTF-8?q?move:=20ProductPriceChangeEvent=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20shared/event=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/infra/listener/ProductPriceChangeListener.java | 2 +- src/main/java/kitchenpos/products/tobe/domain/Product.java | 1 + .../tobe/domain => shared}/ProductPriceChangeEvent.java | 2 +- .../menus/application/ProductPriceChangeListenerTest.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename src/main/java/kitchenpos/{products/tobe/domain => shared}/ProductPriceChangeEvent.java (91%) diff --git a/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java index 763879c09..6915e33ce 100644 --- a/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java @@ -1,7 +1,7 @@ package kitchenpos.menus.infra.listener; import kitchenpos.menus.application.MenuService; -import kitchenpos.products.tobe.domain.ProductPriceChangeEvent; +import kitchenpos.shared.ProductPriceChangeEvent; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; diff --git a/src/main/java/kitchenpos/products/tobe/domain/Product.java b/src/main/java/kitchenpos/products/tobe/domain/Product.java index f3c39b57c..bc44f9992 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/Product.java +++ b/src/main/java/kitchenpos/products/tobe/domain/Product.java @@ -1,6 +1,7 @@ package kitchenpos.products.tobe.domain; +import kitchenpos.shared.ProductPriceChangeEvent; import org.springframework.data.domain.AbstractAggregateRoot; import javax.persistence.*; diff --git a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java similarity index 91% rename from src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java rename to src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java index 3eda534c7..a195c5dbe 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/ProductPriceChangeEvent.java +++ b/src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java @@ -1,4 +1,4 @@ -package kitchenpos.products.tobe.domain; +package kitchenpos.shared; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 63770b367..48e40a4ef 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -8,7 +8,7 @@ import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.menus.tobe.domain.PurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.products.tobe.domain.ProductPriceChangeEvent; +import kitchenpos.shared.ProductPriceChangeEvent; import kitchenpos.products.tobe.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; From c3f41e4cbab114f8cdb5d03f4a93c546146e2f56 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:29:26 +0900 Subject: [PATCH 15/21] =?UTF-8?q?refactor:=20menuGroup=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/application/MenuGroupService.java | 17 +++++---------- .../menus/application/MenuService.java | 2 +- .../dto/MenuGroupCreateRequest.java | 13 ++++++++++++ .../repository/JpaMenuGroupRepository.java | 4 ++-- .../infra/ui/MenuGroupRestController.java | 5 +++-- .../kitchenpos/menus/tobe/domain/Menu.java | 2 -- .../menus/{ => tobe}/domain/MenuGroup.java | 21 ++++++++++++------- .../domain/MenuGroupRepository.java | 2 +- src/test/java/kitchenpos/MenuFixture.java | 7 ++----- .../InMemoryMenuGroupRepository.java | 4 ++-- .../application/MenuGroupServiceTest.java | 15 +++++++------ .../menus/application/MenuServiceTest.java | 2 +- .../ProductPriceChangeListenerTest.java | 2 +- 13 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java rename src/main/java/kitchenpos/menus/{ => tobe}/domain/MenuGroup.java (63%) rename src/main/java/kitchenpos/menus/{ => tobe}/domain/MenuGroupRepository.java (86%) diff --git a/src/main/java/kitchenpos/menus/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java index c468893a2..7b4734331 100644 --- a/src/main/java/kitchenpos/menus/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,13 +1,12 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; -import java.util.UUID; @Service public class MenuGroupService { @@ -18,14 +17,8 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository) { } @Transactional - public MenuGroup create(final MenuGroup request) { - final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); + public MenuGroup create(final MenuGroupCreateRequest request) { + var menuGroup = MenuGroup.newOne(request.getName()); return menuGroupRepository.save(menuGroup); } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 22d154394..85a77ba07 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -2,7 +2,7 @@ import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; -import kitchenpos.menus.domain.*; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Menu; import kitchenpos.menus.tobe.domain.PurgomalumClient; diff --git a/src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java b/src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java new file mode 100644 index 000000000..f7cab9c45 --- /dev/null +++ b/src/main/java/kitchenpos/menus/application/dto/MenuGroupCreateRequest.java @@ -0,0 +1,13 @@ +package kitchenpos.menus.application.dto; + +public class MenuGroupCreateRequest { + private final String name; + + public MenuGroupCreateRequest(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java index a16b39aee..cded4b9cf 100644 --- a/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/infra/repository/JpaMenuGroupRepository.java @@ -1,7 +1,7 @@ package kitchenpos.menus.infra.repository; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java index 82c29d0f9..b0465a3fb 100644 --- a/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/infra/ui/MenuGroupRestController.java @@ -1,7 +1,8 @@ package kitchenpos.menus.infra.ui; import kitchenpos.menus.application.MenuGroupService; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,7 +19,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { } @PostMapping - public ResponseEntity create(@RequestBody final MenuGroup request) { + public ResponseEntity create(@RequestBody final MenuGroupCreateRequest request) { final MenuGroup response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) .body(response); diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 8d8281384..b06afc4de 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -1,7 +1,5 @@ package kitchenpos.menus.tobe.domain; -import kitchenpos.menus.domain.MenuGroup; - import javax.persistence.*; import java.math.BigDecimal; import java.util.*; diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java similarity index 63% rename from src/main/java/kitchenpos/menus/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java index e65017271..d9ef7a77c 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java @@ -1,9 +1,10 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import java.util.Objects; import java.util.UUID; @Table(name = "menu_group") @@ -16,22 +17,26 @@ public class MenuGroup { @Column(name = "name", nullable = false) private String name; + public static MenuGroup newOne(String name) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(); + } + return new MenuGroup(UUID.randomUUID(), name); + } + public MenuGroup() { } + public MenuGroup(UUID id, String name) { + this.id = id; + this.name = name; + } public UUID getId() { return id; } - public void setId(final UUID id) { - this.id = id; - } - public String getName() { return name; } - public void setName(final String name) { - this.name = name; - } } diff --git a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java similarity index 86% rename from src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java index b25e6acbc..dcf1595ba 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.tobe.domain; import java.util.List; import java.util.Optional; diff --git a/src/test/java/kitchenpos/MenuFixture.java b/src/test/java/kitchenpos/MenuFixture.java index fa6a31009..fe29b0b52 100644 --- a/src/test/java/kitchenpos/MenuFixture.java +++ b/src/test/java/kitchenpos/MenuFixture.java @@ -1,6 +1,6 @@ package kitchenpos; -import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroup; import kitchenpos.menus.tobe.domain.*; import java.math.BigDecimal; @@ -29,10 +29,7 @@ public static MenuGroup menuGroup() { } public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; + return new MenuGroup(UUID.randomUUID(), name); } public static MenuProduct menuProduct() { diff --git a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java index 9b50d73bb..73d88c1f0 100644 --- a/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import java.util.*; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index a8ca8b7d2..cc052b4d3 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -1,7 +1,8 @@ package kitchenpos.menus.application; -import kitchenpos.menus.domain.MenuGroup; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.application.dto.MenuGroupCreateRequest; +import kitchenpos.menus.tobe.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -28,7 +29,7 @@ void setUp() { @DisplayName("메뉴 그룹을 등록할 수 있다.") @Test void create() { - final MenuGroup expected = createMenuGroupRequest("두마리메뉴"); + final MenuGroupCreateRequest expected = createMenuGroupRequest("두마리메뉴"); final MenuGroup actual = menuGroupService.create(expected); assertThat(actual).isNotNull(); assertAll( @@ -41,7 +42,7 @@ void create() { @NullAndEmptySource @ParameterizedTest void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); + final MenuGroupCreateRequest expected = createMenuGroupRequest(name); assertThatThrownBy(() -> menuGroupService.create(expected)) .isInstanceOf(IllegalArgumentException.class); } @@ -54,9 +55,7 @@ void findAll() { assertThat(actual).hasSize(1); } - private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; + private MenuGroupCreateRequest createMenuGroupRequest(final String name) { + return new MenuGroupCreateRequest(name); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index f0ca1d4ad..7334723ee 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -5,7 +5,7 @@ import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Product; import kitchenpos.clients.FakePurgomalumClient; diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 48e40a4ef..0abf35bfa 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -1,7 +1,7 @@ package kitchenpos.menus.application; import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.tobe.domain.MenuGroupRepository; import kitchenpos.menus.tobe.domain.MenuRepository; import kitchenpos.menus.infra.listener.ProductPriceChangeListener; import kitchenpos.menus.tobe.domain.Product; From 22260fd7fe107242225b76fe0588118fa382efb2 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:31:34 +0900 Subject: [PATCH 16/21] =?UTF-8?q?refactor:=20=EB=B9=84=EC=A6=88=EB=8B=88?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=20=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=EC=84=9C=20newOne=EC=9D=84=20=EC=93=B0?= =?UTF-8?q?=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 --- .../menus/application/MenuAntiCorruptionService.java | 4 ++-- .../java/kitchenpos/menus/application/MenuService.java | 2 +- src/main/java/kitchenpos/menus/tobe/domain/Menu.java | 2 +- .../java/kitchenpos/menus/tobe/domain/MenuProduct.java | 2 +- .../kitchenpos/menus/tobe/domain/MenuProducts.java | 10 +++++++--- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java index b44ff9343..1c98a1dfb 100644 --- a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java +++ b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java @@ -40,9 +40,9 @@ public MenuProducts createMenuProducts(List menuCreate var menuProducts = menuCreateProductRequests.stream().map(it -> { var product = productMap.get(it.getProductId()); - return MenuProduct.of(product, it.getQuantity()); + return MenuProduct.newOne(product, it.getQuantity()); }).collect(Collectors.toList()); - return new MenuProducts(menuProducts); + return MenuProducts.newOne(menuProducts); } } diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 85a77ba07..8f7cf640a 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -31,7 +31,7 @@ public Menu create(final MenuCreateRequest request) { final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) .orElseThrow(NoSuchElementException::new); final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts()); - final var menu = Menu.from(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient); + final var menu = Menu.newOne(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient); return menuRepository.save(menu); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index b06afc4de..31155d9b5 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -31,7 +31,7 @@ public class Menu { @Embedded private MenuProducts menuProducts; - public static Menu from(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { + public static Menu newOne(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { throw new IllegalArgumentException(); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java index 371565440..80e0404cc 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java @@ -19,7 +19,7 @@ public class MenuProduct { @Embedded private Product product; - public static MenuProduct of(Product product, long quantity) { + public static MenuProduct newOne(Product product, long quantity) { return new MenuProduct(null, quantity, product); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java index 3482118cc..4f89b24af 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -18,14 +18,18 @@ public class MenuProducts { ) private List menuProducts; + public static MenuProducts newOne(List menuProducts) { + if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { + throw new IllegalArgumentException(); + } + return new MenuProducts(menuProducts); + } + public MenuProducts() { } public MenuProducts(List menuProducts) { - if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { - throw new IllegalArgumentException(); - } this.menuProducts = menuProducts; } From 292d199ba09e4d92d6e3a9376cc22a40faf67f6f Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:33:27 +0900 Subject: [PATCH 17/21] =?UTF-8?q?rename:=20=EC=9C=A0=EB=B9=84=EC=BF=BC?= =?UTF-8?q?=ED=84=B0=EC=8A=A4=20=EC=96=B8=EC=96=B4=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20totalProductPrice=EB=A5=BC=20amount=EB=A1=9C=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/kitchenpos/menus/tobe/domain/Menu.java | 8 ++++---- src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java | 8 ++++---- .../java/kitchenpos/menus/tobe/domain/MenuProducts.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 31155d9b5..408cad717 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -36,7 +36,7 @@ public static Menu newOne(String name, BigDecimal price, boolean displayed, Menu throw new IllegalArgumentException(); } var menuPrice = new MenuPrice(price); - if (menuPrice.isTotalProductPriceOver(menuProducts.getTotalProductPrice())) { + if (menuPrice.isAmountOver(menuProducts.getAmount())) { throw new IllegalArgumentException(); } return new Menu(UUID.randomUUID(), name, menuPrice, menuGroup, displayed, menuProducts); @@ -80,17 +80,17 @@ public List getMenuProducts() { public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { this.menuProducts.updateProductPrice(productId, productPrice); - if (this.menuPrice.isTotalProductPriceOver(this.menuProducts.getTotalProductPrice())) { + if (this.menuPrice.isAmountOver(this.menuProducts.getAmount())) { this.displayed = false; } } public void updateMenuPrice(BigDecimal price) { - this.menuPrice = menuPrice.updatePrice(price, this.menuProducts.getTotalProductPrice()); + this.menuPrice = menuPrice.updatePrice(price, this.menuProducts.getAmount()); } public void display() { - if (this.menuPrice.isTotalProductPriceOver(this.menuProducts.getTotalProductPrice())) { + if (this.menuPrice.isAmountOver(this.menuProducts.getAmount())) { throw new IllegalStateException("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); } this.displayed = true; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java index 08220eb1b..634f75e5f 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -24,15 +24,15 @@ public BigDecimal getPrice() { return price; } - public MenuPrice updatePrice(BigDecimal price, BigDecimal totalProductPrice) { + public MenuPrice updatePrice(BigDecimal price, BigDecimal amount) { MenuPrice newMenuPrice = new MenuPrice(price); - if (newMenuPrice.isTotalProductPriceOver(totalProductPrice)) { + if (newMenuPrice.isAmountOver(amount)) { throw new IllegalArgumentException("총 상품 가격이 메뉴 가격보다 큽니다."); } return newMenuPrice; } - public boolean isTotalProductPriceOver(BigDecimal totalProductPrice) { - return this.price.compareTo(totalProductPrice) > 0; + public boolean isAmountOver(BigDecimal amount) { + return this.price.compareTo(amount) > 0; } } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java index 4f89b24af..a1b516b8e 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -33,7 +33,7 @@ public MenuProducts(List menuProducts) { this.menuProducts = menuProducts; } - public BigDecimal getTotalProductPrice() { + public BigDecimal getAmount() { return this.menuProducts.stream() .map(MenuProduct::getProductPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); From 2aef48239ccd3d69b2babb1b19f925e62312e2b0 Mon Sep 17 00:00:00 2001 From: flamme Date: Sun, 26 Jan 2025 01:34:32 +0900 Subject: [PATCH 18/21] =?UTF-8?q?move:=20ProductPriceChangeEvent=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=B4=EC=84=9C=20=EA=B0=81=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20=EB=8C=80=ED=95=B4=20=EA=B3=B5=EC=9C=A0?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=9D=B4?= =?UTF-8?q?=EB=AF=80=EB=A1=9C=20shared/event=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/infra/listener/ProductPriceChangeListener.java | 2 +- src/main/java/kitchenpos/products/tobe/domain/Product.java | 2 +- .../kitchenpos/shared/{ => event}/ProductPriceChangeEvent.java | 2 +- .../menus/application/ProductPriceChangeListenerTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/kitchenpos/shared/{ => event}/ProductPriceChangeEvent.java (93%) diff --git a/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java index 6915e33ce..f57334e41 100644 --- a/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java +++ b/src/main/java/kitchenpos/menus/infra/listener/ProductPriceChangeListener.java @@ -1,7 +1,7 @@ package kitchenpos.menus.infra.listener; import kitchenpos.menus.application.MenuService; -import kitchenpos.shared.ProductPriceChangeEvent; +import kitchenpos.shared.event.ProductPriceChangeEvent; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; diff --git a/src/main/java/kitchenpos/products/tobe/domain/Product.java b/src/main/java/kitchenpos/products/tobe/domain/Product.java index bc44f9992..54811366d 100644 --- a/src/main/java/kitchenpos/products/tobe/domain/Product.java +++ b/src/main/java/kitchenpos/products/tobe/domain/Product.java @@ -1,7 +1,7 @@ package kitchenpos.products.tobe.domain; -import kitchenpos.shared.ProductPriceChangeEvent; +import kitchenpos.shared.event.ProductPriceChangeEvent; import org.springframework.data.domain.AbstractAggregateRoot; import javax.persistence.*; diff --git a/src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java b/src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java similarity index 93% rename from src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java rename to src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java index a195c5dbe..9f8c0ba5a 100644 --- a/src/main/java/kitchenpos/shared/ProductPriceChangeEvent.java +++ b/src/main/java/kitchenpos/shared/event/ProductPriceChangeEvent.java @@ -1,4 +1,4 @@ -package kitchenpos.shared; +package kitchenpos.shared.event; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java index 0abf35bfa..e5d3ff6fa 100644 --- a/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java +++ b/src/test/java/kitchenpos/menus/application/ProductPriceChangeListenerTest.java @@ -8,7 +8,7 @@ import kitchenpos.clients.FakePurgomalumClient; import kitchenpos.menus.tobe.domain.PurgomalumClient; import kitchenpos.products.application.InMemoryProductRepository; -import kitchenpos.shared.ProductPriceChangeEvent; +import kitchenpos.shared.event.ProductPriceChangeEvent; import kitchenpos.products.tobe.domain.ProductRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; From 46e09bfd1d2cfa9d1eafcef6d4ad35da37a25704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=94=8C=EB=9E=8C?= <50702723+Flamme1004K@users.noreply.github.com> Date: Sun, 26 Jan 2025 10:38:17 +0900 Subject: [PATCH 19/21] =?UTF-8?q?feature:=20Menu=20=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A0=95=EC=B1=85=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menus/tobe/domain/AmountPolicy.java | 25 +++++++++++++++++++ .../kitchenpos/menus/tobe/domain/Menu.java | 16 ++++++------ .../menus/tobe/domain/MenuPrice.java | 12 --------- .../menus/tobe/domain/MenuProducts.java | 8 +++--- .../NotDisplayableMenuPriceException.java | 7 ++++++ .../NotRegistrableMenuPriceException.java | 8 ++++++ .../NotUpdatableMenuPriceException.java | 7 ++++++ 7 files changed, 58 insertions(+), 25 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java diff --git a/src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java b/src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java new file mode 100644 index 000000000..e32f05fea --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/AmountPolicy.java @@ -0,0 +1,25 @@ +package kitchenpos.menus.tobe.domain; + +public class AmountPolicy { + public static void validRegistrableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotRegistrableMenuPriceException(); + } + } + + public static void validUpdatableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotUpdatableMenuPriceException(); + } + } + + public static void validDisplayableMenuPrice(MenuPrice menuPrice, MenuProducts menuProducts) { + if (isAmountOver(menuPrice, menuProducts)) { + throw new NotDisplayableMenuPriceException(); + } + } + + public static boolean isAmountOver(MenuPrice menuPrice, MenuProducts menuProducts) { + return menuPrice.getPrice().compareTo(menuProducts.getAmount()) > 0; + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index 408cad717..ef529740e 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -32,11 +32,9 @@ public class Menu { private MenuProducts menuProducts; public static Menu newOne(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } var menuPrice = new MenuPrice(price); - if (menuPrice.isAmountOver(menuProducts.getAmount())) { + AmountPolicy.validRegistrableMenuPrice(menuPrice, menuProducts); + if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { throw new IllegalArgumentException(); } return new Menu(UUID.randomUUID(), name, menuPrice, menuGroup, displayed, menuProducts); @@ -80,19 +78,19 @@ public List getMenuProducts() { public void updateMenuProductPrice(UUID productId, BigDecimal productPrice) { this.menuProducts.updateProductPrice(productId, productPrice); - if (this.menuPrice.isAmountOver(this.menuProducts.getAmount())) { + if (AmountPolicy.isAmountOver(this.menuPrice, this.menuProducts)) { this.displayed = false; } } public void updateMenuPrice(BigDecimal price) { - this.menuPrice = menuPrice.updatePrice(price, this.menuProducts.getAmount()); + MenuPrice newMenuPrice = new MenuPrice(price); + AmountPolicy.validUpdatableMenuPrice(newMenuPrice, this.menuProducts); + this.menuPrice = newMenuPrice; } public void display() { - if (this.menuPrice.isAmountOver(this.menuProducts.getAmount())) { - throw new IllegalStateException("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); - } + AmountPolicy.validDisplayableMenuPrice(this.menuPrice, this.menuProducts); this.displayed = true; } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java index 634f75e5f..8429f1b97 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -23,16 +23,4 @@ public MenuPrice(BigDecimal price) { public BigDecimal getPrice() { return price; } - - public MenuPrice updatePrice(BigDecimal price, BigDecimal amount) { - MenuPrice newMenuPrice = new MenuPrice(price); - if (newMenuPrice.isAmountOver(amount)) { - throw new IllegalArgumentException("총 상품 가격이 메뉴 가격보다 큽니다."); - } - return newMenuPrice; - } - - public boolean isAmountOver(BigDecimal amount) { - return this.price.compareTo(amount) > 0; - } } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java index a1b516b8e..eaecd843a 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -33,16 +33,16 @@ public MenuProducts(List menuProducts) { this.menuProducts = menuProducts; } + public List getMenuProducts() { + return this.menuProducts; + } + public BigDecimal getAmount() { return this.menuProducts.stream() .map(MenuProduct::getProductPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); } - public List getMenuProducts() { - return this.menuProducts; - } - public void updateProductPrice(UUID productId, BigDecimal productPrice) { this.menuProducts.stream() .filter(it -> it.getProductId().equals(productId)) diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java new file mode 100644 index 000000000..d2268801d --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotDisplayableMenuPriceException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotDisplayableMenuPriceException extends IllegalStateException { + public NotDisplayableMenuPriceException() { + super("상품 총 가격이 메뉴의 가격보다 높아 전시할 수 없습니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java new file mode 100644 index 000000000..57d81c517 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotRegistrableMenuPriceException.java @@ -0,0 +1,8 @@ +package kitchenpos.menus.tobe.domain; + +public class NotRegistrableMenuPriceException extends IllegalArgumentException { + public NotRegistrableMenuPriceException() { + super("등록할 수 없는 가격정보입니다."); + } +} + \ No newline at end of file diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java new file mode 100644 index 000000000..203349cd1 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotUpdatableMenuPriceException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotUpdatableMenuPriceException extends IllegalArgumentException { + public NotUpdatableMenuPriceException() { + super("수정할 수 없는 가격정보입니다."); + } +} From a1dbca588a58bdac5b2f7c94819fd5ad83a1b5fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=94=8C=EB=9E=8C?= <50702723+Flamme1004K@users.noreply.github.com> Date: Sun, 26 Jan 2025 10:43:29 +0900 Subject: [PATCH 20/21] =?UTF-8?q?feature:=20MenuName=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=A0=95=EC=B1=85=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kitchenpos/menus/tobe/domain/Menu.java | 4 +--- .../kitchenpos/menus/tobe/domain/MenuNamePolicy.java | 11 +++++++++++ .../domain/ProfanityContainsMenuNameException.java | 7 +++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java diff --git a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java index ef529740e..d86697595 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/Menu.java @@ -33,10 +33,8 @@ public class Menu { public static Menu newOne(String name, BigDecimal price, boolean displayed, MenuGroup menuGroup, MenuProducts menuProducts, PurgomalumClient purgomalumClient) { var menuPrice = new MenuPrice(price); + MenuNamePolicy.validMenuName(name, purgomalumClient); AmountPolicy.validRegistrableMenuPrice(menuPrice, menuProducts); - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); - } return new Menu(UUID.randomUUID(), name, menuPrice, menuGroup, displayed, menuProducts); } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java new file mode 100644 index 000000000..0ecb3cff2 --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuNamePolicy.java @@ -0,0 +1,11 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.Objects; + +public class MenuNamePolicy { + public static void validMenuName(String name, PurgomalumClient purgomalumClient) { + if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { + throw new ProfanityContainsMenuNameException(); + } + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java b/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java new file mode 100644 index 000000000..0e9476dbe --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/ProfanityContainsMenuNameException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class ProfanityContainsMenuNameException extends IllegalArgumentException { + public ProfanityContainsMenuNameException() { + super("비속어가 포함 된 메뉴 이름입니다."); + } +} From b8656dcac42325d5a042574293bc9505e276c930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=94=8C=EB=9E=8C?= <50702723+Flamme1004K@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:01:11 +0900 Subject: [PATCH 21/21] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MenuAntiCorruptionService.java | 11 ++++------- .../kitchenpos/menus/application/MenuService.java | 13 +++++-------- .../kitchenpos/menus/tobe/domain/MenuGroup.java | 7 ++++--- .../kitchenpos/menus/tobe/domain/MenuPrice.java | 6 +++--- .../kitchenpos/menus/tobe/domain/MenuProducts.java | 8 ++++---- .../menus/tobe/domain/NotFoundMenuException.java | 9 +++++++++ .../menus/tobe/domain/NotFoundProductException.java | 7 +++++++ 7 files changed, 36 insertions(+), 25 deletions(-) create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java create mode 100644 src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java diff --git a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java index 1c98a1dfb..cc867c674 100644 --- a/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java +++ b/src/main/java/kitchenpos/menus/application/MenuAntiCorruptionService.java @@ -6,6 +6,7 @@ import kitchenpos.products.tobe.domain.Product; import kitchenpos.products.tobe.domain.ProductRepository; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; import java.util.*; import java.util.function.Function; @@ -21,18 +22,14 @@ public MenuAntiCorruptionService(ProductRepository productRepository) { } public MenuProducts createMenuProducts(List menuCreateProductRequests) { - if (Objects.isNull(menuCreateProductRequests) || menuCreateProductRequests.isEmpty()) { - throw new IllegalArgumentException(); - } - + Assert.isTrue(!Objects.isNull(menuCreateProductRequests) && !menuCreateProductRequests.isEmpty(), "메뉴 상품 정보가 누락되었습니다."); + final List products = productRepository.findAllByIdIn( menuCreateProductRequests.stream() .map(MenuCreateProductRequest::getProductId) .collect(Collectors.toList()) ); - if (products.size() != menuCreateProductRequests.size()) { - throw new IllegalArgumentException(); - } + Assert.isTrue(products.size() == menuCreateProductRequests.size(), "메뉴 상품 정보가 등록 된 상품 정보와 일치하지 않습니다."); var productMap = products.stream() .map(it -> new kitchenpos.menus.tobe.domain.Product(it.getId(), it.getPrice())) diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 8f7cf640a..45b35a133 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -2,10 +2,7 @@ import kitchenpos.menus.application.dto.MenuCreateRequest; import kitchenpos.menus.application.dto.MenuPriceChangeRequest; -import kitchenpos.menus.tobe.domain.MenuGroupRepository; -import kitchenpos.menus.tobe.domain.MenuRepository; -import kitchenpos.menus.tobe.domain.Menu; -import kitchenpos.menus.tobe.domain.PurgomalumClient; +import kitchenpos.menus.tobe.domain.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +26,7 @@ public MenuService(MenuRepository menuRepository, MenuGroupRepository menuGroupR @Transactional public Menu create(final MenuCreateRequest request) { final var menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NotFoundMenuException::new); final var menuProducts = antiCorruptionService.createMenuProducts(request.getMenuProducts()); final var menu = Menu.newOne(request.getName(), request.getPrice(), request.isDisplayed(), menuGroup, menuProducts, purgomalumClient); return menuRepository.save(menu); @@ -38,7 +35,7 @@ public Menu create(final MenuCreateRequest request) { @Transactional public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NotFoundMenuException::new); menu.updateMenuPrice(request.getPrice()); return menu; } @@ -46,7 +43,7 @@ public Menu changePrice(final UUID menuId, final MenuPriceChangeRequest request) @Transactional public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NotFoundMenuException::new); menu.display(); return menu; } @@ -54,7 +51,7 @@ public Menu display(final UUID menuId) { @Transactional public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NotFoundMenuException::new); menu.hide(); return menu; } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java index d9ef7a77c..d7ac52d42 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuGroup.java @@ -1,5 +1,7 @@ package kitchenpos.menus.tobe.domain; +import org.springframework.util.Assert; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @@ -18,14 +20,13 @@ public class MenuGroup { private String name; public static MenuGroup newOne(String name) { - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } + Assert.isTrue(!Objects.isNull(name) && !name.isEmpty(), name); return new MenuGroup(UUID.randomUUID(), name); } public MenuGroup() { } + public MenuGroup(UUID id, String name) { this.id = id; this.name = name; diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java index 8429f1b97..c61aa4cde 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuPrice.java @@ -1,5 +1,7 @@ package kitchenpos.menus.tobe.domain; +import org.springframework.util.Assert; + import javax.persistence.Column; import javax.persistence.Embeddable; import java.math.BigDecimal; @@ -14,9 +16,7 @@ public MenuPrice() { } public MenuPrice(BigDecimal price) { - if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); - } + Assert.isTrue(!Objects.isNull(price) && price.compareTo(BigDecimal.ZERO) > 0, "메뉴의 가격은 0보다 커야합니다."); this.price = price; } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java index eaecd843a..aa7c3db87 100644 --- a/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java +++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProducts.java @@ -1,5 +1,7 @@ package kitchenpos.menus.tobe.domain; +import org.springframework.util.Assert; + import javax.persistence.*; import java.math.BigDecimal; import java.util.List; @@ -19,9 +21,7 @@ public class MenuProducts { private List menuProducts; public static MenuProducts newOne(List menuProducts) { - if (Objects.isNull(menuProducts) || menuProducts.isEmpty()) { - throw new IllegalArgumentException(); - } + Assert.isTrue(!Objects.isNull(menuProducts) && !menuProducts.isEmpty(), "메뉴 상품 정보가 누락되었습니다."); return new MenuProducts(menuProducts); } @@ -47,7 +47,7 @@ public void updateProductPrice(UUID productId, BigDecimal productPrice) { this.menuProducts.stream() .filter(it -> it.getProductId().equals(productId)) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("상품을 찾을 수가 없습니다. productId : " + productId)) + .orElseThrow(NotFoundProductException::new) .updateProductPrice(productPrice); } } diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java new file mode 100644 index 000000000..f91f85ead --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundMenuException.java @@ -0,0 +1,9 @@ +package kitchenpos.menus.tobe.domain; + +import java.util.NoSuchElementException; + +public class NotFoundMenuException extends NoSuchElementException { + public NotFoundMenuException() { + super("메뉴를 찾을 수 없습니다."); + } +} diff --git a/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java new file mode 100644 index 000000000..a9be1565a --- /dev/null +++ b/src/main/java/kitchenpos/menus/tobe/domain/NotFoundProductException.java @@ -0,0 +1,7 @@ +package kitchenpos.menus.tobe.domain; + +public class NotFoundProductException extends IllegalArgumentException { + public NotFoundProductException() { + super("상품을 찾을 수가 없습니다."); + } +}