본문 바로가기

ddd17

도메인 이벤트 기반 아키텍처의 이벤트란? 매주 일요일 밤 10시마다 지인과 함께 도메인 이벤트 기반 아키텍처를 이해하는 연습을 하고 있습니다. 도메인 이벤트 기반 아키텍처을 이야기하면 대부분 Event Souring 과 CQRS 가 가장 먼저 언급되곤 합니다. 이 모든 단어의 한 가운데에 있는 것은 바로 이벤트입니다. 아래는 과거에 작성했던 이벤트 관련 블로그 글입니다. 앞으로 이야기 할 부분에 대해서 관련있는 내용이라 읽기를 추천드립니다. 메세지와 이벤트의 차이점은 무엇인가? 들어가기 트레바리에서는 도메인주도설계를 실천하고 있습니다. 도메인주도설계라는 것은 말 그대로 도메인을 중심으로 복수의 도메인이 책임,역할, 협력을 할 수 있도록 개발하는 것을 말합 happy-coding-day.tistory.com 이벤트 스토어(?) 이벤트 소싱(?) .. 2023. 8. 28.
DB AutoIncrement 가 아니라, 왜 굳이 IDGenerator Server 을 만들었을까? 추가) 관련 IDGenerator 오픈소스을 만들었습니다. ( github link ) 배경 @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; } 위 코드는 어떤 코드인지 짐작이 가는가? JPA 을 학습한 사람이라면 한번에 인지했을 것이다. 데이터베이스에 어떤 데이터을 저장시키기 위해서 데이터베이스에게 오름차순의 숫자을 요청하여 식별자 을 생성해내는 코드이다. 포스팅 제목에서 보았던 IDGenerator 종류의 하나이다. 이 쯤에서 제목에서 말하는 IDGenerator 는 무엇인지 이해할 필요가 있다. 앞에서 이미 언급된 '식별자' 을 만들어 주는 것이 IDGenerator 의 역할.. 2022. 10. 5.
Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture 가 나왔다.` 그럼 어떤 단점이냐? 바로 ~ 계층형 아키텍쳐의 단점은 무엇이냐면? 결국에는 도메인이 인프라에 의존하게 됩니다. 이 말은 즉, 도메인 관심사와 기술적 관심사가 섞이게 된다는 것을 의미합니다. 라고 동영상 중간에 말했습니다. 여기서 저는 왜? 도데체 왜 섞이지? 라는 생각을 하게 되었습니다. LayeredArchitecture 가 무엇인가? 우리가 흔히 알고 있는 LayeredArchitecture 는 여러 군데에서 사실 발견할 수 있습니다. 제가 .. 2021. 7. 26.
[2019] DDD Lite@Spring 동영상 시청 리뷰 DDD-Lite@Spring 세미나 내용이 유익하다고 판단되, 동영상을 보면서 정리한 내용입니다. 2번째 시청하면서, 정명주님이 생각하는 DDD에 대한 개념이 잘 녹아있고, 간결하게 DDD 에 대해서 설명해주셔서 정리하고자 합니다. 유지보수 사항에서 항상 개발자는 고통받습니다. 왜 그럴까요? 왜냐하면서, 애플리케이션이 엄청 복잡하기 때문입니다. 크게 2가지로 복잡합을 구분해보면 우리가 해결해야 할 문제 자체 우리가 사용하는 기술과 도구 위기가 어떻게 오는가? 빠르고 간단하게 일정 드리븐 개발을 하다보니까- 빠르고 간단하게 개발했는데, 요구사항이 변경되고 점점 복잡해지면서 빅뱅식 개편을 많이 하는데, 잘못된 레거시에 의존하기 때문에 이 순환이 반복됩니다. 원인은 빠르고 간단하게 맞지않는 접근법을 이용하다보.. 2021. 7. 18.
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.
상태 머신 다이어그램은 무엇일까? 상태 머신은 전이 트리거 및 제약 사항에 따라 동작을 분류하고 상태 간을 이동하는 방법을 보여준다. 이번에 사이드 프로젝트를 하면서 상태 머신 다이어그램을 그리는 도메인이 존재했다. 상품을 보여주는 Goods, Product와 달리 Goods는 소비자 관점에서 보여지는 물건으로서 노출될 수도 있고 노출되지 않을수도 있는데, 이 때 상태값에 따라 이동하는 상태머신 다이어그램을 만들어 보고 싶었다. 문제의 시작 처음에 상태머신 다이어그램을 그려보려고 했을 때 나의 시도는 아래와 같았다. 물건 생성 > 판매중 > 판매 중지 > 판매 종료 > 다시 판매 중 > … 이 얼마나 단조롭고 심플한가? 저 텍스트에서 발견할 수 있었던 나의 모습은 머릿속에 펜을 놓고 화살표를 그려보는 것이였다. 그러나, 정돈되지 않는 느.. 2021. 1. 30.
AGGREGATE가 존재하는 이유? 도메인과 도메인간에 연관관게를 최소주의 관점에서 설계하면 탐색이 단순해지고 폭발적으로 증가하는 관계를 제한하는 데 어느 정도 도움되지만 대부분의 업무 도메인은 상호 연관의 정도가 높아 결국 객체 참조를 통해 얽히고 설킨 관계망을 추적해야 한다. 그럼 얽히고 설킨 관계망을 어떻게 추적할 것인가? 또한, 모델 내에서 복잡한 연관관계를 맺는 객체를 대상으로 변경의 일관성을 보장하기란 쉽지 않다. 그 까닭은 단지 개발 객체만이 아닌 서로 밀접한 관계에 있는 객체 집합에도 불변식이 적용돼야 하기 때문이다. 그렇다고 변경의 일관성을 보장하고자 신중 장금 기법을 쓴다면 다수의 사용자가 서로 부적절하게 간섭해서 시스템이 사용할 수 없는 상태가 될 것이다. 그럼 우리는 도메인과 도메인간의 또는 모델 내에서 어떻게 관리할.. 2021. 1. 24.
테스트 주도 설계를 실천한다는 것 밥 로스 로스가 대중에게 인상적인 모습을 보인 것 중 하나가, 그림은 형태를 정하고 하나하나 디테일을 정해가면서 그려 나아가는 것이라는 일반인의 고정관념을 깬 것도 한몫 한다. 이미 그린 수풀이 붓으로 몇 번 칠하니 호수가 된다든지 하는 모습은, 그때그때 마음가는 대로 그려 나아가는 것이 낭만적이라는 느낌을 주기도 한데다, 유화를 배우지 않은 일반인 입장에서 보면 신기할 수밖에 없다. - 밥 로스에 대한 평가 우리는 밥 로스라는 사람을 알고 있습니다. 누가봐도 어려운 그림을 "참 쉽죠?(That easy)" 라는 대사로 유명한 밥로스는 그림을 그리는 방식이 특이하다고 합니다. 그림을 그릴 때, 밥 로스는 하얀 캔버스 위에 아주 약간의 덧칠로서 그림 전체의 윤곽을 만들어 완성 시키면서 그 다음 스텝을 이어.. 2020. 12. 18.
반버논이 말하는 Repository 란? 책, 이벤트 주도 설계 내용과 저의 의견을 섞어 내용을 적어내려갑니다. 들어가기 저에게 Repository 라는 말은 Android 을 개발 할때도 MVVM 패턴을 언급하면서 Repository 라는 용어가 처음 등장했습니다. 이후에 JPA를 학습하면서 Repository 라는 용어에 대해서 좀 더 친숙하게 다가왔고, 처음에는 단순하게 '어떤 저장소' 라는 의미로 다가왔습니다. 그러나, 도메인 주도 개발을 학습하면서 Repository 에 대해서 좀 더 깊이 있는 고찰을 할 수 있었습니다. 그럼 반버논의 책 DDD에서는 Repository 을 무엇이라 정의했을까요? Repository? 무슨 의미인가? 앞서 언급했던 Repository 라고 하면 딱 떠오르는, 그 의미 저장소. DDD에서도 Reposit.. 2020. 9. 15.
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.