부트캠프/Next Step DDD

태태개발일지 - 도메인 주도 설계의 사실과 오해 후기(조영호 강사님) 2일차

태태코 2025. 2. 24. 17:25
반응형

 

시작에 앞서 Q&A를 진행하셨다.

 

1. 성장할 수 있는 방법

사람마다 성장할 수 있는 방법이 다양하다. 본인에게 맞는걸 선택해야한다.

 

조영호 강사님의 스타일은

다양하고 넓게 공부하고, 파보고 싶은 분야를 정해서 더 깊게 들어가는 스타일이라고 하셨다.

 

1. 회사 공부 따로, 내 개인적인 공부 따로

: 난 강의를 보면서 공부하는 것이 조금 더 이해도 빠르고 쉽게 습득 할 수 있다고 생각한다.

 

2.개발자가 아닌 Domain 전문가가 읽을 만한 DDD 책

  1. Domain 주도 설계의 첫 걸음( 개발을 가장 적게 언급한다)
  2. Domain 주도설계의 구현 

 

DDD

 

DDD를 프로세스, 방법론으로 바라보면 어렵다.

 

모델링과, 코드작업이 동시에 일어난다.

그 이유는 도메인 모델을 코드로 보기 때문이다.

 

도메인

  • 기능요구사항
  • 불변식

불변식

A의 상태가 ~~해야 정상이야
B로 바꾸었을 때 ~~해야 정상이야

 

 

객체지향을 짤 때 Domain 중심으로 짜는 것  그것도 DDD이다.

 

 

Entity

객체의 속성이 아닌 연속성과 식별성이 중요하다 

Value Object

식별성이 중요하지 않고, 특성을 묘사한다 

 

ex)

1. 

entity

10년동안 지내온 친구가있는데 친구를 찾고싶다

하지만 성형을 했을 수도있고, 이름이 같을 수 도 있지만, 나랑 친구인 사람을 찾아야한다. 

 

value object

내가 4라는 숫자가 필요한데 이곳 저곳에서 사용해도된다.

 

2.

entity

쌍둥이 한명을 찾아야한다.

 

value object

사진을 찍어야하는데 쌍둥이중 한명이 필요하다.

 

 

식별성

동일함을 확인하려면 식별자를 가져야한다.
- 명칭이 바뀌더라도 동일하게 추적해야한다.

 

 

Entity가 복잡해지면 값 객체를 사용한다
entity를 가볍게 하기 위해서     (속성만 중요)

 

 

ex)

Money에 BigDecimal이라는 속성 하나만 있는데 분리하는 이유

코드를 보면서 이해하는 것보다 이것을 더 명확하게 표현하기 위해서이다.

 

보통 value object는 Entity의 속성으로 들어간다.

-> 복잡성을 낮추는것

Entity와 value object 구별법

Entity가 너무 클 때 속성중 같이 묶여다니는 것이 있는데

생각해보면 의미가 있는 것이다.

이것을 값객체로 적용해서줄여야한다.

 

객체는 가만히있고, 상태가 바뀌는 것: 가변객체

 

에그리거트

Entity와 Entity는 에그리거트로 묶는다.

여러가지 Enitty와 value object를 따로따로 관리하면 복잡하니깐, 에그리거트로 묶는다.

 

각각의 개념에 대한 불변식은 : validate
전체를 경계한 validate : 에그리거트 , 도메인룰이다.

 

에그리거트 (캡슐화의 개념)  가정

그룹을 따로 하나하나 검증할 경우 복잡하니깐,

모든 객체를 찔러봐야한다. 그래서 묶는것 

 

주의해야할 점

root 에그리거트는  entity 여야한다.

외부에서는 무조건 root entity를 통해서 접근해야한다. 값객체는 루트 엔티티가 될 수 없다.

root를 통해서 접근하기 때문에 , 전역적으로 구분이 가능해야하기 때문이다..

에그리거트안에서 있는 값객체들은 지역식별이다.

 

즉 

에그리거트 단위로 Repository를 생성해아한다.

 

연관관계

하나의 객체를 통해 다른 객체를 찾아갈 수 있으면 연관관계가 있다고 본다.

-> 주문을 통해 주문한 사용자를 찾는다.

 

연관관계의 팁

 

행위관점에서 덜 해로운것을 찾아서 단방향으로 처리해야한다.

A ->B 메세지 횟수  () B -> A 메세지 횟수를 비교하여 더 많은 쪽으로 방향을 잡는다.

 

*하지만 불필요하면 제거하자.*

 

에그리게이트는 도메인의 상태변경을 기준으로 말한다.

조회는 데이터를 통해서 해결해야한다.

 

캡슐화안에서는 1대 N , 양방향 즉 연관관계가 높아도된다.

BUt 에그리거트 끼리는 안된다.

 

루트에그리거트에서 모든 validate조건을 밀어넣는다.

 

에그리거트 안에있는건 주로 값객체를 사용하는데 그냥 삭제하고 밀어넣으면 되기때문이다.

 

DDD는 에그리거트 단위로 움직이고 에그리거트는 factory를 통해서 만든다.

서비스 -> 어떤 객체에도 속하지않는 연산.

반응형