📖
Aaron's TECH BOOK
  • Intro
    • About me
  • Lecture
    • Kubernetes
      • Begin Kubernetes
    • Kafka
      • Begin Kafka
    • Kotlin
      • TDD, Clean Code Preview
      • woowa Kotlin
    • Java
      • Multithread Concurrency
      • The Java
    • Toby
      • Toby Spring 6
      • Toby Spring Boot
    • MSA
      • 01.Micro Service
      • 02.DDD 설계
      • 03.DDD 구현
      • 04.EDA 구현
    • Spring Boot
    • Spring Batch
    • Spring Core Advanced
    • Spring DB Part II
    • Spring DB Part I
    • JPA API and Performance Optimization
    • JPA Web Application
    • JPA Programming Basic
    • Spring MVC Part 2
      • 01.Thymeleaf
      • 02.ETC
      • 03.Validation
      • 04.Login
      • 05.Exception
    • Spring MVC Part 1
      • 01.Servlet
      • 02.MVC
    • Http
      • 01.Basic
      • 02.Method
      • 03.Header
    • Spring Core
    • Study
      • Concurrency issues
      • First Come First Served
      • Performance Test
      • TDD
      • IntelliJ
  • Book
    • Kafka Streams in Action
      • 01.카프카 스트림즈
      • 02.카프카 스트림즈 개발
      • 03.카프카 스트림즈 관리
    • Effective Kotlin
      • 01.좋은 코드
      • 02.코드 설계
      • 03.효율성
    • 이벤트 소싱과 MSA
      • 01.도메인 주도 설계
      • 02.객체지향 설계 원칙
      • 03-04.이벤트 소싱
      • 05.마이크로서비스 협업
      • 06.결과적 일관성
      • 07.CQRS
      • 08.UI
      • 09.클라우드 환경
    • 몽고DB 완벽 가이드
      • I. 몽고DB 시작
      • II. 몽고DB 개발
    • Kotlin Cookbook
      • 코틀린 기초
      • 코틀린 기능
      • ETC
    • Kotlin in Action
      • 함수/클래스/객체/인터페이스
      • 람다와 타입
      • 오버로딩과 고차 함수
      • 제네릭스, 애노테이션, 리플렉션
    • Kent Beck Tidy First?
    • 대규모 시스템 설계 기초
      • 01.사용자 수에 따른 규모 확장성
      • 02.개략적인 규모 추정
      • 03.시스템 설계 공략법
      • 04.처리율 제한 장치 설계
      • 05.안정 해시 설계
      • 06.키-값 저장소 설계
      • 07.유일 ID 생성기 설계
      • 08.URL 단축기 설계
      • 09.웹 크롤러 설계
      • 10.알림 시스템 설계
      • 11.뉴스 피드 시스템 설계
      • 12.채팅 시스템 설계
      • 13.검색어 자동완성 시스템
      • 14.유튜브 설계
      • 15.구글 드라이브 설계
      • 16.배움은 계속된다
    • 실용주의 프로그래머📖
    • GoF Design Patterns
    • 도메인 주도 개발 시작하기
      • 01.도메인 모델 시작하기
      • 02.아키텍처 개요
      • 03.애그리거트
      • 04.리포지터리와 모델 구현
      • 05.Spring Data JPA를 이용한 조회 기능
      • 06.응용 서비스와 표현 영역
      • 07.도메인 서비스
      • 08.애그리거트 트랜잭션 관리
      • 09.도메인 모델과 바운디드 컨텍스트
      • 10.이벤트
      • 11.CQRS
    • Effective Java 3/E
      • 객체, 공통 메서드
      • 클래스, 인터페이스, 제네릭
    • 소프트웨어 장인
    • 함께 자라기
    • Modern Java In Action
      • 01.기초
      • 02.함수형 데이터 처리
      • 03.스트림과 람다를 이용한 효과적 프로그래밍
      • 04.매일 자바와 함께
    • Refactoring
      • 01.리펙터링 첫 번째 예시
      • 02.리펙터링 원칙
      • 03.코드에서 나는 악취
      • 06.기본적인 리펙터링
      • 07.캡슐화
      • 08.기능 이동
      • 09.데이터 조직화
      • 10.조건부 로직 간소화
      • 11.API 리팩터링
      • 12.상속 다루기
    • 객체지향의 사실과 오해
      • 01.협력하는 객체들의 공동체
      • 02.이상한 나라의 객체
      • 03.타입과 추상화
      • 04.역할, 책임, 협력
      • 05.책임과 메시지
      • 06.객체 지도
      • 07.함께 모으기
      • 부록.추상화 기법
    • Clean Code
    • 자바 ORM 표준 JPA 프로그래밍
Powered by GitBook
On this page
  • 도메인
  • 도메인 전문가와 개발자 간 지식 공유
  • 도메인 모델 패턴
  • 아키텍처 구성
  • 도메인 모델 도출
  • 엔티티와 밸류
  • 엔티티 식별자와 밸류 타입
  • 도메인 모델이 set 메서드 넣지 않기
  • 도메인 용어와 유비쿼터스 언어
  1. Book
  2. 도메인 주도 개발 시작하기

01.도메인 모델 시작하기

도메인 주도 개발 시작하기 1장을 요약한 내용입니다.

Last updated 1 year ago

도메인

  • 소프트웨어로 해결하고자 하는 문제 영역.

  • 한 도메인은 다시 하위 도메인으로 나뉠 수 있다.

  • 도메인: 온라인 서점

    • 하위 도메인: 주문, 혜택, 회원, 정산, 결제, 배송, 카탈로그, 리뷰

도메인 전문가와 개발자 간 지식 공유

  • Garbage in, Garbage out

개발자는 요구사항을 이해할 때 왜 이러한 기능을 요구하는지 또는 실제로 원하는 게 무엇인지 생각하고 전문가와 대화를 통해 진짜로 원하는 것을 찾아야 한다.

도메인 모델 패턴

Result
  • 도메인 모델은 아키텍처 상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴

  • 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다.

  • 핵심 규칙을 구현한 코드는 도메인 모델에만 위치하기 때문에 규칙이 바뀌거나 규칙을 확장해야 할 때 다른 코드에 영향을 덜 주고 변경 내역을 모델에 반경할 수 있다.

아키텍처 구성

영역
설명

사용자 인터페이스 또는 표현(Presentation)

사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만 아니라 외부 시스템일 수도 있음

응용(Application)

사용자가 요청한 기능을 실행. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행

도메인(Domain)

시스템이 제공할 도메인 규칙을 구현

인프라스트럭처(Infrastructure)

데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리

도메인 모델 도출

  • 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것.

  • ex)

    • 최소 한 종류 이상의 상품을 주문해야 한다.

    • ...

    • 출고를 하면 배송지를 변경할 수 없다.

코드를 보면서 도메인을 깊게 이해하게 되므로 코드 자체도 문서화의 대상.

단순히 코드를 보기 좋게 작성하는 것뿐만 아니라 도메인 관점에서 코드가 도메인을 잘 표현해야 비로소 코드의 가독성이 높아지고 문서로서 코드가 의미를 갖는다.

엔티티와 밸류

  • 식별자를 가진다.(식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 보유, ex. 주문번호)

  • 엔티티의 식별자는 변경되지 않고 고유하므로 두 엔티티 객체의 식별자가 같으면 두 엔티티는 같다고 판단.

  • 식별자 생성.

    • 특정 규칙에 따라 생성

    • UUID, Nano ID 같은 고유 식별자 생성기 사용

    • 값 직접 입력

    • 일련번호 사용(시퀀스, DB 자동 증가 컬럼)

    • 밸류 객체 데이터를 변경할 때는 기존 데이터를 변경하기보다 변경한 데이터를 갖는 새로운 밸류 객체 생성 방식 선호.

  • 두 밸류 객체를 비교할 때는 모든 속성이 같은지 비교.

엔티티 식별자와 밸류 타입

  • 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 하자.

    • private OrderNo number;

도메인 모델이 set 메서드 넣지 않기

  • set 메서드는 필드값만 변경하고 끝나므로 상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다.

  • 도메인 객체 생성 시 온전하지 않은 상태가 될 수 있다.

  • 도메인 객체가 불완전한 상태로 사용되는 것을 막기 위해 생성자를 통해 필요한 데이터를 모두 받자.

  • 밸류 타입은 불변으로 구현

.

도메인 용어와 유비쿼터스 언어

  • 코드 작성 시 도메인에서 사용하는 용어는 매우 중요.

  • 전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 만들고 이를 대화, 문서, 도메인 모델, 코드 테스트 등 모든 곳에서 같은 용어를 사용

Eric Evans는 도메인 주도 설계에서 언어의 중요함을 강조하기 위해 유비쿼터스 언어라는 용어를 사용

엔티티 /

밸류 타입 /

개념적으로 완전한 하나를 표현할 때 사용 / ,

밸류 타입을 위한 기능 추가 가능 /

Order
ShippingInfo
Receiver
Address
Money