[DDD 아키텍처/잡담] 도메인 주도 설계를 왜 해야 할까?

2025. 2. 28. 23:57·TIL
728x90
반응형
SMALL

ERD와 DDD의 관계

  • ERD는 각 도메인간의 관계를 fk로 참조하고 관련되어 있는 테이블끼리 연관관계를 만든다.
  • 이 관계를 기반으로 스프링에서는 자바 클래스와 JPA를 사용하여 불일치 패러다임을 해소한다.

하지만 여기서 문제점이 각 클래스간에 @ManyToOne, @OneToMany, @OneToOne으로 도메인간 종속관계가 모두 이어진다.
이 문제는 정합성, 일관성으로 이어진다. 만약 Order와 Product가 있고 M:N 관계일떄 중간테이블인 OrderItem이 있다고 생각해보자.
만약 OrderItem에서 수정이 이뤄진다면 이 테이블은 Product와 연관이 있을까?
JPA를 사용하고 엔티티중심으로 생각한다면 두 테이블이 모두 중간테이블과 연관되어 있기 때문에 영향을 미칠 수 있다. 예를 들어 Product에서 가격에 대해 수정이 이뤄졌다고 한다면 이전에 주문했던 제품들도 가격이 모두 바뀌어야 할까?
실제로 그런 일이 발생했다면 고객센터에 불이 났을 것이다.

그렇기에 OrderItem과 Product는 서로 영향을 끼칠 수 없으며 종속관계도 아닌 것이다.
이처럼 서로 영향을 미치지 않고, 미치지 않도록 해야하는 부분을 도메인별로 영역을 나누고 분리하는 것이 DDD의 원칙중 하나라고 생각한다.
다른 말로 도메인에서 다른 도메인에 대한 정보를 얻어야 할 때는 직접 서비스나 레포지터리로 들어가는게 아닌 도메인을 통해 들어가는 것이다.
각 도메인간의 의존성을 끊어서 응집도를 높이고 결합도를 낮춰야 한다는 것이다.

튜터님께서 강의해주신 내용을 기반으로 두 가지 개념이 있었다.
바운디드 컨텍스트 라는 개념과 애그리거트 라는 개념이다.
애그리거트보다 바운디드 컨텍스트가 더 큰 개념으로 도메인을 하나의 컨텍스트로 잡는 것이다.

예를 들어 주문- 주문 아이템, 상품 , 가게 - 가게주소 처럼 어떠한 종속관계를 갖는 테이블은 어떤 도메인의 시작점에서 연결되는 지점이므로 하나의 컨텍스트로 묶을 수 있는 것이다. 이 컨텍스트는 각각 독립적이어야 한다. 이 영역을 바운디드 컨텍스트라고 칭한다.

두 번째로 애그리거트는 애그리거트 루트라는 개념이 있다. 아까말한 도메인의 시작점이다. 주문-주문아이템에서 주문이 도메인의 첫 시작점이다. 그리고 이 도메인의 시작점에 영향을 받는, 종속성을 갖는 주문 아이템이란 도메인이 애그리거트루트의 애그리거트 속성이다.

이렇게 나눠진 영역에서 만약 다른 도메인의 정보를 가져와 저장했지만 정보가 변경되었다면 어떻게 해야 할까?
우리가 아는 Message Queue 방식을 이용해 정보를 구독한 다른 객체들에게 행동의 변화가 일어난다면 그것을 읽고 정보를 업데이트하는 방식으로 데이터의 변경이 진행된다.

그렇다면 처음 설계를 할 때 DDD 방식으로 설계를 해야 한다면 어떻게 진행할것인가?

  1. 가장 큰 주요 도메인을 나눈다. (주문)
  2. 도메인의 하위 개념들을 나열한다. (발송자, 주문자, 주문 아이템 등등)
  3. 이 개념을 클래스로 변환한다.
  4. 바운디드 컨텍스트별로 엔티티를 패키지단위로 나눈다.
  • 여기서 MSA는 변경 사항을 Event로 받아오고 단순 조회는 Rest API로 통신한다.
  • 모노리딕 아키텍처는 Rest APi, Service/Facade 패턴으로 통신한다.

앞으로 만들어봐야 이 개념들이 더 정확해질 것 같아 이전에 했던 프로젝트를 이 방식으로 패키지를 나누고 바꿔보면서 이전에 공부하고 싶었던 개념들을 다시 연습해 보려고 한다!

728x90
반응형
SMALL

'TIL' 카테고리의 다른 글

[MSA] DDD 구조 고려한 패키지를 생성하는 방법  (0) 2025.03.01
[TIL] 모놀리딕 스프링 부트 프로젝트를 수행하고 내가 공부해야 할 것들  (0) 2025.02.26
[Spring Security 예외 처리] 인증 및 인가에 대한 예외처리 방법  (0) 2025.02.25
[TIL] Stream 활용하기, CI/CD 파이프라인 개발, 엔티티 개발 협업  (0) 2025.02.20
[TIL] Filter예외 처리, 서버 배포  (0) 2025.02.19
'TIL' 카테고리의 다른 글
  • [MSA] DDD 구조 고려한 패키지를 생성하는 방법
  • [TIL] 모놀리딕 스프링 부트 프로젝트를 수행하고 내가 공부해야 할 것들
  • [Spring Security 예외 처리] 인증 및 인가에 대한 예외처리 방법
  • [TIL] Stream 활용하기, CI/CD 파이프라인 개발, 엔티티 개발 협업
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      자바 면접
      java
      백준
      JS
      Spring Data Redis
      자바
      프로그래머스
      스프링프레임워크
      레디스
      리눅스마스터2급정리
      jsp기초
      springsecurity
      CSS
      리눅스
      jsp request
      redis 채팅
      자바기초
      자바 면접질문
      JSP
      JavaScript
      자바 알고리즘
      Spring
      리눅스마스터2급
      Springframework
      redis
      Til
      spring redis
      자바 반복문
      자바스크립트
      HTML
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [DDD 아키텍처/잡담] 도메인 주도 설계를 왜 해야 할까?
    상단으로

    티스토리툴바