Enjoy My Posts

DDD 개략

Posted on By Geunwon Lim

이 포스트는 예전 문서를 정리하던 중 준범이가 DDD에 대해 설명해준 걸 적어놓은 게 있어 블로그에 옮깁니다. 예전에 무슨 말인지도 모르고 따라 적었던거같은데 지금 보니 굉장히 유용? 하달까요, 뭔가 정리가 깔끔한 것 같아서 블로그에 저장해놓습니다. 2018년에 적어놓은 것인데 3년간 공부를 한 후 보니 느낌이 오묘하네요.

DDD는 프로젝트의 복잡성을 줄여주기 위해, ‘모든 지식의 중앙화’한다.

DDD는 소프트웨어 전문가가 비즈니스 전문가의 심적 모델을 개발할 수 있도록 해준다.

유비쿼터스 언어(팀의 모든 사람들에 의해 개발, 충분히 이해되고 동일하게 사용되는 언어)는 모든 팀원에게 깊은 도메인 통찰을 전파한다.

바운디드컨텍스트는 의미적으로 동일한 컨텍스트의 범위 표현한다.

도메인은 소프트웨어로 해결하고자 하는 문제 및 관심사를 말한다. 비즈니스적인 성격을 띄는 게 보편적이다. 도메인 모델이란 도메인의 추상화이다. 즉 현실 세계에 존재하는 문제에 대한 지식을 단순화하고, 구조화한 형태이다. 그러다보니 현실을 사실적으로 반영하기보단 문제 해결을 위해 인위적으로 단순화된다.

폭포수 개발 방식이라고 불리는 것은 업무전문가와 분석가, 프로그래머가 피드백을 전혀 하지 않아 실패할 수밖에 없고, 이터레이션 방식은 모델을 만들지 않기 때문에 추상화 되지 않아 지식 축적에 실패한다. 모델과 구현이 동떨어지게된다.

즉 업무전문가, 분석가, 프로그래머가 함께 모델을 만들어야 한다. 그래야 모델이 더욱 명료해지고, 구현이 용이해진다.

분석 모델에서는 분석과 설계가 섞이면 혼란만 초래한다고 주장하였다. 이 모델의 단점은 초기 지식 탐구가 코딩이 시작되면 사라진다는 것이다.

모델 주도 설계에서는 분석과 설계 모델을 나누지 않는다. 유의할 점은 기술적 고려사항이 분석에 심각하게 침해되어서는 안된다는 것이다. 모델과 설계가 밀접한 대응을 가능하게 하려면 모델의 개념에 직접적으로 대응되는 것을 만들 수 있는 소프트웨어 도구가 필요하다. 객체 지향 프로그래밍이 가장 효과적인 도구이다. 절차적 언어에 대응하는 모델링 패러다임이 없기 때문이다.

어플리케이션 계층은 도메인 간 상호작용만을 위해 존재한다. 도메인 객체에 작업을 위임한다. 작업의 진행 상황만을 상태로 가진다.

도메인계층에서는 업무 개념 및 업무 상황, 규칙에 관한 정보를 표현하고 기술적인 세부 사항은 인프라스트럭처에 위임한다.

인프라스트럭처 계층에서는 상위 계층을 지원하는 일반화된 기술적 기능을 한다. 예를 들어 메시지 전송이나 도메인 영속화한다.

엔터티, vo: 공통점은 둘 다 ‘어떤 객체가 상태를 가진 것’. 차이점은 연속성과 식별성을 가지는가. 연속성, 식별성이 필요하다면 엔티티. 중요한 것은 영속성이 둘을 나누는 개념은 아니라는 것. Vo도 엔티티와 함께 데이터베이스 저장될 수 있음.

현실세계에서는 보통 객체들이 양방향으로 디펜던시를 가지지만, 단순화를 위해 단방향으로 관계를 정의할 필요가 있음. 엔티티 – 각 객체의 필드값은 조금씩 바뀔 수 있지만, 그 객체를 식별할 수 있어야 함. 유일 아이디를 생성해서라도. Vo는 값이 변할 수도 없고, 식별 불가해도 됨.

서비스는 어플리케이션 계층을 말하는 게 아님. 어플리케이션, 도메인, 인프라스트럭처 모드 서비스를 가질 수 있음. 어떤 객체에도 속하지 않는 연산이 있을 수 있음. 일부러 엔티티에 책임을 부과할 필요 없이 서비스를 모델에 명시적으로 포함. 서비스는 다른 객체와의 관계를 중요시. 클라이언트에 무엇을 제공하느냐에 초점을 맞춤. 일반적으로 어플리케이션 서비스에서는 도메인 계층 및 인프라스트럭처 계층에 존재하는 객체를 사용해 그들의 상호작용을 담당.

보통 객체는 생성자를 호출해 만들어진 다음, 가비지 컬렉터에서 삭제됨. 근데 엔티티는 더 오래 지속되고, 메모리 안에서만 시간을 보내지 않는다. 각 엔티티는 상호 의존성을 갖는다.

어그리게이트는 연관 객체의 묶음을 말함. 루트와 바운더리가 있는데, 루트는 단 하나만 존재하고 외부에서 객체를 참조할 때 루트를 이용해야함. 삭제, 변경도 루트를 통해서 이뤄져야. 어그리게이트를 생성하는 일이 복잡하다면 팩토리를 이용해 캡슐화.

마이크로서비스에서 ‘서비스로서 컴포넌트화’, ‘비즈니스 수행에 따른 구성’, ‘분산화된 데이터 관리’, ‘진화하는 설계’가 바운디드 컨텍스트와 유사. 경계를 잘 찾아야함.

이벤트소싱: 어플리케이션의 모든 상태 변화를 순서에 따라 이벤트로 보관.

이벤트소싱- 도메인 객체 조회, 도메인 객체 변경, 일관성의 기준인 애그리거트 단위.

이벤트 구성: 애그리거트타입, 애그리거트식별자, 이벤트타입, 이벤트시간 등