1. 제이슨의 [도메인 주도 설계 2] 강의를 들었다
📍 DDD 구성 요소
vo는 equals&hashcode로 동등성 보장해야한다.
왜? 값이니까.
모든 필드가 복합키 (식별자)
vo로 시작. 근데 가변이 필요한 순간이 생김.
'근데 나는 얘가 값이 바뀌더라도 얘임을 증명할 수 있으면 좋겠어'
= 바뀌고 있는 애를 계속 추적하고 싶다
=> 식별자 부여
vo중에 변화를 추적하고 싶은 애들이 entity로 승격이 된다
관련 객체를 묶어서 바라보고 싶다
어떻게 묶어? 동일한 라이프사이클을 가질때 (생성과 삭제가 같이 될 떄)
애그리거트는 한 반이다. 학생들과 반장으로 이루어진.
반장의 이름을 루트 앤티티 혹은 애거리거트 루트라고 부름
order 애그리거트에는 2개의 엔티티와 하나의 vo가 존재
왜 order가 애그리거트 루트일까?
외부에서 참조할 것 같은, 쓸 것 같은 애가 반장.
반장의 id를 전역 식별자라고 부름 (global)
orderItem은 local 식별자 -> 외부에서 참조 불가 -> order를 통해 orderitem에 접근
자동차는 번호판을 찾아갈 수 있으니 반장. 그 자동차의 왼쪽 앞 바퀴는 자식 엔티티.
그런데 타이어는 정비소 입장에서는 또 반장임
-> 같은 타이어라도 컨텍스트에따라 루트냐 차일드냐 다름
반장에게 명령하면 알아서 내부 작동해서 결과냄 + 반장은 외부에서 내부 접근 못허게 막음 (캡슐화)
불변식
애그리거트는 애플리케이션 레벨에서 acid를 보장하는 단위
-> 서로 다른 애그리거트간에는 간접 참조
근데 보통 dao처럼 사용한다. 틀린걸까? 아니다
스프링의 @repository javadocs를 보면
이렇게 애매할 때 사용하는게 바로~ service
서비스는 stateless
도메인 서비스는 뭘 위한 방파제? 비즈니스 규칙을 애플리케이션 레이어로 넘치지 않도록 막아줌
도메인 서비스는 짜고 보면 꽤 절차지향적일 수밖에. 하지만 높은 응집도
ex. 환불과 결제
환불을 하려면 결제내역을 알아야함 (결제가 있어야 환불을 할 수있음)
-> payment.refund로 Refund 생성 (또는 refund의 생성자로 payment를 넘기는 것)이 제일 확실한 방법
----
모델링을 잘 해야 위에서 배운 것들 (Ex. vo, entity, aggreagate, repository등) 할 수 있다
📍 레이어 아키텍처
응용 서비스 vs 도메인 서비스
모든 비즈니스 로직을 도메인레이어에서 수행 -> 서비스 레이어는 가벼워짐. (도메인 객체 가져오고 실행시키고 트랜잭션 실행시키고 등)
얘는 응용 서비스일까 도메인 서비스일까?
얘는 비즈니스 로직을 담고 있기 때문에 도메인 서비스
각 레이어는 validation 필수 (아래 레이어는 위 레이어 모르니까)
근데 실제 구현에서 우리는 잘 안함 ㅋㅋ 유도리~
도메인 영역의 validation은 실제 검증이라기보단 information (도메인에 대한 설명)(계약)
📍 DTO
VO가 DTO의 역할을 할 수 있다. VO != DTO
그런데 내가 쓰는 프레임워크에 따라 getter, setter를 추가해야할 수도
도메인을 pure하게 유지하고 싶다 (getter, setter 없이)
도메인 모델이 생기는 이유는 비즈리스 로직을 수행하기 위해
dto가 생기는 외부 요구사항(클라이언트)에 의해 생김 (내부요구사항과 외부요구사항을 분리하기 위해. 도메인을 보호하기 위해)
중복되는 dto는 vo로 대체할 수 있을수도. 근데 트레이드오프의 영역
📍 DIP
저수준 모듈에 의존하지 않기 위해
📍 도메인 원정대
https://www.youtube.com/watch?v=kmUneexSxk0
모든걸 기술로 해결하려 하지말자~
2. 무중단 배포 관련 자료를 조금 읽었다.
3. 데모데이 페이지에 들어갈 내용을 다같이 정리했다.
4. 리팩토링 미션을 아주 조오금 했다.
기타
오늘 안 신기한 사실...
이렇게 타입이 다른데 success 길래 왜인가했더니..?
usingRecursiveComparison을 사용할 때 menugroup과 menugroupresponse의 필드명과 타입이 완벽하게 일치하면 통과하는 것 같다.
response의 name 필드를 namename 이런식으로 바꿔보니까 fail