250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 인프런김영한
- 기술면접
- 혼공SQL
- 자바
- aop
- 인프런백기선
- 자바예외
- 알고리즘분석
- mysql
- 도메인 주도 개발 시작하기
- jpa
- 이펙티브 자바
- vue.js
- 자료구조
- 인덱스
- MariaDB
- AWS RDS
- react
- java
- 이펙티브자바
- AWS
- 스프링부트와AWS로혼자구현하는웹서비스
- 이팩티브 자바
- 네트워크
- 클린코드
- CleanCode
- SQL쿡북
- 자바스터디
- DDD
- 알고리즘
Archives
- Today
- Total
기록이 힘이다.
[도메인 주도 개발 시작하기] 1.6 엔티티와 밸류 본문
728x90
1. 엔티티의 식별자 생성
- 특정 규칙에 따라 생성
- UUID나 Nano ID와 같은 고유 식별자 생성기 사용
- 값을 직접 입력
- 일련번호 사용(시퀀스나 DB의 자동 증가 칼러 사용)
UUID uuid = UUID.randomUUID();
String strUuid = uuid.toString();
//엔티티를 생성하기 전에 식별자 생성
String orderNumber = orderRepository.generateOrderNumber();
Order order = new Order(orderNumber, ...);
orderRepository.save(order);
2. 밸류 타입
public class OrderLine{
private Product product;
private int price;
private int quantity;
private int amounts;
...
}
---------타입을 만들어 사용
public class Money{
private int value;
publci Money(int value){
this.value = value;
}
public int getValue(){
return this.value;
}
}
public class OrderLine{
private Product product;
private Money price;
private int quantity;
private Money amounts;
...
}
밸류 타입을 불변으로 구현하는 여러 이유가 있는데 가장 중요한 이유는 안전한 코드를 작성할 수 있다는 데 있다.
public class Money{
private int value;
public Money add(Money money){
return new Money(this.value + money.value);
}
//value를 변경할 수 있는 메서드 없음
}
3. 엔티티 식별자와 밸류 타입
public class Order{
//OrderNo 타입 자체로 id가 주문번호임을 알 수 있다.
private OrderNo id;
...
public OrderNo getId(){
return id;
}
}
4. 도메인 모델에 set 메서드 넣지 않기
처음 프로그래밍을 배울 때 익힌 예제 코드를 그대로 따라 하다 보니 상황에 상관없이 get/set 메서드를 습관적으로 추가하는 것이다.
도메인 모델에 get/set 메서드를 무조건 추가하는 것은 좋지 않은 버릇이다. 습관적으로 작성한 set 메서드는 필드값만 변경하고 끝나기 때문에 상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다.
도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성 시점에 필요한 것을 전달해 주어야 한다. 즉 생성자를 통해 필요한 데이터를 모두 받아야 한다.
Order order = new Order(orderer, lines, shippingInfo, OrderState.PREPARING);
public class Order{
public Order(Orderer orderer, List<OrderLine> orderLines,
ShippingInfo shippingInfo, OrderState state){
setOrderer(orderer);
setOrderLines(orderLines);
...//다른 값 설정
}
private void setOrderer(Orderer orderer){
if(orderer == null) throw new IllegalArgumentException("no orderer");
this.orderer = orderer;
}
..//다른 값
}
private이기 때문에 외부에서 데이터를 변경할 목적으로 set 메서드를 사용할 수 없다.
'IT서적 > 도메인 주도 개발 시작하기' 카테고리의 다른 글
[도메인 주도 개발 시작하기] 5. 스프링 데이터 JPA를 이용한 조회 기능 (0) | 2023.07.28 |
---|---|
[도메인 주도 개발 시작하기] 4. 리포지터리와 모델 구현 (0) | 2023.07.27 |
[도메인 주도 개발 시작하기]3. 애그리거트 (0) | 2023.07.26 |
[도메인 주도 개발 시작하기] 2. 아키텍처 개요 (0) | 2023.07.25 |
[도메인 주도 개발 시작하기:DDD] 1. 도메인 모델 시작하기 (0) | 2023.07.19 |