※ <도메인 주도 개발 시작하기 - 최범균 저> 를 보며 제가 이해한 내용을 바탕으로 개념을 정리한 글입니다.
'도메인 주도 개발하기' 책을 보고 DDD 개념 기초를 다졌으나 책을 본지도 몇 달이 지났고, 실제 DDD 를 개발에 적용하려다 보니 헷갈리는 점들이 생겨 다시 책을 꺼내 들었다.
의문이 생길 때마다 빠르게 내용을 찾아보기 쉽게 주요 개념들을 짤막하게나마 정리해두려 한다.
엔티티와 밸류
엔티티
- 고유한 식별자를 가진다. 각 엔티티는 서로 다른 식별자를 갖는다.
- 식별자 생성 방식
- 특정 규칙에 따라 생성
- 흔히 주문번호, 운송장번호, 카드번호와 같은 식별자들은 날짜 + 랜덤값 과 같은 규칙으로 생성하는 경우가 많음
- UUID 나 Nano ID 와 같은 고유 식별자 생성기 사용
- 값을 직접 입력
- 사용자 아이디와 같은 예
- 일련번호 사용(시퀀스, DB 자동 증가 컬럼)
- 특정 규칙에 따라 생성
- 식별자를 위한 밸류 타입
- 엔티티 식별자의 실제 데이터는 String, Long 등으로 구성되는 경우가 많다
- 그대로 두어도 되지만 명확한 의미 전달을 위해 식별자를 밸류 타입을 사용하여 표현할 수도 있다.
public class Order {
private OrderNo id; // 식별자를 별도의 밸류타입을 통해 표현
}
밸류
- 개념적으로 완전한 하나를 표현할 때 사용
- 예) address1, address2, zipcode 와 같은 필드가 있을 때, 이는 개념적으로 ‘주소’라는 하나의 카테고리로 묶을 수 있다.
- 꼭 두개 이상의 데이터를 가질 필요는 없다. 의미를 명확하게 표현하기 위해 밸류 타입을 사용할 때도 있다.
- 예) int price, int amounts 라는 필드가 있을 때, 이는 ‘돈’을 의미하는 값이다. Money price, Money amounts Money 라는 밸류 타입 클래스로 대체한다면 쉽게 돈을 의미하는 필드라는 걸 알 수 있다.
- 밸류 타입을 위한 기능을 추가할 수 있다.
- 밸류 객체의 데이터를 변경할 때는 변경한 데이터를 갖는 새로운 밸류 객체를 생성하는 것이 좋다. (데이터를 불변으로 함)
- 참조 투명성과 관련된 문제 때문
line 이 price 를 참조해 객체 생성하고 있기 때문에 price 값이 변경되면 line의 데이터도 달라지게 되는 문제 발생.Money price = new Money(1000); OrderLine line = new OrderLine(product, price, 2); price.setValue(2000);
- setter 를 열어두지 말고, 생성자를 통해 값을 받도록 함
댓글 피드백은 언제나 환영합니다!
'BackEnd' 카테고리의 다른 글
Nest-cli로 프로젝트 생성 시 git 추적 안되는 문제 (0) | 2024.08.21 |
---|---|
Node.js 의 이벤트 루프 (1) | 2024.03.05 |
JPA - 영속성 컨텍스트 (1) | 2024.01.15 |
JPA 빠르게 훑어보기 (0) | 2023.08.20 |
Spring VS SpringBoot (0) | 2020.07.23 |