diff --git a/README.md b/README.md
index 4a91e3f71..2439978f4 100644
--- a/README.md
+++ b/README.md
@@ -199,3 +199,13 @@ docker compose -p kitchenpos up -d
- `Order`는 접수 대기 ➜ 접수 ➜ 서빙 ➜ 계산 완료 순서로 진행된다.
- `OrderLineItem`는 가격과 수량을 가진다.
- `OrderLineItem`의 수량은 1보다 커야 한다.
+
+
+#### step1 요구사항
+
+- 키친포스의 요구 사항과 용어 사전, 모델링을 기반으로 상품 CONTEXT를 리팩터링한다.
+- 상품 CONTEXT의 도메인 계층만 먼저 구현한다.
+- products 패키지 밑에 tobe.domain 패키지를 만들고 거기서부터 구현을 시작한다.
+- 용어 사전과 모델링이 부자연스럽거나 불완전하거나 잘못된 경우 지속적으로 수정한다.
+- 새로운 모델에 맞게끔 클래스, 메서드, 모듈의 이름을 다시 지으면서 코드를 리팩터링한다.
+- REPOSITORY 구현 시 자신에게 익숙하고 편한 것을 선택하여 진행한다.
diff --git a/build.gradle.kts b/build.gradle.kts
index 67ab16154..bace56f3b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,7 +13,7 @@ group = "camp.nextstep.edu"
version = "0.0.1-SNAPSHOT"
java {
- sourceCompatibility = JavaVersion.VERSION_21
+ sourceCompatibility = JavaVersion.VERSION_17
}
repositories {
diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java
index abefa5bcf..88ef31359 100644
--- a/src/main/java/kitchenpos/menus/application/MenuService.java
+++ b/src/main/java/kitchenpos/menus/application/MenuService.java
@@ -5,9 +5,9 @@
import kitchenpos.menus.domain.MenuGroupRepository;
import kitchenpos.menus.domain.MenuProduct;
import kitchenpos.menus.domain.MenuRepository;
-import kitchenpos.products.domain.Product;
-import kitchenpos.products.domain.ProductRepository;
-import kitchenpos.products.infra.PurgomalumClient;
+import kitchenpos.products.asis.domain.Product;
+import kitchenpos.products.asis.domain.ProductRepository;
+import kitchenpos.products.asis.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java
index b47ca26cb..14addb1fb 100644
--- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java
+++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java
@@ -10,7 +10,7 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
-import kitchenpos.products.domain.Product;
+import kitchenpos.products.asis.domain.Product;
import java.util.UUID;
diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/asis/application/ProductService.java
similarity index 92%
rename from src/main/java/kitchenpos/products/application/ProductService.java
rename to src/main/java/kitchenpos/products/asis/application/ProductService.java
index 20cf63996..a4edbe9d4 100644
--- a/src/main/java/kitchenpos/products/application/ProductService.java
+++ b/src/main/java/kitchenpos/products/asis/application/ProductService.java
@@ -1,11 +1,11 @@
-package kitchenpos.products.application;
+package kitchenpos.products.asis.application;
import kitchenpos.menus.domain.Menu;
import kitchenpos.menus.domain.MenuProduct;
import kitchenpos.menus.domain.MenuRepository;
-import kitchenpos.products.domain.Product;
-import kitchenpos.products.domain.ProductRepository;
-import kitchenpos.products.infra.PurgomalumClient;
+import kitchenpos.products.asis.domain.Product;
+import kitchenpos.products.asis.domain.ProductRepository;
+import kitchenpos.products.asis.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java b/src/main/java/kitchenpos/products/asis/domain/JpaProductRepository.java
similarity index 81%
rename from src/main/java/kitchenpos/products/domain/JpaProductRepository.java
rename to src/main/java/kitchenpos/products/asis/domain/JpaProductRepository.java
index 90b069779..5faa9c9c4 100644
--- a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java
+++ b/src/main/java/kitchenpos/products/asis/domain/JpaProductRepository.java
@@ -1,4 +1,4 @@
-package kitchenpos.products.domain;
+package kitchenpos.products.asis.domain;
import org.springframework.data.jpa.repository.JpaRepository;
diff --git a/src/main/java/kitchenpos/products/domain/Product.java b/src/main/java/kitchenpos/products/asis/domain/Product.java
similarity index 95%
rename from src/main/java/kitchenpos/products/domain/Product.java
rename to src/main/java/kitchenpos/products/asis/domain/Product.java
index ee2a7dfa9..0cdf3eb11 100644
--- a/src/main/java/kitchenpos/products/domain/Product.java
+++ b/src/main/java/kitchenpos/products/asis/domain/Product.java
@@ -1,4 +1,4 @@
-package kitchenpos.products.domain;
+package kitchenpos.products.asis.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/src/main/java/kitchenpos/products/domain/ProductRepository.java b/src/main/java/kitchenpos/products/asis/domain/ProductRepository.java
similarity index 86%
rename from src/main/java/kitchenpos/products/domain/ProductRepository.java
rename to src/main/java/kitchenpos/products/asis/domain/ProductRepository.java
index 3637e4232..074dcfe8e 100644
--- a/src/main/java/kitchenpos/products/domain/ProductRepository.java
+++ b/src/main/java/kitchenpos/products/asis/domain/ProductRepository.java
@@ -1,4 +1,4 @@
-package kitchenpos.products.domain;
+package kitchenpos.products.asis.domain;
import java.util.List;
import java.util.Optional;
diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/products/asis/infra/DefaultPurgomalumClient.java
similarity index 95%
rename from src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java
rename to src/main/java/kitchenpos/products/asis/infra/DefaultPurgomalumClient.java
index 87dba885c..6c9afdeba 100644
--- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java
+++ b/src/main/java/kitchenpos/products/asis/infra/DefaultPurgomalumClient.java
@@ -1,4 +1,4 @@
-package kitchenpos.products.infra;
+package kitchenpos.products.asis.infra;
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/asis/infra/PurgomalumClient.java
similarity index 67%
rename from src/main/java/kitchenpos/products/infra/PurgomalumClient.java
rename to src/main/java/kitchenpos/products/asis/infra/PurgomalumClient.java
index 4002a2bb8..7c5f6b503 100644
--- a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java
+++ b/src/main/java/kitchenpos/products/asis/infra/PurgomalumClient.java
@@ -1,4 +1,4 @@
-package kitchenpos.products.infra;
+package kitchenpos.products.asis.infra;
public interface PurgomalumClient {
boolean containsProfanity(String text);
diff --git a/src/main/java/kitchenpos/products/tobe/application/ProductService.java b/src/main/java/kitchenpos/products/tobe/application/ProductService.java
new file mode 100644
index 000000000..674c50050
--- /dev/null
+++ b/src/main/java/kitchenpos/products/tobe/application/ProductService.java
@@ -0,0 +1,74 @@
+package kitchenpos.products.tobe.application;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+import kitchenpos.menus.domain.Menu;
+import kitchenpos.menus.domain.MenuProduct;
+import kitchenpos.menus.domain.MenuRepository;
+import kitchenpos.products.tobe.application.dto.ProductCreateRequest;
+import kitchenpos.products.tobe.application.dto.ProductPriceUpdateRequest;
+import kitchenpos.products.tobe.application.dto.ProductResponse;
+import kitchenpos.products.tobe.domain.Product;
+import kitchenpos.products.tobe.domain.ProductRepository;
+import kitchenpos.products.tobe.domain.PurgomalumClient;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class ProductService {
+
+ private final ProductRepository jpaProductRepository;
+ private final MenuRepository menuRepository;
+ private final PurgomalumClient purgomalumClient;
+
+ public ProductService(
+ final ProductRepository productRepository,
+ final MenuRepository menuRepository,
+ final PurgomalumClient purgomalumClient
+ ) {
+ this.jpaProductRepository = productRepository;
+ this.menuRepository = menuRepository;
+ this.purgomalumClient = purgomalumClient;
+ }
+
+ @Transactional
+ public ProductResponse create(ProductCreateRequest request) {
+ Product product = jpaProductRepository.save(Product.of(request.getName(), request.getPrice(), purgomalumClient));
+
+ return ProductResponse.toResponse(product);
+ }
+
+ @Transactional
+ public ProductResponse changePrice(UUID productId, ProductPriceUpdateRequest request) {
+
+ Product product = jpaProductRepository.findById(productId)
+ .orElseThrow(NoSuchElementException::new);
+ product.changePrice(request.getPrice());
+
+ final List