본문 바로가기

도메인 주도 설계19

[특강] 도메인주도설계의 사실과 오해 후기 - 조영호 우리가 아는 '객체지향의 사실과 오해' 책에서 말하는 형식의 '도메인 주도 설계의 사실과 오해'가 아니다. 오늘의 특강 핵심 주제는 '도메인 주도 설계'가 어떻게 등장하게 되었는지에 대한 히스토리와 도메인 주도 설계와 객체 지향 프로그래밍에 대한 차이점 에 대해서 포문을 열었다. 우리가 말하는 도메인 주도 설계란? 무엇일까? 조영호님이 말씀하셨던 오해는 '대부분 우리가 말하는 도메인 주도 설계를 한다면?' 값객체, 엔티티, 팩토리, 애그리게이트 와 같은 것을 사용해야지만 도메인 주도 설계를 한다고 생각한다. 하지만 도메인 주도 설계란? 그렇지 어떤 기술적인/기법적인 것에 의존하는 것이 아니다. 그렇다면 도메인주도 설계란 무엇일까? 조영호님이 장표를 사전허가 없이 첨부할 수 없어 비슷하게 만들었습니다. 도.. 2023. 8. 18.
아키텍쳐에서 '서비스' 라는 용어 어디까지 알아보고 오셨나요? 우리가 사용하는 '서비스' 라는 용어는 개발 생태계에서 많이 사용되는 용어입니다. 우리가 알고있는 전통적인 레이어드 아키텍쳐에서도 '서비스'라는 용어가 특히 Application 에서 빈번하게 사용됩니다. 도메인 주도 설계에서 말하는 '서비스'에 대해서 설명하기 전에 전통적인 레이어드 아키텍처에 대해서 설명할 필요가 있다고 생각해 아래와같이 간략히 설명해보려 합니다. 그림 1에서 보이는 것과 같이 흔히 4가지의 계층으로 구성되어, Presentation/Application/Domain/Infra 로 구성되어있고, 의존성은 아래로 향합니다. Presentation 표현계층에서는 Web 에 관련된 책임을 가지게 됩니다. 객체 변환이나 JSON 변환 등의 대표적으로 Web에 대한 책임을 가지게됩니다. App.. 2023. 3. 17.
메세지와 이벤트의 차이점은 무엇인가? 들어가기 트레바리에서는 도메인주도설계를 실천하고 있습니다. 도메인주도설계라는 것은 말 그대로 도메인을 중심으로 복수의 도메인이 책임,역할, 협력을 할 수 있도록 개발하는 것을 말합니다. 실제로 동작되는 코드로서 도메인주도설계를 실천하며 우리는 메세지와 이벤트라는 용어를 자주사용했습니다. 이미 횟수로 귀로 많이 들어왔지만- 깊이있는 고찰을 하지 못했습니다. 헷갈릴 수 있는 두 용어에 대한 이해를 정리해보려 합니다. 본문 도메인주도설계는 잠시 잊어버리고 메세지란 무엇일까? 흔히 우리는 '메세지를 전달한다' 라고 말합니다. 이 말은 즉슨, A → B 에게 의미있는 내용을 전달하기 위한 행위라 볼 수 있습니다. 그럼 도메인주도설계에서는 어떤 의미를 가질까요? 여기서 USER, MEMBER 는 AGGREGATES.. 2021. 10. 23.
Domain-Driven Design: The Identifier Type Pattern[번역] 원문 - https://medium.com/@gara.mohamed/domain-driven-design-the-identifier-type-pattern-d86fd3c128b3 Domain-Driven Design: The Identifier Type Pattern A Typescript version medium.com Introduction Entity와 ValueObject 가 다른 점은 식별자이다. Entity는 식별자를 포함 내재하고 있지만, ValueObject는 식별자가 없다. Entity의 식별자는 다음 기술들 중에 하나로 설명할 수 있다. - Primitive Type - Special type defined as a value object or an alias type 도메인 주도 설.. 2021. 5. 24.
Value Object로서 Model Identity를 사용하는 3가지 이유[번역] 원본 - https://buildplease.com/pages/vo-ids/ 3 Reasons to Model Identity as a Value Object On of the defining characteristics of an Entity is that it has identity. From the Blue Book: “Some objects are not defined primarily by their attributes. They represent a thread of identity that runs through time and often across distinct representations buildplease.com 엔티티가 가진 중요한 특성 중 하나는 Identity 를 갖는 다는 .. 2021. 5. 17.
상태 머신 다이어그램은 무엇일까? 상태 머신은 전이 트리거 및 제약 사항에 따라 동작을 분류하고 상태 간을 이동하는 방법을 보여준다. 이번에 사이드 프로젝트를 하면서 상태 머신 다이어그램을 그리는 도메인이 존재했다. 상품을 보여주는 Goods, Product와 달리 Goods는 소비자 관점에서 보여지는 물건으로서 노출될 수도 있고 노출되지 않을수도 있는데, 이 때 상태값에 따라 이동하는 상태머신 다이어그램을 만들어 보고 싶었다. 문제의 시작 처음에 상태머신 다이어그램을 그려보려고 했을 때 나의 시도는 아래와 같았다. 물건 생성 > 판매중 > 판매 중지 > 판매 종료 > 다시 판매 중 > … 이 얼마나 단조롭고 심플한가? 저 텍스트에서 발견할 수 있었던 나의 모습은 머릿속에 펜을 놓고 화살표를 그려보는 것이였다. 그러나, 정돈되지 않는 느.. 2021. 1. 30.
AGGREGATE가 존재하는 이유? 도메인과 도메인간에 연관관게를 최소주의 관점에서 설계하면 탐색이 단순해지고 폭발적으로 증가하는 관계를 제한하는 데 어느 정도 도움되지만 대부분의 업무 도메인은 상호 연관의 정도가 높아 결국 객체 참조를 통해 얽히고 설킨 관계망을 추적해야 한다. 그럼 얽히고 설킨 관계망을 어떻게 추적할 것인가? 또한, 모델 내에서 복잡한 연관관계를 맺는 객체를 대상으로 변경의 일관성을 보장하기란 쉽지 않다. 그 까닭은 단지 개발 객체만이 아닌 서로 밀접한 관계에 있는 객체 집합에도 불변식이 적용돼야 하기 때문이다. 그렇다고 변경의 일관성을 보장하고자 신중 장금 기법을 쓴다면 다수의 사용자가 서로 부적절하게 간섭해서 시스템이 사용할 수 없는 상태가 될 것이다. 그럼 우리는 도메인과 도메인간의 또는 모델 내에서 어떻게 관리할.. 2021. 1. 24.
생명주기를 갖는 객체 - 엔티티(Entity)란? 엔티티라는 용어는 소프트웨어 개발에서 다방면으로 사용된다. 예를 들면 JPA에서도 도메인을 지정할 때 Entity라는 애노테이션을 붙이고, 어떤 식별자를 가진 객체를 만들때 이를 엔티티라고도 부른다. 물론 ORM과 같은 JPA에서 말하는 JPA와 도메인주도설계에서 말하는 엔티티는 조금 다른 의미를 가진다. 1. 엔티티란? 도메인 주도 설계에서 말하는 엔티티를 설명할 때는 식별성또는 개별성, 동등성 비슷하지만 다른 명칭으로 설명하는데, 여기서 저는 에릭에반스의 저서에서 나오는 식별성으로 엔티티를 설명하고자 합니다. 어떤 객체를 일차적으로 해당 객체의 식별성으로 정의할 경우 그 객체를 ENTITY라 한다. ENTITY에는 모델링과 설계상의 특수한 고려사항이 포함돼 있다. ENTITY는 자신의 생명주기동안 형.. 2020. 10. 28.
도메인 모델링이란? 에릭에반스의 도메인 주도 설계에서는 소프트웨어 시스템의 일부를 설계할 때는 도메인 모델을 있는 그대로 반영해서 설계와 모델의 대응을 분명하게 하라. 또한 모델을 재검토해서 더욱 자연스럽게 소프트웨어로 구현될 수 있게 수정하라. 도메인에 관한 심층적인 통찰력을 반영하려 할 때도 마찬가지다. 이렇듯 견고한 UBIQUITOUS LANGUAGE를 지원하는 것과 더불어 분석과 설계의 두 가지 측면을 충분히 만족하는 단 하나의 모델을 만들어내야 한다. 모델로부터 설계와 기본적인 책임 할당에 사용한 용어를 도출하라. 코드를 작성할 때 그러한 용어를 사용하면 코드가 모델을 표현한 것이 되고, 코드의 변경이 곧 모델의 변경으로 이어질 수 있다. 그 효과는 프로젝트의 나머지 활동에도 퍼져나가야 한다. 구현을 모델과 그대로.. 2020. 10. 25.
반버논이 말하는 Repository 란? 책, 이벤트 주도 설계 내용과 저의 의견을 섞어 내용을 적어내려갑니다. 들어가기 저에게 Repository 라는 말은 Android 을 개발 할때도 MVVM 패턴을 언급하면서 Repository 라는 용어가 처음 등장했습니다. 이후에 JPA를 학습하면서 Repository 라는 용어에 대해서 좀 더 친숙하게 다가왔고, 처음에는 단순하게 '어떤 저장소' 라는 의미로 다가왔습니다. 그러나, 도메인 주도 개발을 학습하면서 Repository 에 대해서 좀 더 깊이 있는 고찰을 할 수 있었습니다. 그럼 반버논의 책 DDD에서는 Repository 을 무엇이라 정의했을까요? Repository? 무슨 의미인가? 앞서 언급했던 Repository 라고 하면 딱 떠오르는, 그 의미 저장소. DDD에서도 Reposit.. 2020. 9. 15.
핵사고날 아키텍처에서 Port(Adapter)의 의미는 무엇일까? 이전 포스팅에서 말했던 어탭터 패턴 이렇게도 쓰일 수 있구나? 를 이해하면서 핵사고날 아키텍처에 대해서도 동시에 어느정도 이해할 수 있었습니다. 같이 스터디를 도와주시는 분들과 이야기하며 아주 사-알짝 핵사고날 아키텍처에 대해서 발을 담가볼 수 있는 이야기로 접근해보겠습니다. 0. 들어가기 안드로이드 모바일 프로그래밍을 했을 적에도 클린 아키텍처라는 말은 많이 들었지만, 코드로서 표현되는 프로젝트는 보기 힘들었습니다. 그러던 중 백엔드로 전향 이후, IDDD 프로젝트를 분석하며, 코드로서 핵사고날을 드러나는 아키텍쳐를 이해할 수 있었습니다. 핵사고날 아키텍처를 이해하는 것은 단순히 하나의 그림으로서 설명될 수 부분이 아니라고 생각합니다. 다이어그램과 더불어 코드, 그리고 그 외 도메인에 대한 이해와 의존.. 2020. 8. 29.
adapter 패턴, 이렇게도 쓰일수 있구나(with IDDD) 디자인 패턴의 착각 중에 모든 코드는 디자인 패턴에 나온 코드가 마치 책에서 나온 내용처럼 나올 것이라는 부분에 존재합니다. 오늘도, 다시한번 위와 같은 디자인 패턴의 착각을 느낍니다. IDDD_sample 코드 중, 서비스 단에서 팩토리의 사용 예를 설명하는 부분에서 흥미로운 부분을 발견했습니다. 레이어드 아키텍처에서 TranslatingCollaboratorService.java 의 존재는 이름과 같이 Collaborator 라는 협력 객체를 해석시켜주는 역할을 하는 클래스입니다. 어떻게 해석할 수 있는가에 대한 질문은, 이 글에서 논외이기 때문에 제외하겠습니다. 우리가 흔히 아는 adapter 패턴이 사용하는 client입장에서는 factory로서 동작할 수 있다는 것이 이 글의 요지입니다. 그럼 .. 2020. 8. 23.
왜 DDD 에서 팩토리 패턴을 사용하는 걸까? Photo by Christopher Burns on Unsplash 팩토리 패턴은 애그리게잇을 생성하는 책임을 가지는 메소드나 객체를 말한다. 도메인 주도 설계에서 팩토리 패턴을 사용되는 곳은 1. 도메인 모델 내의 팩토리 2. 애그리게잇 루트상의 팩토리 메소드 3. 서비스의 팩토리 그리고 에릭 에반스가 말하는 팩토리 패턴을 사용하는 주된 동기는 아래와 같다. 복잡한 객체와 애그리게잇 인스턴스를 생성하는 책임을 별도의 객체로 이동시키자. 여기서의 책임은 도메인 모델과 관련이 있진 않지만, 여전히 도메인 설계를 구성하는 한 요소다. 모든 복잡한 조립 과정을 캡슐화하고, 클라이언트가 인스턴스화된 객체의 구체적 클래스를 참조할 필요가 없도록 인터페이스를 제공하자. 전체 애그리게잇을 하나의 조각으로 생성하고,.. 2020. 8. 22.
[동영상 정리]애플리케이션 아키텍처와 객체지향 - 조영호님 영화관에서 영화를 상영하는 도메인을 예제로 OOP를 설명합니다. 아키텍처 프로젝트에 참여하는 개발자들이 설계에 대해 공유하는 이해를 반영하는 주관적인 개념 : 주관적이다... 중요한것? 변경하기 어려운 것? 일찍 변경 하기 어려운 것? 관심사의 분리 서로 다르고 관련이 없는 책임들을 분리 좀 더 세분화할수 있다.그러나 우리는 위 3가지로만 나눠서 시작하겠습니다. 여기서 가장 중요한 레이어는 도메인 레이어입니다. 대부분 2가지 종류의 도메인 레이어를 설계합니다. Transaction Script와 Domain Model의 차이점은 무엇일까? 도메인 레이어가 주도하기 때문에 도메인 레이어는 중요합니다. 아래는 도메인 컨셉입니다. 할인을 2가지 정책을 가질 수 있다. 퍼센트 또는 고정 할인가로 할 수 있다... 2020. 8. 21.
반버논이 말하는 Value Object 란? 반버논의 도메인 주도 개발 서적에서 발췌 값 객체(Value Object) DDD의 필수적인 구성 요소. 왜? 값의 이점에 대해 이해하라. 측정하고 수량화하거나 설명해주는 값 타입은 생성,테스트, 사용, 최적화, 유지 관리가 더 쉽다. 가능한 위치에선 엔티티 대신 값 객체를 사용해 모델링하도록 노력해야 한다는 사실을 알게 되면 놀랄지도 모른다. 심지어 도메인 개념이 엔터티로 모델링돼야할 때도 엔티티의 설계는 자식 엔티티의 컨테이너보다는 값의 컨테이너로 동작하는 쪽으로 기울어야 한다. 배울 내용 값으로 모델링하기 위해 도메인 개념의 특징을 이해하는 방법을 배우자 통합의 복잡성을 최소화하기 위해 값 객체를 활용하는 방법을 살펴보자 값으로 표현된 도메인 표준 타입의 사용을 확인하자. 사스오베이션은 어떻게 값의.. 2020. 8. 12.
Notification 구현 in IDDD_Samples - 메시지에 기반한 알림 발행 NotificationService는 메시징 인프라를 통해 DomainEvent 인스턴스를 발행하는 한 가지 방법을 제공. - 책에서 말하는 Notification 구현 - 실제 프로젝트에서 Notification 구현 public class NotificationService { public void publishNotifications(){ PublishedMessageTracker publishedNotificationTracker = this.publishedMessageTracker(); List notifications = this.listUnpublishedNotifications( publishedNotificationTracker.mostRecentPublishedNotificationI.. 2020. 8. 8.
Notification 구현 in IDDD_Samples - 리소스풀 방식 - 책에서 말하는 Notification 구현(리소스풀 방식) - 실제 프로젝트에서 Notification 구현 - 그림으로 이해해보기 앞서 설명했던 메세지 전달 방법중 리소스풀을 활용한 전달 방법 책에서 말하는 Notifiaction 구현 책에서 시작은 NotificationService에 대한 언급으로 시작한다. 이벤트가 모델로부터 발생한 알림으로써 발행될 때, 도메인의 관심사가 아닌 애플리케이션의 관심사라는 것을 강조. public class NotificationService { @Autowired private EventStore eventStore; @Autowired private NotificationPublisher notificationPublisher; public Notificati.. 2020. 8. 8.
도메인 주도 설계에서 Notification 이란 무엇인가? 목차 - 들어가며 - Notification이란? - 왜 EventStore를 활용한 Notification이 필요해진걸까? - 그림으로 이해해보는 Notification - 조금 더 생각해보기 들어가며... 토이 프로젝트에 참여하며 EventSouring에 대한 이야기를 이야기를 햇님과 이야기를 나눴습니다. 그러나, 이야기 중간중간에 "이벤트소싱과 Notification은 다른것이다." 라는 것을 끊임없이 말씀하셨고, 저는 이 둘을 비교할 수 있는 대상이라고 생각했습니다. 그러나, 몇차례의 티키타가로 이 둘의 관계를 좀 더 면밀히 살펴보는 시간을 가졌습니다. Notification이란? 반 버논 책의 8장 도메인 이벤트 부분에 Notification에 대한 이야기가 있습니다. repository에서 애.. 2020. 8. 8.
왜 Enum을 아래와같이 작성했을까? /** * Created by joenggyu0@gmail.com on 4/7/20 * Github : http://github.com/lenkim */ package net.slipp.moim.domain.model.recruit; public enum Status { BEGIN { public boolean isBegun() { return true; } }, WORKING { public boolean isWorking() { return true; } }, FINISH { public boolean isFinished() { return true; } }; public boolean isBegun() { return false; } public boolean isWorking() { return .. 2020. 7. 15.