밸류 타입의 식별자 활용식별자를 부각시키기 위하여 밸류 타입을 사용가능하다.OrderNo, MemberId 등이 밸류 타입으로 사용된 식별자이다.밸류 타입을 식별자로 매핑하면 @Id 대신 @EmbeddedId 를 사용@Entity @Table(name = "purchase_order") public class Order { @EmbeddedId private OrderNo number; } @Embeddable public class OrderNo implements Serializable { @Column(name="order_number") private String number; }EmBeddable 테이블에 Serializable 는 왜 사용되었을까?JPA 는 2차 캐시를 사용하여 엔티티를 캐시할..
밸류와 엔티티 구분밸류 매핑 애그리거트애그리거트 내에서 루트 엔티티를 제외한 구성요소는 대부분 밸류 객체별도의 테이블에 데이터를 저장하는 구성요소가 있다면, 그것이 진짜 엔티티인지 의심해야 한다. 예를 들어, 주문 애그리거트에서 OrderLine은 별도 테이블에 저장되지만, 밸류 객체로 취급된다.엔티티 확인밸류가 아닌 엔티티로 확정된 경우, 해당 엔티티가 다른 애그리거트에 속하지 않는지 확인해야 한다.독자적인 라이프 사이클을 가진다면, 별도의 애그리거트일 가능성이 높다.식별자 오해 방지애그리거트 구성요소가 고유 식별자를 갖는지 확인하는 것이 중요하다.테이블에 PK가 있더라도, 그것이 반드시 애그리거트 구성요소의 식별자는 아니다.류 매핑 전략밸류 매핑 오류 예시Article과 ArticleContent 클..
@Entity @Table (name = "product") public class Product { @Embedded Id private ProductId id; private String name; @Convert (converter = MoneyConverter.class) private Money price; private String detail; @OneToMany ( cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) @JoinColumn (name = "product_id") @Order Column (name = "list_idx") private List images = new ArrayList(); pu..
애그리거트애그리거트는 관련된 객체를 하나의 그룹으로 묶어주는 단위주문(루트 애그리거트)주문서주문자주문배송정보이를 통해 복잡한 도메인 모델을 상위 수준에서 쉽게 이해하고 관리가 가능해진다.개별 객체와 상위 수준의 모델의 관계성상세 모델의 복잡성의 문제개별 객체 단위로 모델을 바라보면, 상위 수준에서의 관계를 파악하기 어려워진다.이는 코드 변경과 확장을 어렵게 만들며, 전체 모델을 이해하지 못한 상태에서의 코드 수정은 장기적으로 문제를 야기할 수 있습니다.예를 들어, 상위 수준에서 도메인 모델을 정리할 수 있다면, 주요 엔티티 간의 관계를 쉽게 파악할 수 있다.주문은회원, 상품, 결제와 관련이 있다는 것을 상위 수준의 모델에서 확인할 수 있다.애그리거트의 생애주기객체의 라이프사이클한 애그리거트에 속한 객체들..
직접 참조의 문제점편한 탐색 요용한 애그리거트 내부에서 다른 애그리거트에 접근하여 상태를 변경할 수 있게,애그리거트의 경계가 모호해지고 의존성이 증가한다.성능적 고민JPA 사용하는 경우 지연 로딩과 즉시 로딩 중 어떤 것을 사용할지 결정해야한다.애그리거트의 기능에 따라 달라짐.확장성의 문제시스템이 성장하면서 하위 도메인별로 분리하고,다양한 저장소를 사용하게됨.public class Order { private Orderer orderer; public void changeShippingInfo(ShippingInfo newShippingInfo, boolean useNewShippingAddrAsMemberAddr) { if (useNewShippingAddrAsMemberAddr) { orderer.g..
상황고객이 특정 상점을 여러 차례 신고하여 차단된 상태에서상점이 물건을 등록하지 못하도록 하는 상황을 가정상품 등록 기능을 구현한 응용 서비스는 상점 계정이 차단 상태가 아닐 때만 상품을 생성할 수 있다.기존 응용 서비스 코드 예시public class RegisterProductService { public ProductId registerNewProduct(NewProductRequest req) { Store store = storeRepository.findById(req.getStoreId()); checkNull(store); if (store.isBlocked()) { throw new StoreBlockedException(); } ProductId id = productRepository..