ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DDD
    ProgrammingTheory/DDD 2023. 8. 8. 15:03

    DDD  ,, DDD ,, DDD  벡엔드 엔지니어의 길을 걷고자 공부한 지난 1년간 정말 많은 블로그에서 보고 들은 단어 이지만 ,

    DDD 가 뭐다 ! 라고 명확하게 이야기를 못한 자신을 보았다.

     

    그러한 이유는 명확한 정의, 이론들을 알지 못한 상황에서 기능을 급급하게 만들었던, 모래성을 쌓는 것 과 같은 일을 하고 있었기 때문이다.

     

    이글을 통하여 나와 같이 DDD에 대하여 가볍게 넘어가거나 추상적으로만 개념이 있던 사람들에게 도움이 되고자 아직 부족하지만 나름의 경험과 공부했던 내용의 일부를 적어본다.

     

    DDD 정의 :

     

    DDD 는 도메인의 깊은 이해(process and domain rule)를 바탕으로 만들어진 도메인 모델을 중심으로 소프트웨어를 개발 및 설계하는 접근 법이다.

     

    DDD 이전에 MDD 라는 "개발 방법론"이 있었던 것 처럼 , DDD 는 개발 방법론이자 문제를 해결 하는 하나의 방법이다. 

     

    (OOP 와 DDD  는 구분이 가능 해야한다.)

     

    DDD 창시자 에릭 에반스의 DDD 의 관한 강의 영상은 다음 링크에서 확인 가능하다. 

     

    꼭 꼭 보길 추천한다.  개인적으로 소프트웨어 설계에 사람들과 언어의 중요성에 관한 설명이 인상이 깊었다.

     

    https://www.youtube.com/watch?v=pMuiVlnGqjk&t=2075s 

     

     

    DDD 의 관하여 다음 키워드를 꼭 알아야한다. 

     

    - 도메인 : 풀고자 하는 문제의 넓은 주제 또는 정의 이다.

    - 서브 도메인 : 도메인을 위한 하위의 추상화들이다 .  배달이라는 도메인에  회원 , 결제 , 배송 등의 서브 도메인이 존재한다.

     

    전략적인 설계 

     

    - 바운디드 컨텍스트 :

    배달앱에서 음식을 주문하고 결제를 하는 기능이 있다라고 가정하자.

     

    음식 관련 개발, 주문 관련 개발, 결제 관련 개발의 팀들은 각각 서로 다른팀의 대한 도메인의 전문 성이 부족하고 , 같은 것을 표현하는 데이터에 대해서 다르게 표현하거나 해석을 하는 "맥락 "이 다를 수가 잇다.

     

    이러한 맥락 "context" 를 나누는 것이 바운디드 컨텍스트 이며 , 각 팀에서 필요한 데이터는 그 모양과 처리 방법이 다르기 때문에 나눠 버린다.

     

    - 유비쿼터스 언어 : 언어의 일치 이다. 실제 프로젝트에서 백과 프론트 모든 팀원이 언어를 일치하는 일을 하는 것처럼 , 

    하나의 대사을 표현하는 언어를 일치 시켜야 한다.  사람인지 , 회원인지, 멤버인지 정하는 것이 하난의 예시가 될것 같다.

     

    전술적인 설계 

     

    에그리게이트 

     

    - 엔티티 :  식별자를 가지며 생명 주기를 갖는 모델 객체이다.  SpringBoot 의 @Entity 와는  차이가 있다 .

    내부적으로 상태가 변경이 가능한 데이터 이다.

     

     

    - 값 객체 : 값을 표현 하는 객체로 ,예를 들어 돈을  단순하게 정수로 표현하는 것 보다 Money 라는 객체로 감싸서 표현을 하는것이 , 코드를 통해서 도메인을 더 자세하게 표현을 할 수 가 있고 , 사이드로 관련 값을 다루는 로직을 응집 시킬 수가 있다.

    내부적으로 상태가 바뀌는 엔티티와 구분이 되며 실제 상태가 변경된 객체가 필요하면 객체를 새로 생성해야한다.

    엔티티의 내부 필드를 다양하게 표현을 해보는 연습을 해보자.

     

    DDD 의 도메인 모델 패턴이 서비스 스크립트 패턴과는 구분되는 설계 방식이다.

    도메인 모델 패턴에서 한발 더 나아가 값객체를 이용하는 에그리케이트 패턴의 대하여 에반스는 설명을 하며 ,  에그리게이트 루트를 통한 참조와 식별자를 이용한 참조를 통하여 유연한 설계를 추구하는 것을 책을 통하여 알 수 가 있다.

     

     

     

     

     

    정리

    복잡한 비즈니스의 문제와  , 기술적인 문제  , 레거시의 문제들로 부터 복잡한 소프트웨어가 나온다.

    현제의 기능을 충실하게 제공하며 미래의 변경사항의 대한 최소한의 대처를 가능하게 하는 유연한 소프트웨어는 , 과심사(바운디드 컨텍스트)의 분리로 부터 시작하여 도메인 지식을 중앙화 , 정의 및 정리 하고, 도메인을 구체화, 모델간의 경계를 분명히 하는 것 , oop 설계 원칙에 맞는 코드 작성모두 DDD 로 이어진다.

     

     

     

    그외  ,

    에릭 에반스(Evans)의 DDD 를 조금더 실용적으로  설명하는 도서가 반 버논의 DDD 책들로 구글에 pdf 가 돌아다니닌 확인해보자.

     

    마틴 파울러 왈 에릭 에반스는 XP 의 지지자 이다.

     

     

     

     

    참고 :

    - 책 DDD 입문

     

    - 각종 개인 블로그들

     

    - 카카오 기술 블로그

    https://tech.kakao.com/2022/12/12/ddd-of-recommender-team/

     

    추천팀의 DDD 도입기

    추천팀의 DDD 도입기안녕하세요, 추천팀 제이입니다. 추천팀에서 새로운 머신러닝 플랫폼 개발 프로젝트에 Domain-driven design (DDD)를 적용했는데요, 이 글에서는 적용한 배경과 적용 과정, 그리고

    tech.kakao.com

     

    - 컬리 기술 블로그

    https://helloworld.kurly.com/blog/road-to-ddd/

     

    Database Driven Development에서 진짜 DDD로의 선회 -1-

    DDD에 대한 오해에서 벗어나고 개발의 즐거움을 깨달은 이야기

    helloworld.kurly.com

     

    -Maritn Fowler blog

    https://martinfowler.com/bliki/DomainDrivenDesign.html

     

    bliki: DomainDrivenDesign

    a bliki entry for DomainDrivenDesign

    martinfowler.com

     

Designed by Tistory.