DDD 최범균 저자님 책 읽으면서, JPA 김영한 저자님 책 읽으면서, , 정리한 내용
처음에는 어렵게만 느껴지던 내용들이, 다시 읽고 제대로 읽고 해보니까 조금씩 이해가 되었다.
내용도 알차고 이해를 주기위한 노력을 풀어냄이 느껴진다고 해야할까나.
무튼 입문서로는 기본적으로 읽어봤으면 한다.
- DDD 원칙
- JPA 개발원칙
2/24 적용예정
@MappedSuperClass 적용하기 - BaseEntity
객체지향형 도메인 주도 개발에 대한 이해
- 도메인 모델
- 특정 도메인을 개념적으로 표현한 것
- 시스템이 제공할 도메인의 규칙을 구현한다.
- 예제 처럼 주문과 관련된 중요 업무 규칙을 주문 도메인 모델인 Order나 OrderState에서 구현한다.
- 이는 핵심규칙을 구현한 코드는 도메인 모델에만 위치하기 때문에 규칙이 바뀌거나 규칙을 확장해야 하는 경우, 다른 코드에 영향을 덜 주고 변경내역을 모델에 반영할 수 있게 된다.
- 도메인 모델링의 기본
- 핵심 구성요소
- 규칙
- 기능
(즉 , 각 도메인에서 규칙에 해당하는 제약사항을 기술한다. )
엔터티와 밸류타입
- 엔터티는 식별자를 가진다.
- 벨류타입은 개념적으로 완전한 하나를 표현할 때 사용된다. (주소, 받는사람 등 클래스화 가능한 데이터)
- 벨류타입을 사용할 때 장점은 amount, price 에 Money 벨류 타입을 만들어서 사용하는 것과 같이 금액을 의미한다는 것을 명확하게 알수 있게 한다.
- 돈 계산과 같은 기능을 해당 벨류 타입 클래스에서 구현할 수 있다.
- 즉 Money를 사용하는 코드는 돈 계산 이라는 의미로 코드를 작성할 수 있다. 즉 코드의 가독성이 향상!된다.
- Add 메서드와 같이 데이터를 변경할 때에는 / 기존 데이터를 변경하기 보다는 변경한 데이터를 갖는 새로운 벨류 객체를 생성하는 방식을 선호한다.
- 변경할 수 없는 ! 즉 변경기능을 제공하지 않는 타입을 ‘불변(immutable)’ 이라고 표현한다.
- ‘불변 객체’는 참조 투명성과 스레드에 안전한 특징을 갖고 있다.
- https://goo.gl/2Lo4pU 참고
- 벨류타입은 equals 메서드 오버라이딩 ! 해준다.
- Order 식별자 타입으로 String 대신에 orderNo 벨류 타입을 사용하면 타입을 통해서 해당 필드가 주문번호라는 것을 알 수 있다.
- ( 예제 코드에서 벨류타입 클래스를 활용하는 게 많은 이유인 것 같다. )
- 도메인 모델에 set 메서드 넣지 않기
- 특히 set 메서드는 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
- ex) changeShippingInfo() - setShippingInfo
- Ex) completePayment() - setOrderState
- 앞에 꺼대로 결제완료와 관련된 도메인 지식을 코드로 구현하는 것이 자연스럽다.
- ‘상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다’
- 도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성 시점에 필요한 것을 전달해주어야 한다. 즉, 생성자를 통한 필요한 데이터를 모두 받아야 한다.
- 생성 시점에 필요한 데이터가 올바른지 검사할 수 있다.
- private 으로 내부에서만 접근하여 변경할 목적을 갖는다.
- “ 불변 밸류 타입을 사용하면 자연스럽게 밸류 타입에는 set메서드를 구현하지 않는다.”
- “ 특별한 이유가 없다면? 불변 타입의 장점을 살릴 수 있도록 벨류타입은 불변으로 구현한다. “
- 불변의 장점을 DTO 까지 확장하자. (Data Transfer Object)
- 도메인 용어 사용
- OrderState 와 같이 enum 활용 해서 상태를 구분하는 구분값을 명확하게 인지 가독성 향상
- 시간을 들여 알맞은 영어 단어를 찾는 노력을 해야한다.
- 미래의 이익을 위해 찾는 시간을 아까워 하지말자.