Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
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
19 changes: 18 additions & 1 deletion src/main/java/kitchenpos/common/price/Price.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* <li>가격은 음수일 수 없다.</li>
* </ul>
*/
public class Price {
public class Price implements Comparable<Price> {

public final BigDecimal value;

Expand All @@ -30,6 +30,23 @@ public Price(double value) {
this(BigDecimal.valueOf(value));
}

public Price add(Price augend) {
return new Price(this.value.add(augend.value));
}

public Price multiply(BigDecimal multiplicand) {
return new Price(this.value.multiply(multiplicand));
}

public Price multiply(long multiplicand) {
return this.multiply(BigDecimal.valueOf(multiplicand));
}

@Override
public int compareTo(Price o) {
return this.value.compareTo(o.value);
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/kitchenpos/menu/tobe/domain/entity/MenuGroup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kitchenpos.menu.tobe.domain.entity;

import java.util.UUID;
import kitchenpos.common.name.Name;

public class MenuGroup {

public final UUID id;

public final Name name;

public MenuGroup(final UUID id, final Name name) {
this.id = id;
this.name = name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kitchenpos.menu.tobe.domain.repository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;
import kitchenpos.menu.tobe.domain.entity.MenuGroup;

public interface MenuGroupRepository {

MenuGroup save(MenuGroup menuGroup);

Optional<MenuGroup> findById(UUID id);

List<MenuGroup> findAll();
}
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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package kitchenpos.menu.tobe.domain.vo;

/**
* <h1>메뉴 상품 수량</h1>
* <ul>
* <li>메뉴 상품별 수량은 1 이상이다.</li>
* </ul>
*/
public class MenuProductQuantity {

final long value;

public MenuProductQuantity(final long value) {
if (value < 1) {
throw new IllegalArgumentException("MenuProductQuantity는 1보다 작을 수 없습니다");
}
this.value = value;
}

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

MenuProductQuantity that = (MenuProductQuantity) o;

return value == that.value;
}

@Override
public int hashCode() {
return (int) (value ^ (value >>> 32));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kitchenpos.menu.tobe.infra.jpa;

import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface JpaMenuGroupDao extends JpaRepository<MenuGroupEntity, UUID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package kitchenpos.menu.tobe.infra.jpa;

import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import kitchenpos.menu.tobe.domain.entity.MenuGroup;
import kitchenpos.menu.tobe.domain.repository.MenuGroupRepository;
import kitchenpos.menu.tobe.infra.jpa.MenuGroupEntityConverter.MenuGroupEntityToMenuGroupConverter;
import kitchenpos.menu.tobe.infra.jpa.MenuGroupEntityConverter.MenuGroupToMenuGroupEntityConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class JpaMenuGroupRepository implements MenuGroupRepository {

private final JpaMenuGroupDao jpaMenuGroupDao;

private final MenuGroupToMenuGroupEntityConverter menuGroupToMenuGroupEntityConverter;

private final MenuGroupEntityToMenuGroupConverter menuGroupEntityToMenuGroupConverter;

@Autowired
public JpaMenuGroupRepository(
JpaMenuGroupDao jpaMenuGroupDao,
MenuGroupToMenuGroupEntityConverter menuGroupToMenuGroupEntityConverter,
MenuGroupEntityToMenuGroupConverter menuGroupEntityToMenuGroupConverter
) {
this.jpaMenuGroupDao = jpaMenuGroupDao;
this.menuGroupToMenuGroupEntityConverter = menuGroupToMenuGroupEntityConverter;
this.menuGroupEntityToMenuGroupConverter = menuGroupEntityToMenuGroupConverter;
}

@Override
public MenuGroup save(MenuGroup menuGroup) {
final MenuGroupEntity menuGroupEntity = this.menuGroupToMenuGroupEntityConverter.convert(menuGroup);
final MenuGroupEntity result = this.jpaMenuGroupDao.save(menuGroupEntity);
return this.menuGroupEntityToMenuGroupConverter.convert(result);
}

@Override
public Optional<MenuGroup> findById(UUID id) {
final Optional<MenuGroupEntity> result = this.jpaMenuGroupDao.findById(id);
if (result.isEmpty()) {
return Optional.empty();
}
return Optional.of(this.menuGroupEntityToMenuGroupConverter.convert(result.get()));
}

@Override
public List<MenuGroup> findAll() {
return this.jpaMenuGroupDao.findAll()
.stream()
.map(this.menuGroupEntityToMenuGroupConverter::convert)
.collect(Collectors.toUnmodifiableList());
}
}
20 changes: 20 additions & 0 deletions src/main/java/kitchenpos/menu/tobe/infra/jpa/MenuGroupEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package kitchenpos.menu.tobe.infra.jpa;

import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MenuGroupEntity {

@Column(name = "id", columnDefinition = "binary(16)")
@Id
public UUID id;

@Column(name = "name", nullable = false)
public String name;

public MenuGroupEntity() {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package kitchenpos.menu.tobe.infra.jpa;

import kitchenpos.common.name.NameFactory;
import kitchenpos.menu.tobe.domain.entity.MenuGroup;
import kitchenpos.util.converter.Converter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

public class MenuGroupEntityConverter {

private MenuGroupEntityConverter() {
}

@Component
public static class MenuGroupToMenuGroupEntityConverter
implements Converter<MenuGroup, MenuGroupEntity> {

@Override
public MenuGroupEntity convert(final MenuGroup source) {
final MenuGroupEntity menuGroupEntity = new MenuGroupEntity();
menuGroupEntity.id = source.id;
menuGroupEntity.name = source.name.value;
return menuGroupEntity;
}
}

@Component
public static class MenuGroupEntityToMenuGroupConverter
implements Converter<MenuGroupEntity, MenuGroup> {

private final NameFactory nameFactory;

@Autowired
public MenuGroupEntityToMenuGroupConverter(final NameFactory nameFactory) {
this.nameFactory = nameFactory;
}

@Override
public MenuGroup convert(final MenuGroupEntity source) {
return new MenuGroup(
source.id,
this.nameFactory.create(source.name)
);
}
}
}
Loading