@@ -0,0 +1,42 @@
+package store.product.domain;
+
+public class ProductQuantity {
+
+    private int normalQuantity;
+    private int promotionQuantity;
+    private int nonPromotionQuantity;
+
+    public ProductQuantity(final int normalQuantity, final int promotionQuantity, final int nonPromotionQuantity) {
+        this.normalQuantity = normalQuantity;
+        this.promotionQuantity = promotionQuantity;
+        this.nonPromotionQuantity = nonPromotionQuantity;
+    }
+
+    public int calculateTotalQuantity() {
+        return normalQuantity + promotionQuantity + nonPromotionQuantity;
+    }
+
+    public int getNormalQuantity() {
+        return normalQuantity;
+    }
+
+    public int getPromotionQuantity() {
+        return promotionQuantity;
+    }
+
+    public int getNonPromotionQuantity() {
+        return nonPromotionQuantity;
+    }
+
+    public void updateNormalQuantity(final int normalQuantity) {
+        this.normalQuantity = normalQuantity;
+    }
+
+    public void updatePromotionQuantity(final int promotionQuantity) {
+        this.promotionQuantity = promotionQuantity;
+    }
+
+    public void updateNonPromotionQuantity(final int nonPromotionQuantity) {
+        this.nonPromotionQuantity = nonPromotionQuantity;
+    }
+}

리뷰: 수량 객체를 불변객체로 만들어 보는건 어떨까요?

예시 
```java
public class ProductQuantity {
   private final int normalQuantity; //  < -- final 추가
   private final int promotionQuantity;  // < -- final 추가
   private final int nonPromotionQuantity;   // < -- final 추가

   public ProductQuantity(final int normalQuantity, 
                        final int promotionQuantity, 
                        final int nonPromotionQuantity) {
       this.normalQuantity = normalQuantity;
       this.promotionQuantity = promotionQuantity;
       this.nonPromotionQuantity = nonPromotionQuantity;
   }

   public ProductQuantity updateNormalQuantity(final int normalQuantity) {
       return new ProductQuantity(normalQuantity,   // <-- 변경시 새로운 객체로 반환 
                                this.promotionQuantity, 
                                this.nonPromotionQuantity);
   }

   public ProductQuantity updatePromotionQuantity(final int promotionQuantity) {
       return new ProductQuantity(this.normalQuantity, 
                                promotionQuantity, 
                                this.nonPromotionQuantity);
   }

```

## 수량을 불변 객체로 했을때 장점 

### 1. 객체 상태 보장 
이번 미션에서 재고 상태의 최신화를 항상 반영해야 하는 만큼, 
객체 상태가 예기치 않게 변경될 가능성을 제거하는 것도 생각했었습니다. 그래서 저는 수량 객체를 불변타입으로 지정 했었습니다.
```java
ProductQuantity original = new ProductQuantity(10, 5, 3);
ProductQuantity modified = original.updateNormalQuantity(15);  // 원본 original 객체는 변경되지 않음
```

### 2. 유지 보수향상 
### 이전
``` java
ProducctQuantity original;

original.updateNormalQuantity(3);
original.updatePromotionQuantity(7);
```
### 리팩토링 후 
```java
ProductQuantity updated = original.updateNormalQuantity(15)
                                 .updatePromotionQuantity(8);
```
### 예를 들어  PromotionService 의 코드중 하나를 예를 들면

### 변경 전

<img width="547" alt="image" src="https://github.com/user-attachments/assets/5c0aa215-5d91-438e-a482-472c77ff9abd">

### 변경 후
<img width="667" alt="image" src="https://github.com/user-attachments/assets/5fb5a504-9f2d-4e8a-a72d-f500f98eb1e1">