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..025cb5c0b
--- /dev/null
+++ b/src/main/java/kitchenpos/menus/tobe/domain/MenuProduct.java
@@ -0,0 +1,73 @@
+package kitchenpos.menus.tobe.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.ForeignKey;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+import jakarta.persistence.Transient;
+import kitchenpos.products.tobe.domain.Product;
+
+import java.util.UUID;
+
+@Table(name = "menu_product")
+@Entity
+public class MenuProduct {
+ @Column(name = "seq")
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @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
+ private UUID productId;
+
+ public MenuProduct() {
+ }
+
+ public Long getSeq() {
+ return seq;
+ }
+
+ 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;
+ }
+
+ public void setQuantity(final long quantity) {
+ this.quantity = quantity;
+ }
+
+ public UUID getProductId() {
+ return productId;
+ }
+
+ public void setProductId(final UUID productId) {
+ this.productId = productId;
+ }
+}
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..2eda1fc18
--- /dev/null
+++ b/src/main/java/kitchenpos/products/tobe/application/ProductService.java
@@ -0,0 +1,71 @@
+package kitchenpos.products.tobe.application;
+
+import kitchenpos.menus.domain.Menu;
+import kitchenpos.menus.domain.MenuProduct;
+import kitchenpos.menus.domain.MenuRepository;
+import kitchenpos.products.tobe.domain.Product;
+import kitchenpos.products.tobe.domain.ProductName;
+import kitchenpos.products.tobe.domain.ProductRepository;
+import kitchenpos.products.infra.PurgomalumClient;
+import kitchenpos.products.tobe.domain.Price;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+public class ProductService {
+ private final ProductRepository productRepository;
+ private final MenuRepository menuRepository;
+ private final PurgomalumClient purgomalumClient;
+
+ public ProductService(
+ final ProductRepository productRepository,
+ final MenuRepository menuRepository,
+ final PurgomalumClient purgomalumClient
+ ) {
+ this.productRepository = productRepository;
+ this.menuRepository = menuRepository;
+ this.purgomalumClient = purgomalumClient;
+ }
+
+ @Transactional
+ public Product create(final Product request) {
+ final String name = request.getName().getName();
+ final Price price = new Price(request.getPrice().getPrice());
+ final ProductName productName = new ProductName(name, purgomalumClient);
+ final Product product = new Product(productName, price);
+ return productRepository.save(product);
+ }
+
+ @Transactional
+ public Product changePrice(final UUID productId, final Product request) {
+ final Price price = new Price(request.getPrice().getPrice());
+ final Product product = productRepository.findById(productId)
+ .orElseThrow(NoSuchElementException::new);
+ product.setPrice(price);
+ final List