Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2단계 - 리팩터링(메뉴) #169

Open
wants to merge 35 commits into
base: chr0m3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
bde7ea3
Price에 multiply() 추가
chr0m3 Oct 22, 2022
86b5760
MenuGroup entity 추가
chr0m3 Oct 22, 2022
4022276
MenuGroupEntity 추가
chr0m3 Oct 22, 2022
8382a9b
MenuGroupEntityConverter 추가
chr0m3 Oct 22, 2022
a1644b4
MenuGroupRepository 추가
chr0m3 Oct 22, 2022
b84cfe6
JpaMenuGroupRepository, JpaMenuGroupDao 추가
chr0m3 Oct 22, 2022
eb121a6
Price.multiply() 테스트 추가
chr0m3 Oct 22, 2022
4e44a8f
Price에 add() 추가
chr0m3 Oct 22, 2022
2c52931
Price가 Comparable을 구현하도록 수정
chr0m3 Oct 22, 2022
0146904
MenuProductQuantity VO 추가
chr0m3 Oct 22, 2022
a968bc6
MenuProduct VO 추가
chr0m3 Oct 23, 2022
7ff9973
MenuGroup VO 추가
chr0m3 Oct 23, 2022
3621adb
Menu entity 추가
chr0m3 Oct 23, 2022
5aab011
MenuDisplayPolicy 추가
chr0m3 Oct 23, 2022
58bd527
MenuRepository 추가
chr0m3 Oct 23, 2022
0701e17
Menu의 isVisible을 displayed로 변경
chr0m3 Oct 23, 2022
bf9bfb1
MenuEntity 추가
chr0m3 Oct 23, 2022
44adb96
MenuGroup VO 삭제
chr0m3 Oct 24, 2022
2d16e74
MenuProductEntity 추가
chr0m3 Oct 24, 2022
218f580
MenuProductEntityConverter 추가
chr0m3 Oct 24, 2022
c346395
누락된 final 추가
chr0m3 Oct 24, 2022
26aa5e7
MenuEntityConverter 추가
chr0m3 Oct 24, 2022
ac684f6
JpaMenuRepository 추가
chr0m3 Oct 24, 2022
748ee71
JpaMenuRepository 리팩터링 - 중복 코드 제거
chr0m3 Oct 24, 2022
96fe49a
메뉴 노출 정책을 위반하는 가격 변경이 불가능하도록 수정
chr0m3 Oct 24, 2022
f795b5c
새로운 도메인 모델을 사용하도록 Menu 컨텍스트 수정
chr0m3 Oct 24, 2022
2c7035e
불필요해진 과거 코드 제거
chr0m3 Oct 24, 2022
a662282
CreateMenuGroupCommand DTO 추가
chr0m3 Oct 24, 2022
a753755
ChangeMenuPriceCommand DTO 추가
chr0m3 Oct 24, 2022
86dc9e6
CreateMenuCommand DTO 추가
chr0m3 Oct 24, 2022
81afbbc
메뉴 노출 정책을 위반하는 메뉴 생성이 불가능하도록 수정
chr0m3 Oct 24, 2022
bd08ccb
메뉴 생성시 정확한 상품 가격을 반영하도록 개선
chr0m3 Oct 24, 2022
71f200a
DB 마이그레이션
chr0m3 Oct 24, 2022
139c6f8
도메인 모델 수정
chr0m3 Oct 24, 2022
1c460a0
Converter 인터페이스 제거
chr0m3 Oct 24, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/main/java/kitchenpos/menu/tobe/domain/vo/MenuProduct.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package kitchenpos.menu.tobe.domain.vo;

import java.util.UUID;
import kitchenpos.common.price.Price;

public class MenuProduct {

public final UUID productId;

public final Price pricePerUnit;
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

단순히 price를 사용하는 경우 메뉴 하나의 가격인지, 메뉴 가격에 수량을 곱한 소계에 해당하는 값인지 혼동되어 명확하게 네이밍했습니다.


public final MenuProductQuantity quantity;

public MenuProduct(
final UUID productId,
final Price pricePerUnit,
final MenuProductQuantity quantity
) {
this.productId = productId;
this.pricePerUnit = pricePerUnit;
this.quantity = quantity;
}

public Price subtotal() {
return this.pricePerUnit.multiply(this.quantity.value);
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

MenuProduct that = (MenuProduct) o;

if (!productId.equals(that.productId)) {
return false;
}
if (!pricePerUnit.equals(that.pricePerUnit)) {
return false;
}
return quantity.equals(that.quantity);
}

@Override
public int hashCode() {
int result = productId.hashCode();
result = 31 * result + pricePerUnit.hashCode();
result = 31 * result + quantity.hashCode();
return result;
}
}
43 changes: 43 additions & 0 deletions src/test/java/kitchenpos/menu/Fixtures.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package kitchenpos.menu;

import java.util.Random;
import java.util.UUID;
import kitchenpos.common.name.NameFactory;
import kitchenpos.common.price.Price;
import kitchenpos.common.profanity.FakeProfanityDetectService;
import kitchenpos.common.profanity.domain.ProfanityDetectService;
import kitchenpos.menu.tobe.domain.entity.MenuGroup;
import kitchenpos.menu.tobe.domain.vo.MenuProduct;
import kitchenpos.menu.tobe.domain.vo.MenuProductQuantity;
import kitchenpos.product.tobe.domain.entity.Product;

public class Fixtures {

private static final ProfanityDetectService profanityDetectService = new FakeProfanityDetectService();

private static final NameFactory nameFactory = new NameFactory(profanityDetectService);

public static MenuGroup menuGroup() {
return menuGroup("두마리메뉴");
}

public static MenuGroup menuGroup(final String name) {
return new MenuGroup(UUID.randomUUID(), nameFactory.create(name));
}

public static MenuProduct menuProduct() {
return new MenuProduct(
UUID.randomUUID(),
new Price(10_000),
new MenuProductQuantity(new Random().nextInt(10))
);
}

public static MenuProduct menuProduct(final Product product, final long quantity) {
return new MenuProduct(
UUID.randomUUID(),
product.price(),
new MenuProductQuantity(quantity)
);
}
}
34 changes: 34 additions & 0 deletions src/test/java/kitchenpos/menu/tobe/domain/vo/MenuProductTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package kitchenpos.menu.tobe.domain.vo;

import static kitchenpos.menu.Fixtures.menuProduct;
import static kitchenpos.product.Fixtures.product;
import static org.assertj.core.api.Assertions.assertThat;

import kitchenpos.common.price.Price;
import kitchenpos.product.tobe.domain.entity.Product;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class MenuProductTest {

@DisplayName("subtotal()")
@Nested
class Cvxueewc {

@DisplayName("소계가 올바르게 계산되어야 한다.")
@ValueSource(longs = {
16, 8, 32, 4, 1,
15, 13, 3, 31, 18,
})
@ParameterizedTest
void czxovwxu(final long quantity) {
final long pricePerUnit = 10000;
final Product product = product("상품", pricePerUnit);
final MenuProduct menuProduct = menuProduct(product, quantity);

assertThat(menuProduct.subtotal()).isEqualTo(new Price(pricePerUnit * quantity));
}
}
}