도메인 주도 설계

ClassBinu·2024년 7월 29일

F-lab

목록 보기
64/65

복잡성을 다루는 패턴과 기법, 원칙

일종의 철학
핵심 내용 1장, 2, 3, 9, 14장

1부 동작하는 도메인 모델 만들기

사용자가 프로그램을 사용하는 대상 영역이 해당 소프트웨어의 도메인
e.g. 항공권 예약 프로그램의 도메인에는 항공기에 탑승하는 실제 승객
회계 프로그램은 화폐와 금융이 도메인

개발팀은 사용자의 활동과 관련된 지식 체계에 집중해야 함
근데 이건 너무 복잡해
그래서 모델이 필요하다.
모델은 지식을 선택저으로 단순화하고 의식적으로 구조화한 형태

도메인 모델은 다이어그램이 아니다.
다이어그램이 전달하고자 하는 아이디어다.
다이어그램을 이용해 모델을 표현하고 전달할 수 있다.

도메인은 일종의 현실들 모델링한 영화다.

1장 지식 탐구

지식 탐구를 통해 도메인 내부 구조를 파악하여 심층 모델을 설계

도메인 모델, 모델을 통해 도메인을 이해한다.

2장 의사소통과 언어 사용

도메인 모델은 프로젝트를 위한 공통 언어의 핵심이다.

일상적인 용어가 아니라 모델을 언어의 근간으로 사용하기

다이어그램, 문서, 말할 때 (커뮤니케이션) 동일한 언어 사용하기

UBIQUITOUS LANGUAGE의 변화가 곧 모델의 변화

DB 중심의 설계에서 도메인의 책임과 비즈니스 로직을 중심으로 설계
해결해야 할 문제는 비즈니스 문제의 복잡성을 도메인 모델을 통해 관리

게시글, 좋아요, 코멘트를 각각 모듈로 나눠야 하나? 하는 고민이 어느정도 해소되었음.
에그리게이트로 관리하면 됨! 그리고 그 에그리게이트와 연계된 리포지토리로 추상화 계층 관리
Post 애그리케이트: 게시글, 좋아요, 코멘트 // 게시글이 루트, 좋아요/코멘트는 종속 객체

@EntityRepository(Post)
export class PostRepository extends Repository<Post> {
  async addComment(postId: number, commentData: Comment): Promise<Comment> {
    const post = await this.findOne(postId, { relations: ["comments"] });
    const comment = new Comment();
    comment.content = commentData.content;
    comment.post = post;
    post.comments.push(comment);
    await this.manager.save(comment);
    return comment;
  }

  // 추가 CRUD 메소드 구현
}

문서는 코드가 이미 잘 하고 있는 것을 하려고 해서는 안 된다.

3장 모델과 구현의 연계

모델 주도 설계

  • 고수준 추상화 모델 사용
  • 모델을 통한 소프트웨어 자동 생성 초점
  • 모델의 역할: 소프트웨어 개발의 청사진, 코드 생성을 위해 사용

도메인 주도 설계

  • 도메인 전문가와 개발자 간의 커뮤니케이션을 통해 품질 관리

  • 비즈니스 도메인의 복잡성을 모델을 통해 관리하고 이해

  • 모델의 역할: 비즈니스 로직과 의사결정을 지원, 비즈니스 도메인의 일부로 간주

    모델은 비즈니스 전문가와 개발자 간의 커뮤니케이션 브릿지 역할

    객체 지향 언어가 MDD, DDD를 구현하는 구체적인 언어로 쓰이는 것

9장 암시적인 개념을 명확하게

먼 말인지 모르겠다..

0개의 댓글