이 책은 도메인 주도 설계(DDD)를 처음 배우는 개발자를 위한 책이다. 실제 업무에 DDD를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성했다. 이 책으로 도메인 모델을 이용하여 애플리케이션을 구현하면서 DDD에 대한 이해를 넓힐 수 있을 것이다.
저자소개
저자
최범균
코딩하는 걸 좋아하고 나이 들어서도 코딩하고 싶은 개발자다. 좋은 책과 글을 쓰고 싶어 하며 유튜브나 SNS로 개발 관련 이야기를 나누고 있다.
이 책은 도메인 모델을 이용하여 애플리케이션을 구현하는 데 필요한 내용을 다루며 전체 11
장으로 구성되어 있다.
★이 책의 내용
1장과 2장에서는 도메인 모델을 구현할 때 알아야 할 기본적인 내용을 다룬다. 1장에서는 도메인 모델이 무엇인지 알아보고 엔티티와 밸류에 대해 알아본다. 2장은 상위 수준에서 아키텍처의 네 영역과 DIP 패턴을 설명하고 도메인 영역의 구성 요소에 대해 살펴본다.
3장부터 5장은 애그리거트와 리포지터리를 설명한다. 애그리거트는 복잡한 도메인 모델을 관리 가능한 단위로 묶어주는 역할을 담당한다. 3장에서는 애그리거트가 무엇이고 구현을 어떻게 하는지 알아본다. 4장에서는 애그리거트의 논리적인 저장소인 리포지터리를 구현하는 방법을 알아보고 5장에서는 검색 조건을 위한 스펙, 정렬, 페이징 등 조회 기능을 구현해본다.
6장은 응용 서비스와 표현 영역에 대해 설명한다. 응용 서비스가 어떻게 도메인 모델을 사용하고 어떤 역할을 수행하는지 알아보고 표현 영역과 응용 서비스의 연동에 대해 설명한다.
7장은 도메인 영역의 구성요소 중 하나인 도메인 서비스가 필요한 이유와 구현에 대해 설명한다.
8장에서는 애그리거트의 트랜잭션 범위에 대해 살펴본다. 애그리거트의 트랜잭션 처리를 위해 DBMS를 이용한 선점 잠금과 버전을 이용한 비선점 잠금을 구현하는 방법을 소개한다.
9장은 애그리거트와 더불어 가장 중요한 개념 중 하나인 바운디드 컨텍스트에 대한 내용을 다룬다. 바운디드 컨텍스트가 무엇이고 각 컨텍스트의 통합과 관계에 대해 배워본다.
10장과 11장은 각각 이벤트와 CQRS에 대해 설명한다.
10장은 도메인 이벤트를 이용해서 시스템의 결합도를 낮추고 기능을 확장하는 방법을 설명하며 비동기로 이벤트를 처리하는 몇 가지 구현 방법도 살펴본다. 11장은 CQRS가 무엇인지 알아보고, 이를 통해 어떤 효과를 얻을 수 있는지에 대해 설명한다.
★ 다루는 내용
☑ 도메인 모델의 이해, 엔티티와 밸류의 개념
☑ 아키텍처의 주요 영역 구성요소와 DIP 패턴
☑ 애그리거트, 리포지터리 등 DDD 주요 패턴의 이해와 구현 방법
☑ 응용 서비스와 표현 영역을 연동하는 방법
☑ 도메인 서비스의 필요성과 구현 방법
☑ 도메인 모델의 트랜잭션 충돌을 처리하는 방법
☑ 도메인 이벤트를 이용하여 시스템의 결합도를 낮추고 기능을 확장하는 방법
☑ CQRS의 개념과 명령 모델/조회 모델을 나누는 방법
★ 대상 독자
이 책은 DDD를 처음 접하는 개발자를 위한 책으로 DDD 입문자를 대상으로 한다. DDD 고수가 되는 법을 알려주는 책은 아니다. 이미 DDD 기초를 마스터했다면 다른 책을 통해 DDD의 심오함을 느끼길 바란다. 아직 DDD를 잘 모르지만 관심이 있다면 이 책을 통해 DDD에 대한 호기심을 채울 수 있을 것이다.
★ 예제 소스
예제 코드는 메이븐, 자바 17, 스프링 부트, JPA(하이버네이트), 타임리프, MySQL을 이용해서 작성했다.
현 시대는 회사 업무를 할 때 노트북, 컴퓨터, 모바일 기기(휴대폰, 갤럭시 탭, 아이패드)등을 사용하여 보다 편리한 생활을 하고 있습니다. 그에 따라 업무가 시스템적으로 발전하면서 업무를 진행할 때 필요한 기능들의 구조와 그러한 기능들을 담당하는 부서들간의 협업이 매우 중요하게 되었습니다. 시스템상에서 이러한 것을 도메인이라고 합니다.
도메인이란 정확히는 인터넷에 연결된 컴퓨터를 사람이 쉽게 기억하고 입력할 수 있도록 문자(영문, 한글 등)로 만든 인터넷 주소를 말하며 인터넷을 이루는 각 구조들을 의미하기도 합니다.
제가 이 책을 선택한 이유는 이 책이 DDD(Domain-Driven-Design) 입문자들을 대상으로 제작된 책이여서 DDD를 처음 접하는 개발자들을 학습하기 쉬운 내용으로 구성된 책이기 때문입니다.
이 책의 특성은 책 내용이 현재까지도 많은 개발자들에게 생소한 DDD(Domain-Driven-Design)와 도메인 모델 구현라는 분야를 처음 입문하는 사람도 쉽게 학습할 수 있게 내용을 구성하였다는 점입니다. 그래서 어느정도 연차가 있는 개발자들은 물론 신입 개발자들이 처음 개발업무를 접할 때 보다 쉽게 개발을 할 수 있도록 많은 도움이 될것이라고 생각합니다.
구성
Chapter 1: 도메인 모델 시작하기
Chapter 2: 아키텍처 개요
Chapter 3: 애그리거트
Chapter 4: 리포지터리와 모델 구현
Chapter 5: 스프링 데이터 JPA를 이용한 조회 기능
Chapter 6: 응용 서비스와 표현 영역
Chapter 7: 도메인 서비스
Chapter 8: 애그리거트 트랜잭션 관리
Chapter 9: 도메인 모델과 바운디드 컨텍스트
Chapter 10: 이벤트
Chapter 11: CQRS
파트별로 나누어 봤을때 1, 2장은 도메인 모델을 구현할 때 알아야 할 기본적인 내용을 다루고 있으며, 1장에서는 도메인 모델이 무엇인지 알아보고 Entity와 Value에 대해, 2장에서는 상위 수준에서 아키텍처의 네 영역과 DIP패턴을 설명하고 도메인 영역의 구성 요소에 대해 설명하고 있고, 3, 4, 5장은 애그리거트와 리포지터리에 대해 설명하고 있으며, 3장에서는 애그리거트가 무엇이고 구현을 어떻게 하는지에 대해, 4장에서는 애그리거트의 논리적인 저장소인 리포지터리를 구현하는 방법에 대해, 5장에서는 검색 조건을 위한 스펙, 정렬, 페이징 등 조회 기능을 구현하는 방법에 대해 설명하고 있고, 6장은 응용 서비스가 어떻게 도메인 모델을 사용하고 어떤 역할을 수행하는지 알아보고, 표현 영역과 응용 서비스의 연동에 대해 설명하고 있습니다. 7장에서는 도메인 영역의 구성요소 중 하나인 도메인 서비스가 필요한 이유와 구현에 대해 설명하고 있고, 8장에서는 애그리거트의 트랜잭션 범위에 대해, 9장은 바운디드 컨텍스트에 대해, 10장은 도메인 이벤트를 이용해서 시스템의 결합도를 낮추고 기능을 확장하는 방법에 대해, 11장은 CQRS에 대해 설명하고 있습니다.
개인적인 생각으로 학습은 서버 운영 담당자나 서버 관련 프로그램 개발자로 취업을 희망하시거나 이제 막 개발자로 시작한 초보자이신 분들께서는 JAVA 언어 관련 입문서를 먼저 학습하시고 난 뒤 1장부터 시작하시면 좋을 것 같고 어느정도 경험이 있으신 분들(2년차~)부터는 1장까지는 쭉 보시면서 도메인의 개념과 도메인 모델, Entity, Value에 대해 숙지한다는 방식으로 보시고 2장부터 학습하시는 것이 좋을것 같습니다.
개인적으로 약간의 단점이 어쩌면 욕심일수도 있는게 좀더 많은 실습 예제 및 비즈니스 케이스가 담겨있으면 더 좋았지 않았을까라는 아쉬움이 있습니다.
저의 리뷰를 읽어주셔서 감사합니다. 다음에는 좀더 유용하고 좋은 책으로 더 나은 리뷰를 통해 여러분께 책을 소개시켜드릴 수 있도록 더 노력하겠습니다.
도메인 패턴을 중심에 놓고 설계하는 방식은 당연한 것 같으면서도 막상 그 실천이 쉽지만은 않다고 생각해왔고, 그렇기에 DDD에 대해 자세히 다루는 이 책은 인상깊게 다가왔다.
그동안 다뤄본 적 없는 영역이기에 목차가 자세하게 나눠진 부분이 큰 도움이 되었다.
또한 이러한 목차는 책날개에서도 간략하게 요약된 형태로 바로 확인할 수 있어서 좋았다.
책을 모두 읽은 후, 정리해 본 각 장의 내용은 아래와 같다.
Chapter 1. 도메인 모델 시작하기
도메인 모델이 뭘까?
도메인 모델에서 사용하는 엔티티와 밸류, 유비쿼터스 언어는 뭘까?
Chapter 2. 아키텍처 개요
어떠한 영역들로 구성된 아키텍처를 구성해야할까?
도메인 영역을 구성하는 요소들은 무엇이 있을까?
Chapter 3. 애그리거트
애그리거트는 복잡한 도메인 모델을 관리 가능한 단위로 묶어주기 위해 사용한다. 이것을 어떻게 구현할까?
Chapter 4. 리포지터리와 모델 구현
리포지터리는 애그리거트의 저장소이다. 이것을 어떻게 구현할까?
Chapter 5. 스프링 데이터 JPA를 이용한 조회 기능
주문 취소나 상품 상세 보기 등의 조회 기능을 구현해보자.
Chapter 6. 응용 서비스와 표현 영역
도메인 영역을 사용자와 연결하는 응용서비스와 표현 영역에 대해 설계하자.
Chpater 7. 도메인 서비스
도메인 서비스는 어떠한 경우에 어떻게 사용할까?
Chapter 8. 애그리거트 트랜잭션 관리
트랜잭션 충돌 문제를 방지하기 위한 방법들을 알아보자.
Chapter 9. 도메인 모델과 바운디드 컨텍스트
서로 다른 도메인끼리 영역이 맞닿아 있는 컨텍스트를 바운디드 컨텍스트라고 한다. 이것을 어떻게 구현하고 유지할까?
Chapter 10. 이벤트
이벤트 드리븐으로 동작들이 발생한다. 이 이벤트를 어떻게 처리해야할지 알아보자.
Chapter 11. CQRS
도메인이 복잡해질수록 각 모델에 맞는 구현기술을 선택하여 구현하는 것이 중요하다. 이러한 것을 의미하는 CQRS의 장단점은 무엇이 있을까?
도메인주도개발에서만 사용하는 용어가 있고, 그 용어를 알아야 진행이 가능하기에 위 목차를 보면 그러한 용어들에 대해 자세히 다루고 있다는 것을 알아차릴 수 있을 것이다.
이 책이 목표로 하는 독자가 그동안 DDD를 다뤄보지 않은 사람인만큼, 정말 자세하게 용어의 정의 및 사용에 대해 알려준다. 각 챕터에서도 자세히 알 수 있지만, 실제적인 예시(온라인서점)를 통해 간략하게 정리할 수 있어서 좋았다.
자세한 용어 사용 외에도 인상 깊었던 점은 아래와 같다.
자세한 NOTE기능
NOTE를 통해 유용한 팁, 참고사항들을 많이 알 수 있었다. 삭제 요청이 있을 때에도 바로 그 데이터를 삭제하는 것보다는 실무에서는 삭제 플래그를 사용한다는 정보를 얻게 되어 흥미로웠다.
실질적인 예시를 통해 이해를 돕는다.
한 가지의 기능을 구현할 때, 그 기능과 연결되어 있는 경우의 수를 생각하는 것이 중요하다. 그렇지 않으면 경우의 수를 보완하기 위해 코드를 짜는 사람조차 구분하기 어려운 조건문들이 나열될 수도 있고, 처음부터 다시 코드를 작성해야할 수도 있기 때문이다.
이 책에서는 자세한 예시를 통해 어떠한 상황에는 어떠한 것을 고려해야하는지에 대해 자세히 알려주고 있어 좋았다.
단일 기능의 구현 뿐만이 아닌 DDD 전체를 조망할 수 있는 시야를 배울 수 있다.
온라인서점의 예시를 통해 각 모델의 세부적인 사항을 알려준다. 그 기능이 어떠한 모델에 포함되어 있고, 어떠한 트랜잭션이 이루어져야하는지에 대해 코드로 자세히 구현한다. 기능 구현을 소분류라고 표현한다면, 소분류에 대해 다루는 동시에 그 소분류가 어느 중분류에 엮여 있고, 이러한 중분류는 어느 대분류에 엮여 있는지를 책 곳곳에서 이미지를 통해 보여준다.
그래서 특정 기능에만 얽매여 있지 않고, 도메인 주도 개발 전체를 훑어볼 수 있는 시야를 가질 수 있도록 도와주는 점에서 인상깊어다.
도메인 주도 개발에 대해 다뤄본 적이 없음에도 이 책을 통해 다양한 용어에 익숙해질 수 있었다. 특히 스프링 부트를 사용한다면 책 내부의 코드를 이용해 특정 기능을 무척 수월하게 구현할 수 있으리라고 예상된다.
도메인 주도 개발에 흥미가 있고, 어디서부터 시작해야할지 모르겠다면 이 책을 강력하게 추천한다.
이번 8월 리뷰 책은 도메인 주도 개발 시작하기 책으로 골라 리뷰해보려고 한다. 해당 책은 도메인 주도 개발을 처음 배우는 개발자를 위한 책으로 초보자가 쉽게 접근할 수 있도록 많은 노력을 한 것 같다.C++이나 자바 같은 객체 지향의 언어를 사용한 개발자라면 보다 쉽게 책 내용을 따라갈 수 있을 것이다.
SQL에 대한 내용도 알아야 하므로 백엔드 개발자들에게 더 많은 도움을 줄 수 있는 책이기도 하다. 백엔드 개발자들에겐 필수 도서가 아닐까? 또한, 도메인의 중요성과 왜 해당 모델들을 잘 이용해야 하는지 책을 보면 상세하게 서술되어 있다. 매우 추천한다!!
도메인 주도 설계(Domain Driven Design) 개념을 정리하는 측면에서 좋습니다. 개발자라면 한 번은 읽어보는 것이 좋은 책이라고 생각합니다. 이 책의 대상 독자는 도메인 주도 설계 입문자를 대상이며 주로 소프트웨어 개발자를 위한 책입니다. 자바와 스프링MVC, JPA 지식을 기반으로 예제 코드가 구성되어 있습니다. 스프링 기반 웹 개발 프로젝트 경험이 있다면 이해하기가 좋게 쓰여져 있습니다. 저자 분이 한국인이시기에 이해하기 쉽고 명료하게 잘 쓰여져 있습니다. 이해가 안 되거나 오타가 있다면 한국어로 답변을 받을 수 있는 것도 큰 장점입니다.
DDD가 다소 이해하기 어렵고 관련 책도 많지 않으므로, (에릭 에반스 저의 도메인 주도 설계 가 거의 유일하지만, 해당 책은 번역본으로 초보자가 다소 이해하기 어렵다) DDD를 이해하고 싶은 입문자들에게는 단비같은 책이 아닐 수 없다.
[차근차근 나아가는 설명]
입문서라고 말했다싶이, 해당 책은 매 장마다 차근차근히 단계를 밟아간다.
다른 책들보다 섬세하게 단계를 밟아간다고 느낄 수 있었던 것이, 본인은 DDD를 처음 접해봄에도 불구하고 1-3장까지 설명된 도메인 모델의 개념 및 구성 요소에 대해 이해하는데 어려움이 없었다.
해당 책은 약 400장 중, 3장인 애그리거트 까지 약 150페이지 정도를 초반 개념 다지기에 쏟고있다.
따라서 그만큼 초반 설명이 섬세하고 자세하기 때문에, 처음 접하는 입문자들도 두려움 없이 시작할 수 있을 것이다.
[섬세한 조언]
현업에서 JAVA 를 사용하는 본인의 경우 JAVA에 익숙하지 않은 독자들과 느끼는 바가 다를 수 있으나,
해당 책은 JAVA 를 기반으로 설명이 진행되기에, 책에서 개념을 설명하며 여러 조언을 건내는 것이 매우 와닿았다.
책에서는 설명을 하며 다소 섬세하게 컨벤션 및 습관에 대해 조언을 건넨다.
예시를 들자면 get/set 메서드를 습관적으로 무조건 추가하는 좋지 않은 습관에 대한 것이라거나, 생성한 도메인 모델을 공유 시에 위키 등의 도구를 사용해 접근성을 높인다는 등, 현업의 시니어 개발자로써 같은 개발자들에게 소소한 조언들을 제공하는 것이 내용만큼 와닿았다.
그럼과 동시에 메인 내용인 DDD의 설명도 매우 꼼꼼하게 기술하고있어, 어떤 DB를 사용할지 등 내용과 직접적으로 관련이 없을 수 있는 부분까지 놓치지 않았다.
또한, 소단원을 많이 나누어 스프링 쪽의 내용을 다룰 때에는 독자들이 아는 부분을 넘어가거나 필요한 부분을 찾기 좋게 구분하는 섬세한 배려도 녹아있다.
추천 대상
해당 책은 JAVA를 어느정도 아는 개발자이면서 DDD에 관심이 있는, 혹은 탄탄한 개발자가 되고 싶다면 강하게 추천하고 싶다.
DDD의 목적은 소프트웨어의 복잡성을 최소화하는데 있다. 사용자가 사용함의 목적이 있는 소프트웨어의 복잡성을 최소화하기 위해, 목적에 맞게 기술보다 도메인이 더 높은 우선순위를 갖고, 그를 바탕으로 설계하여 개발해야한다.
따라서, DDD는 소프트웨어의 기본 목적을 이해하고 프로젝트를 완성하기 위한 사고방식일 것이다.
그렇기에, 모든 개발자가 한번쯤 기반을 접해보길 권하고 싶다.
그 시작에 해당 책이 친절한 입문서로써 자리하고 있으니, 어려운 서적 및 개념을 밟기 전, 좋은 시작이 될 것이다.
DDD는 도메인 모델과 로직에 집중하는 방법론이다. 핵심 개념부터 구현까지 다룬 책이기 때문에 DDD의 입문으로도 손색이 없다. 도메인이 무엇인지부터 차근차근 알려주며 도메인으로 부터 모델을 추출하는 방법 등을 차근차근 알려주고 있다. 초중급을 대상으로 하는 만큼 쉽게 설명하려고 노력한 것 같다.
모델을 시각화하여 이해하는데 도움이 많이 되고 추후 실제 업무 등에 적용할 때도 동일한 방법으로 시각화하면 좋을거 같다는 생각이 든다.
실습 코드는 스프링 부트를 기준으로 작성되어 있다.
자바만 알아도 어느정도 이해할 수 있는 부분도 많다. DDD에 입문하고 실무에 적용하길 원하는 사람에게 추천한다.
도메인 주도 개발 - 약자로 DDD를 이번에 처음 접한 건 아니었는데대략 5~6 전쯤인가에 DDD start! 라는 서적으로 처음 접했었던 기억이 있다.
알고보니 같은 분이 지은 책이 었었다.
이런저런 개발 기법이 나오고 보이고 했었던 차에 DDD가 눈에 들어왔는데 당시에는 뭔가 이것저것 알고 싶은 욕심은 컸지만 아무래도 자료가 많지가 않았고 적용하기에는당시 쓰던 개발론도 배우는 시점이고 일이 바빴던지라 개념정리가 잘 안되었었던 기억이 있다.다시 정신없이 살다보니 점점 DDD의 개념이 부상하고 다시 생각 나던 참에 한빛 리뷰단으로 도메인 주도 개발 시작하기책을 리뷰할 기회가 생겼고 보니 같은 지은이여서 반가웠다.도메인 주도 개발 시작하기에서 제일 핵심으로 생각했던 건 가장 앞에서 나왔던Garbage in, Garbage out 인 것 같다.제대로된 또는 요구사항이 정리되고 받아야 제대로된 제품이 나오게 하기 도메인을 정의하고 모델을 도출하고 영역을 구분하는 것 아닐까 싶었다.책에서는 초중급의 개발자들에게 해당 책을 권하고 있다.어느정도 개발 경력이 있고 개발론에 대해서 생각해 볼 시기에 익히면 더 좋을 것도 같고 초중급 뿐만 아니라 그 이상에게도 개념 정리하기에 참 좋아 보였다.이 책은 총 11개의 단원이 기다리고 있다.1. 도메인 모델 시작하기2. 아키텍처 개요3. 애그리거트4. 리포지터리와 모델 구현5. 스프링 데이터 JPA를 이용한 조회 기능6. 응용 서비스와 표현 영역7. 도메인 서비스8. 애그리거트 트랜잭션 관리 9. 도메인 모델과 바운디드 컨텍스트10. 이벤트11. CQRS 책을 읽어가며 각 단원 별로 DDD로의 변경할 때의 문제와 개선점을 제시해주며 왜 DDD로 가야하는 지를 알려주는데원하는 부분을 조금씩 변경해가면서 더 나은 방향으로 갈 수 있도록 활용할 수 있겠다 싶었다.그리고 코드와 다이어그램 등이 적절히 적용되어 더 이해하기 쉽게 풀어져 있었다.DDD를 시작하고 관련 개발론으로 가야할 지 고민된다면 전체적으로 훑어보면 참 많은 도움이 될 것으로 보였다.
범균님의 DDD 입문서가 재발간 되었다. 개인적으로는 스프링 입문을 이분 책✳︎으로 하게 되서 반가운 마음에 읽게 되었다. 에릭 에반스의 DDD를 바로 보는 것이 가장 베스트지만 서점에서 몇 번을 시도 했다가 나에게 문턱이 너무 높아 매번 후순위로 밀려났다. (그 외에 Effective Java, Clean Code, Designing Data Intensive Applications 가 있다) 범균님 특유의 자극적이지 않고 나긋나긋한 문장과 이해하기 쉬운 예시를 드는 빌드업이 좋다.
도메인은 쉽게 말해 각 비즈니스가 요구하는 바를 소프트웨어로 해결하기 위한 단위를 말한다. 사업 분야에 따라 커머스, 금융, 보안, 플랫폼, 통신 등이 있다. 이에 따라 커머스 개발자, 플랫폼 개발자 등으로 일컫는다. 책에서는 온라인 서점인 커머스 도메인을 예시로 든다. 커머스 도메인의 예를 들어 다시 상품, 회원, 결제, 물류, 클레임, 정산 마케팅 등의 하위 도메인으로 나눌 수 있다. 하위 도메인에 따라 영업, 마케팅, MD, 디자인, 기획, 경영지원 등의 전문가들의 비즈니스적 요구사항을 소프트웨어적으로 풀어나가는 것이 개발자의 역할이다.
하위 도메인은 다시 상태 다이어그램으로 분해 할 수 있다. 가령 주문 프로세스의 경우 장바구니, 결제, 출고지시, 배송, 구매확정 같은 순서도를 가질 수 있다. 이 작은 모델들을 묶어 애그리거트(집합)으로 칭한다. 애그리거트는 도메인 하나를 표현하기 때문에 객체의 영속성을 처리하는 리포지터리는 애그리거트 단위로 존재한다.
4장 리포지터리와 모델 구현, 5장 스프링 데이터 JPA를 이용한 조회 기능, 6장 응용 서비스와 표현 영역에서는 Spring과 Spring Data JPA를 이용해서 구현할 시 조심해야 하는 부분과 애그리거트를 확장하는 부분에 대해서 예시를 들어 설명한다. UUID 사용, N+1 이슈, 1-N 관계, Lazy Loading, Validation 전략, 응용 서비스에서 의존관계 해소 방법 등 여러 노하우들을 소개한다. 이렇게 세 파트가 이 책의 핵심인듯 하다. 특히 JPA를 다루는데 있어 많은 내용이 나오니 JPA가 어떻게 사용되는지 정도는 알고 보는게 좋을 것 같다.
11장은 CQRS로 조회/명령 모델의 분리에 대한 설명을 담고 있다. 모델이 분리되니 구현역시 분리할 수 있다는 이야기다. 주문, 배송지변경, 회원수정 같은 명령 모델엔 JPA같은 ORM을, 성능이 중요한 각종 조회 모델은 MyBatis, JDBCTemplate같은 Mapper를 이용 할 수 있다.
더불어 책에 나오는 예제들은 모두 GitHub에 공개되어 있으니 전체 코드를 볼 수 있다.
몇 년 전까지만 해도 내가 아는 도메인이라는 단어는 웹사이트의 주소인 도메인을 의미했다. 실제적인 도메인의 사전적인 의미는 지방 정부의 관할, 학문 영역, 활동 영역, 인터넷 주소 등으로 정의되어있으며, 이 책의 주제인 DDD에서의 Domain은 크게 보아 영역을 구분하는 의미로 사용되며, 소프트웨어로 해결하고자 하는 문제 영역을 나타낸다.
한 도메인은 다시 하위 도메인으로 나눌 수 있으며 각 하위 도메인은 또 다른 하위 도메인을 포함하기도 한다.
이 책은 DDD에 입문하는 사람에게 DDD가 무엇인가부터 시작하여 어떤식으로 구성하고 구현하는지는 상세한 예를들어 설명하고 있기에, 약간의 프로그래밍 지식이 있다면 공부하는데 어려움 없이 책의 진도를 나갈 수 있다.
책 내용의 진행은 객체 기반으로 DDD를 설명하고 있으며 JAVA 코드로 설명이 이뤄지기에 기존에 자바에 익숙한 독자라면 익숙하게 책장을 넘길 수 있을 것 같다. 하지만 잘 모른다 해도 큰 틀을 이해함에는 부족함이 없다고 한다. (실제로도 그런 것 같다.)
DDD에서는 도메인 전문가와 개발자간의 지식 공유가 활발하게 이루어져야하며 상호간에 요구사항을 명확하게 이해하고 진행하는 것이 중요하다. 그렇지 않을 경우 제품 개발에 실패하거나 일정에 차질이 생기는 일이 부지기수이기 때문이다.
책을 넘기며 도메인 모델, 도메인 모델 패턴, 도메인 모델 도출의 순서로 모델을 구상하고 구체화해가는 과정을 익힐 수 있으며, 도출한 모델의 엔티티와 벨류를 구분하는데 있어서 주의해야할 사항 등을 세심하게 설명하고 있어서 이 개념에 익숙하지 않은 독자라 하더라도 손쉽게 감을 잡을 수 있을 것 같다.
도메인 모델에 대한 내용이 마무리되고 나면 아키텍쳐, 애그리거트, 리포지토리와 모델 구현에 대한 내용이 나오고 스프링 JPA를 이용한 조회기능, 응용 서비스와 표현 영역, 도메인 서비스, 애그리거트 트랜젝션 관리, 도메인 모델과 바운디드 컨텍스트, 이벤트, CQRS 의 순서로 내용들이 진행된다.
짧은 시간이었지만 책을 한번 읽고보니 막연하기만 했던 DDD에 대해 좀 더 나은이해를 할 수 있게 되었고, DDD로 프로젝트를 진행해보고 싶다는 생각이 든다. DDD 자체를 이해하는게 쉽지만은 않다보니 한 번 읽고 모두 흡수할 수 없기에 참고서처럼 옆에 두고 궁금할때마다 열어봐야겠다.
저번달에 한빛미디어 소프트웨어 아키텍처 101를 읽어면서 많은 도움을 받았기에, 또한번 아키텍처에 도전하였다.
ㅎㅎ 그런데 이번 책은 다소 어려웠다.
그 이유는 저번책은 이론적인 이야기가 많았는데, 이번 책은 소스 코드가 많았다.
개발자라면 소스 코드가 나왔다고 좋아해야 하지 않을까? 싶지만, 자바를 공부 안 한지 오래되었고, 제대로 공부한 것이 아니라, 슬쩍슬쩍 본 것이 다고, 파이썬 쪽으로 좀 더 많이 보다 보니, 다 잊어버려서, 대충 이해가는 정도로 이해하려다 보니, 중간에 힘이 많이 들었다.
그러나, 평소 자바를 보시는 분이라면, 오히려 이 점이 많은 도움이 되시리라고 본다.
저번 책은 소스 코드가 없어서, 실제 구현이 어떻게 이루어지는지 감이 안 잡혔는데, 이번 책은 이론적인 관점을 소스 코드로 모두 보여주기 때문에 직접 개발을 하시는 분들에게는 도움이 될 것 같다.
소프트웨어 아키텍처 101를 읽고 이 책 제목을 보면서 도메인 주도 개발이 그 도메인 일 것이라고 생각했는데, 예상은 적중하였다.
우리가 보통 이야기하는 도메인, 산업 영역이 맞다. 그래서 초반에 읽을때는 다소 쉬울것이라 생각했는데,
그 도메인 영역을 자바의 개발 방법인 표현 - 응용 - 도메인 - 인프라스트럭처에 맞추어 깊게 들어가면서, 소스 코드를 이해하기가 복잡하고 어려웠다.
이론적인 전개 흐름은 소스 코드를 몰라도 이해가 갔다.
이 부분은 이 책 저자 분도 이런 이론 책을 처음 읽었을때에도 똑 같은 느낌이라고 했으니까, 초반에 이해가 안 되더라도 몇번이고 반복해서 노력하면 점차 나아질 것이라고 생각한다.
이 책의 좋은 점이 주문이라는 도메인 영역을 가지고 현실 세계에서 개발을 하기 위해 필요한 여러 세부 도메인 영역으로 나누어 서로 어떻게 유기적으로 연결하고,
각 영역에서 개발해야 하는 부분, 그리고 유동적으로 만들고, 하지 말아야 할 팁 들도 매우 상세하게 이유를 들어가면서 설명한다는 점이다.
보통 이론과 소스 코드만 있는 책들도 많은데, 개발하다 갈림길에 들어섰을때 어떻게 하는 것이 좋은지 이유를 잘 설명한다. 그러다 보니 자바는 모르지만, 아키텍처 측면에서는 눈이 많이 넓혀졌다.
MS 파워 플랫폼으로 개발하고 있는데, 로우 코드 기반이라서 도메인 주도 방식으로 생각해야 할 것들도 늘어나고,
이 책에 따라 어느 부분이 적용하기 쉽고, 어려운지에 대한 궁금점이 일어나기도 했다. 도메인 주도 보다는 컴포넌트 방식이 더 주요할 것 같지만,
개발할 때 상속이라든가, 아키텍처의 각 영역에서 잘못 선택해버리면, 소스 코드의 중복이라든가, 충돌이 쉽게 일어날 수 있다는 것도 알게 되었다.
앞으로는 사용자 인터페이스, 응용, 도메인, 인프라를 잘 구분해서, 개발하려고 노력해야겠다.
위 그림과 같이 책은 적절한 도형과 설명, 소스코드로 이루어진 것을 볼 수 있다.
이 책은 자바로 주문 관련 개발을 하려고 하는 3년차 개발자가, 각 도메인 영역에서 어떻게 시작해서 개발을 시작하고, 영역을 묶음을 가지고 가고, 전 개발 과정에서의 원활한 협업을 위해 본인이 개발하는 부분이 어떻게 진행해야 되어야 하는지 알려주는 좋은 책이라고 본다.
문제는 각 산업 영역에서의 도메인 지식이 부족하기 때문에 완전한 도메인 주도 개발이 되기 위해서는 현업과의 많은 이야기와 배움이 필요할 것으로 보여진다.
스프링을 공부하면서 도메인이라는 용어가 나올 때 DDD라는 개념를 함께 알아두면 좋다고 해서 궁금했는데 마침 좋은 기회가 생겨서 DDD에 관한 책을 읽어보게 되었다. !!
# DDD , Domain-Driven Design : 도메인패턴을 중심으로 설계하는 방법
도메인 전문가(개발을 요구하는)가 도메인에 대한 경험을 바탕으로 원하는 기능 개발을 요구했을때 개발자가 도메인에 대한 지식없이 개발하다보면 요구사항을 정확히 이해하지 못하고 잘못 개발할 수 있다. 잘못 개발된 코드는 수정해서 고치려면 많은 노력이 든다.이런 문제점을 해결할 수 있는 방법 중 하나로 DDD가 나왔다.
개발자와 도메인 전문가가 계속해서 소통하며 개발자가 도메인 전문가가 원하는 요구사항을 정확히 이해할 수 있다록 도메인과 구현을 만족하는 모델을 만든다.
# 총평
이 책에서는 DDD를 통한 설계를 예제코드를 이용해서 설명한다. 따라서 실제로 어떻게 구현되는지 배울 수 있다. 어떤 언어나, 프레임워크를 배울때만큼 상세한 주석과 함께하지는 않지만 기존방식으로 설계시 생기는 문제와 이를 DDD로 해결하는 방식, 이유를 명확히 설명해준다. 또한 테이블로 구조를 계속 보여주면서 설명을 이어나가 예제코드가 어떤 구조로 이루어지고 있는지 잘 따라갈 수 있었다. 나같은 경우는 이 책을 통해 처음 공부하는 개념이라 모르는 용어가 많았는데 DDD를 위해 알아야하는 용어들을 의미를 파악하기 쉽게 그림으로 예를 들어 설명하여 쉽게 이해할 수 있었다.
대상 독자로 DDD에 대해 입문자, 초중급, DDD에 대해 잘 모르지만 관심이 있는 사람을 설정했다고 한다. 예제코드는 JAVA이며 스프링과 JPA를 기반으로 구현되어 있다. 저자는자바와 스프링은 잘 몰라도 책에서 설명하는 내용을 따라가는데 어려움은 없으며 JPA가 무엇인지 정도는 알고 보는게 좋다고 이야기한다. 맞는 말이다. 어려움은 없으나 이론에 집중해있기보다는 예제코드를 통해 어떤 식으로 설계되는지에 집중되어 있기 때문에 규모가 작더라도 스프링으로 설계를 할 수 있는 정도에서 이 책을 읽으면이해가 훨씬 빠르고 적용이 잘 될거라고 생각한다. DDD를 정말 생판 처음보아서 아무런 지식이 없다면 이론적인 개념만 압축적으로 설명하는 글을 한번보고 이 책을 읽으면 눈에 더 잘 들어올 것 같다.
최근 소프트웨어 개발에 있어 다양한 설계 방법론들이 제시되고 있는데, 그 중 제법 핫한 키워드인 도메인 주도 개발(DDD)에 대해 다루는 책이라서 많은 기대를 품었습니다.
단순 이론이 아닌 실전
소프트웨어 설계 방법을 다루는 기존 도서들 중에는 개념만을 위주로 깊게 설명하는 책들이 많았는데, 내용 자체는 유익하지만 어떻게 실무에 적용해야 할지 막막해지는 경우가 있었습니다. 하지만 이 책의 경우 ‘도서 구매 쇼핑몰’을 구현하는 것을 실제 코드와 함께 예시로 설명하고 있어 실제 적용이 훨씬 수월합니다.
다이어그램을 활용한 개념 소개
또한 단순 텍스트로만 설명하면 와닿지 않을 수 있는 설계 패턴을 다이어그램을 통해 시각화하여, 한눈에 구조를 파악할 수 있도록 도와줍니다. 또한 DDD에서 사용되는 여러 키워드들을 비유와 예시를 통해 알기 쉽게 설명하고 있습니다.
최근 DDD와 관련해 관심이 생기던 찰나였다. 지금 다니고 있는 회사의 프론트엔드 아키텍처가 DDD 방식을 참고한 방향인지라 아키텍처에 대한 이론이나 백그라운드 지식을 얻을 필요가 있었기 때문이다.
근데, DDD와 관련해 내가 딱 읽어보고 싶었던 책이 서평단을 통해 읽을 수 있는 기회가 찾아와 기분 좋게 읽을 수 있었다. :)
---
말머리를 쭈욱 훑어보면 도메인 주도 개발(DDD)의 입문자를 위한 초중급자용 개발자 서적이라고 써있는 걸 확인할 수 있다. 나는 이 말이 이 책의 주제와 구성들을 한 문장으로 설명하는 문장이라고 생각한다. DDD에 대한 핵심 개념 예를들어 엔티티와 벨류 타입에 대한 기초 개념, 애그리거트에 대한 기초 개념 등 여러가지를 심도있고 깊숙하게 다룬다 하기보다는 다방면에 걸쳐 찍먹(?)한다.
물론 찍먹이라기엔 부정적인 느낌이 들 수는 있으나 핵심 개념들은 상세히 설명되어있고 오히려 실무에서 어떤 느낌으로 DDD를 사용할 수 있는지 예제 코드와 함께 기능적인 부분에 대한 고민도 함께 수록되어 있다 보니 초중급자 개발자에게는 다른 책보다 더 많은 걸 얻어갈 수 있으리라.
책의 소스 코드는 서버 개발자를 대상으로 자바 스프링 그리고 JPA(orm)로 코드가 작성되어있다. 나는 프론트엔드 개발자라 자바 문법도 모르고 핵심 개념도 모르기 때문에 한 눈에 들어오지는 않았으나 평소 이런 종류의 개발 서적들이 자바로 된 경우가 왕왕 있고, 자바스크립트 코드에 빗대어 나름대로 해석해 가며 읽었기 때문에 완전 까막눈으로 보진 않았다.
하여 프론트엔드 개발자(= 자바스크립트 개발자)가 DDD에 관심이 생겼다면, 게다가 자바 스프링을 모른다하더라도 공통적인 매커니즘은 비슷하므로 이해가 완전히 안되지는 않을 것이다. 만약 스프링을 할 줄 아는 사람이라면 정말 좋은 책이라 자부할 수 있다. 왜냐하면 스프링을 사용해 보지도 않았으나 좋은 책이다라고 느껴졌기 때문이다.
좋은 책이란, 내가 미처 몰랐던 개념을 알려주고 가려웠던 부분들을 긁어주어 새로운 패러다임을 생각할 수 있게 기반을 닦아주는 책이라고 본다. 그런 의미에서 이 책은 DDD에 대해 몰랐던 개념을 알려주고 새로운 아키텍처에 대한 시각을 넓혀준 것 같다.
이 책말고 DDD라고 하면 유명한 외국 서적이 한 권 있다. 그 책을 읽어보지는 않았으나 이런 개발론 or 아키텍처에 대한 책을 한 권만 읽을 생각은 아닐 것이기 때문에... 그 책을 먼저 읽어 기초 개념을 쌓아보는 것도 좋아 보인다. + 국산 프리미엄도 있다.
몇해 전부터 도메인 주도 개발에 대한 이야기를 들어오고 있었고 스프링(Spring) 기반의 도메인 주도 개발을 프로젝트에 적용해 볼까 생각하는 도중에 "최범균" 님의 "도메인 주도 개발 시작하기"를 읽어보게 되었다.
우선 최범균님의 다른 책들도 꾸준히 읽어 봤고 기초 개념 확립 및 프로젝트 개발, 운영에서 많은 도움이 되었었는데 이번 책 "도메인 주도 개발 시작하기" 도 기본 개념을 잡기가 쉬웠으며 관련 내용을 조금만 응용하면 개발, 운영 프로젝트에 적용이 가능할 정도로 좋은 내용이 많았다.
언제나 최범균님의 책은 기초와 개념 정리가 잘 되어 있어 업무에 적용하기위한 핵심을 쉽게 익힐수 있는것 같다.
"도메인 주도 개발 시작하기" 책에도 언급하고 있지만
"도메인 주도 개발 시작하기" 책의 대상 독자는 초중급이며
예제코드는 자바, 스프링(Spring MVC), JPA(ORM)을 기반으로 설명을 하고 있다.
책을 전체적으로 읽어봤는데 해당 언어나 기술을 몰라도 책을 읽는데는 큰 문제는 없었다.
JPA는 현재 업무에 사용을 하지 않아서 잘 모르지만 개념 및 전체적인 소스 및 설명을 읽어보니 도메인 주도 개발을 알기에는 큰 문제가 없었다. "도메인 주도 개발 시작하기" 책 에서는 JPA의 개념 및 간단한 예제만 설명하고 있다.
하지만 "도메인 주도 개발 시작하기" 개념 및 기초를 익히고 JPA를 추가 공부한다면 도메인 주도 개발에서도 JPA를 100% 활용할 수 있다고 본다.
또한 다른 언어를 학습한 사용자도 "도메인 주도 개발 시작하기" 책을 통해 도메인 주도 개발 주제를 쉽게 학습하고 기본 개념 및 활용 방법을 도출할 수 있다고 생각한다.
"도메인 주도 개발 시작하기" 책의 목차 는 11개로 구성되어 있는데 각각 단원마다 도메인 주도 개발을 위한 기본 개념과 어떻게 설계 및 그리고 어떤 방식으로 도메인 주도 개발을 진행할 수 있는지 자세히 설명하고 있다.
1. 도메인 모델 시작하기
2. 아키텍처 개요
3. 애그리거트
4. 리포지터리와 모델 구현
5. 스프링 데이터 JPA를 이용한 조회 기능
6. 응용 서비스와 표현 영역
7. 도메인 서비스
8. 애그리거트 트랜잭션 관리
9. 도메인 모델과 바운디드 컨텍스트
10. 이벤트
11. CQRS
각 목차별로 객체지향, 데이터베이스 개발 설계에서 도메인 주도 개발로 변경하면서 각각에 대한 문제점 및 개선 방향을 제시하고 왜 도메인 주도 개발로 나아가야 하는지 그리고 각각 방식에 대한 설명함으로써 해당 방법을 왜 써야 하는지 알 수 있게 쓰여 있었다.
도메인 주도 개발을 전부는 적용하지 못해도 하나씩 업무에 적용하여 개선할 수 있는 주제로 쓰여있고 부분적으로 활용해 볼 수 있다고 생각한다.
"도메인 주도 개발 시작하기" 책을 읽으면서 도메인 주도 개발과 현재 개발, 운영하는 프로젝트를 비교해 봤는데 회사 프로젝트가 업무중심이라 도메인 주도 개발 처럼은 진행을 하고 있는것을 알게 되었고 몇개의 설계 문제점 등을 "도메인 주도 개발 시작하기" 책을 통해 알게 되었다.
그리고 책을 읽으면서 JPA도 이제는 적용을 할수 밖에 없는 것을 알 수 있었다. SI 프로젝트에서는 아직 Mybatis를 사용하고 있는데 이제는 JPA 혼용 방식등도 생각해봐야 할 것 같다.
마지막으로 책은 전체적으로 세세하게 읽기 편하게 구성되어 있었다.
1. 그림에 의한 프로세스 설명
2. 소스에 대한 설명
3. 소스에 대한 기능개선을 진행하면서 설명
그림을 통해 프로세스를 설명하고 반복하면서 도메인 주도 개발에 대한 개념 및 기능을 학습하게 할 수 있게 구성되어 있으며 조금씩 구조를 바뀌어서 올바른 방향 및 더 좋은 방법에 대한 것을 소스코드 및 관련 설명을 읽으면서 학습할 수 있게 쓰여 있었다.
도메인 주도 개발에 관심이 있고 방향성을 고민해 본다면 이 책을 한번 읽어보기를 권하고 싶다.
모바일 개발자. 특히 안드로이드 개발자로 지내오면서, 도메인이란 무엇인지, 설계가 어떻게 되어야 하는지 깊게 고민하기 시작한 것은 그리 오래되지는 않은 것 같다. 한.. 6~7년전? 그 전까지는 그냥 피쳐 개발이라는 것에 집중되어 있었다는 생각도 들고, 그 이후로도 그냥 단건의 문제 해결에 집중하면서 앱이든 라이브러리든 개발을 해 왔던 것 같다. 모바일 개발자 전체적으로도 그런 분위기가 크게 대두된건 그리 오래지 않은 느낌이다.
처음엔 MVC, MVP, MVVM과 같은 뷰와 관련되어 어떻게 개발을 해야 하는지에 좀 더 포커싱이 맞춰졌다면, 그보다는 더 큰 틀 안에서 어떻게 더 구조화된 프로그래밍이 가능할지 논의 및 연구가 활발하게 진행된 것으로 보인다. 그러다가 클린 아키텍처라는 용어도 많이 회자되면서, 그 안에 포함된 도메인이라는 개념을 이해하기에 많은 시간을 할애하였던 기억이 난다. 아직도 제대로 이해하고 있다는 생각이 들지는 않지만, 그래도 관심갖고 꾸준히 보아온 영역이기에, 그 도메인 주도 개발은 어떻게 시작할 수 있을지 궁금함을 가지고 이 책을 접해보았다.
> 책에 대한 간단한 정보
도메인 주도 개발을 의미하는 DDD(Domain Driven Development)를 형상화하여 표지에 표현하였다. 예쁘다는 표현은 어울리지 않을지 모르지만, 간단하고 책 속의 내용이 연상된다는 점에서는 잘 와 닿았다.
> 인상깊은 부분들
DDD에 대한 책임을 말함과 동시에, 이 책을 보기에 적절한 독자 수준을 말하고 있다. DDD 자체에 대해서는 저자가 말한 것과 같이 초중급에 적합해 보인다. 다만 글에서는 DDD 입문자를 대상으로 하고 있다고 하여 무슨말인지 하는 의문은 들었다. 개인적으로는 입문자보다는 어느정도 가볍게라도 접했던 독자가 적합해 보인다고 생각은 든다.
또한 최소 지식 요구사항도 말하고 있다. 저 부분은 어느정도 납득은 간다. 제대로 보기위해서는 스프링과 JPA 등의 지식이 필요하다. 하지만, 일단 모르는건 넘어가는 방식으로 읽어도 된다면 그렇게 중요하지는 않을지 모른다.
책의 앞 부분에서 말하고 있는 도메인의 위치이다.
표현, 응용, 도메인, 인프라스트럭쳐는 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역이다.
아키텍처 공부를 해본 사람이라면 이런 비슷한 그림은 많이 접했을 것이다. 그 중에 중간 다리 역할 정도로 도메인이 포지셔닝하고 있음을 보여준다. 아주 기초적인 지식이겠지만, 이러한 개념 정립 없이 다음에서 서술하는 많은 개념들을 접하다보면 내 위치와 방향을 잊어버릴 수 있기 때문에, 좋은 나침반이 된다. 또한 이런 비슷한 그림이 후에도 많이 제공되고 있다.
그리고 이 책의 시작부분에서는 온라인 서점을 대상으로 사례를 들어 설명하였다. 우리가 개발에서 도입하는 도메인은 해당 도메인의 모든 기능을 제공하는 것을 전제로 하지 않았다.
엔티티에 대해 대략적으로 다루었던 기억으로 이 내용을 보았던 터라 다행히 제대로 이해할 수 있도록 도움을 주었다.
엔티티와 밸류에 대해 이야기 해 주었던 부분인데, 일단 도메인 모듈에 대한 설명이 앞서서 필요하였다.
도메인에서 모델을 도출할 수 있다. 모델이란 도메인 자체를 표현하는 개념적인 모델을 의미하지만, 도메인 계층을 표현할 때 사용하는 객체 모델을 언급할 때에도 도메인 모델 이라는 용어를 사용한다. 따라서 이 책에서도 ‘도메인 모델’이라는 용어로 명확하게 구별하여 사용하고 있다.
그리고, 엔티티에 대한 부분인데, 엔티티의 가장 큰 특징은 식별자를 가진다는 사실이다. 식별자를 가지는 객체 개념이므로 투 엔티티 사이의 차이점을 표현할 수 있는 equals() 혹은 haseCode()를 재정의하여 사용하는 것으로 표현하면 좋다.
밸류에 대한 간단한 정의로는 식별자가 포함되지는 않아도 개념적으로 완전한 하나를 표현할 때 쓰는 객체이다.
모듈을 어떻게 구성하는 것이 좋을지에 대한 설명이다. 이 부분과는 다른 곳에 나온 설명이지만, 설계적 관점에서 볼 때 추가로 DIP를 언급한 내용이 인상적이었다.
DIP를 설계의 중요한 원칙으로 삼고 있는데, DIP는 Dependency Inversion Principle, 즉, 의존 역전 원칙이다. 자세한 것은 SOLID로 명명되고 있는 객체지향 설계 5원칙을 참고하면 되며, 여기에서는 이것을 어떻게 적용해야 잘 적용된 것인지 말해주고 있다. 도메인 레이어에서의 참조가 인프라스트럭처를 향해있지 않도록 설계하기 위한 방법으로 DIP를 사용하는 방법이 중요하다고 말하고 있다.
추가로 도메인 영역의 주요 구성요소는 다음과 같다. 엔티티, 밸류, 애그리거트, 리포지토리, 도메인 서비스이다.
이 중 애그리거트란 도메인을 쉽게 이해하기 위해서 상위 수준에서 모델을 조망할 수 있도록, 관련된 객체를 하나의 군으로 묶어주는 방법이다. 이렇게 하면 상위수준에서 도메인 모델 간의 관계를 파악할 수 있다. 모듈 설계에서는 이 애그리거트를 잘 이용해야 한다.
시스템간 강결합 문제를 포함하여 이벤트, 핸들러, 디스패처, 동기 이벤트 처리 등에 대한 문제도 설계적 관점에서의 처리 방법을 다룬 내용이 인상적이었다.
이와 함께 CQRS 패턴에 대한 내용도 있는데, 명령(Command) 모델과 조회(Query) 모델을 분리하는 패턴이다.
이 곳에서 모두 다룰 수 없는 부분이지만 실제 개발에서는 유용한 기법이라고 생각이 들었다.
아키텍처와 리팩토링 등의 지식에 관심이 있는 사람이라면 이 내용도 관심을 가질 수 밖에 없을 듯 하다.
> 괜찮은 부분
1. 도메인 주도 개발을 위한 기초 및 응용 지식을 쌓을 수 있다.
개발자라면 도메인 주도 개발에 대한 용어를 한 번쯤은 듣거나 찾아본 적이 있을 것이다. 아니면 밀접하게 이미 개발에 활용하고 있을지도 모른다. 그런 모두에게 다시금 이 개념에 대해 생각해보고 다시 기초를 쌓을 수 있는 기회를 제공한다. 혹은 본인이 이해하고 있는 개념에 대해서 다른 부분을 찾을 수도 있을 것이다. 그런 경우 실무에 적용하면 좋은 지식도 충분히 찾을 수 있다.
2. 각 용어에 대해 의미를 설명하고, 접근을 시작한다.
용어를 대강 안다고 가정하고 넘기지 않았다. 특히 인상적이었던 부분은 엔티티와 밸류, 애그리거트에 대한 부분이었다. 그냥 객체화를 잘 시키면 그것이 엔티티라고 생각했던 나에게 정확한 개념을 알려주었으며, 애그리거트 또한 애그리게이트(Aggregate)와 동일한 스펠링을 가진 상태라서 당연히 애그리게이트 정도로 생각할지 모르지만, 이곳에서는 정확하게 발음기호까지 추가하여 애그리거트로 해야 명사의 의미로 접근이 가능하다고 하며 이해를 구하였다. 이 밖에도 여러 개념들을 가볍게 넘기지 않음으로써 막히는 부분이 없도록 노력한 흔적이 인상적이었다.
3. 책의 흐름이 난이도 및 관심도부터 시작하여 자연스럽게 흐른다.
아마 내가 구성했더라면, 딱딱하지만, 전체 개념부터 시작해서 전체 용어와 그걸 차근히 내려가는 방식으로 서술했을지 모른다. 하지만, 그렇다면 재미가 반감했을 것이 뻔하다. 이 책에서는 도메인 모델, 엔티티, 밸류 등으로 시작하여 관심을 유도하고, 그것으로 주요 구성요소를 도출해내며, 다시 그 안에 있는 내용을 하나씩 펼침으로써 자연스럽게 흐름에 동참하도록 하였다. 개인적으로는 스프링에 적용했던 내용을 제외하곤 전체적으로 필요성과 지식이 자연스럽게 축적되었기에 좋은 흐름이라고 생각되었다.
> 아쉬운 부분
1. 실전 프로젝트 설계를 함께 진행했으면 좋았을 것 같다.
물론 일부 모듈 구성에 대한 설계가 되어있기는 하였다. 하지만 그 내용 또한 부분적으로 해당된 내용이며, 만약 실제 프로젝트를 구성하는 방식의 부록이나, 예제코드를 만드는 과정을 하나의 내용으로 할애하였다면, 좀 더 실무적인 측면에서의 갈증도 채우지 않았을까 하는 생각이 든다. 물론 이 책의 내용이 모두 정답일수는 없기에 자유도를 열었다는 생각은 들지만, 사람에 따라 실재적인 것을 확인하면서 이해를 쉽게 하는 경우도 많기 때문에 이러한 접근도 있으면 좋지 않았을까 생각이 들었다.
2. 테스트에 대한 부분도 따로 나와있지는 않아서 아쉬웠다.
테스트는 도메인 주도 설계의 큰 장점 중 하나라고 생각했기에 이러한 언급이 왜 없을까 생각이 들었다. 스프링이나 서버 관점에서는 테스트를 달리할지도 모르지만, 그렇다해도 단위테스트는 의미가 있을것이다. 플랫폼이나 프레임워크에 종속되지 않는 테스트 방법에 대한 것을 알려주었다면 좀 더 도움이 되었을 것 같다.
이 책의 독자는 DDD의 입문자를 위한 책입니다. 이 책은 Java, Spring 그리고 JPA코드로 주로 설명이 되어 있어서 해당 기술들을 조금 알고 있으면 도움이 될 것 같습니다. (객체 지향의 다형성, 상속, 캡슐화, DIP 개념도 알고 있으면 좋을 것 같습니다.)
사실 이 책이 재출간되기 전 DDD start!란책을 갖고는 있었지만 읽지는 못한 상태였습니다. 이 책을 재출간된다는 소식을 알고는 있었는데 4월 도서 리뷰 리스트에 이 책이 있는 걸 보자마자 주저 없이 바로 선택했습니다. 요즘 하고 있는 우아한테크코스 pro 프리코스에서도 도메인 단위로 기능 명세를 만들고 그 순서대로 테스트, 구현을 매우 중요하게 요구하고 있었는데, 그런 점으로 보아 도메인의 중요성은 크구나 느꼈습니다.
사실 DDD는 예전에 MSA 스터디할 때 조금 공부해본 것 말고는 잘 모르지만 이 책을 읽으면서 그때 공부했던 기억을 리마인드 할 수 있었던 게 개인적으로 좋았습니다. "마이크로 서비스 아키텍처는 도메인 중심으로 서비스를 모델링하는 것이 중요하다."라고 공부했던 게 기억이 나는데 서비스가 충분히 커서 MSA로 갈 때 그만큼 중요한 것이 도메인이라는 것이 다시 한번 생각났습니다. 개인적으로는 리뷰하기 어려운 상급(?) 난이도의 책인 거 같은데... 생각보다 두께가 두껍고 기술적인 내용이 거의 다여서 그냥 중요하다고 생각되는 일부분만 정리하고 마무리하려고 합니다.
내용 정리
도메인이란 소프트웨어로 해결하고자 하는 문제 영역입니다. 도메인은 여러 하위 도메인으로 구성되면 도메인끼리 연동하여 기능을 제공합니다. DDD 하면 떠오르는 것 중에 하나가 각각 Layer별 특징이 있는데 아래와 같습니다.
사용자 인터페이스 계층 : 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만 아니라 외부 시스템일 수 도 있다.
응용 계층 : 사용자가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다.
도메인 계층 : 시스템이 제공할 도메인 규칙을 구현한다.
인프라스트럭쳐 계층 : 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다.
위 DDD에서 네 영역 중 가장 핵심은 아무래도 도메인 계층입니다. 도메인 계층의 주요 구성요소는 아래와 같습니다.
엔티티(Entity) : 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 갖는다.
밸류(Value) : 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 값을 표현할 때 사용된다.
애그리거트(Aggregate) : 애그리거트는 연관된 엔티티와 밸류 객체를 개념적으로 묶은 것이다.
리포지토리(Repository) : 도메인 모델의 영속성을 처리한다. 예를 들어 DBMS 테이블에서 엔티티 객체를 로딩하거나 저장하는 기능을 제공한다.
도메인 서비스(Domain Service) : 특정 엔티티에 속하지 않는 도메인 로직을 제공한다.
가장 쉽게 배우는 도메인 주도 설계 입문서를 표방하는 이 책은, 실제 업무에 DDD를 바로 적용해 볼 수 있도록 기본적인 DDD의 핵심 개념을 익히면서 구현을 통해 학습할 수 있게 구성된 도서인데요.
비즈니스 도메인별로 나누어 설계하는 방식에 대해 저처럼 언뜻 들어본 적만 있거나, 혹은 들어본 적도 없이 늘 하던 대로 dto - dao - service - controller 방식으로만 웹 애플리케이션을 만들었었다면, 새로운 설계 방식을 익혀 볼 수 있는 기회를 주는 도서입니다.
도메인 주도 개발 시작하기 책은 DDD를 처음 접하는 개발자를 위한 책으로 도메인 주도 개발 입문자를 대상으로 한다고 해요. 저처럼 DDD를 처음 공부해 보려는 사람에게 적합한 책!
3~4년의 개발 경험이 있다면 내용을 이해하는데 좀 더 수월할 거라고 적혀있더라고요. 저는 요즘 자바 공부를 안 한 지도 좀 됐고, 개발 분야 공부 경력이 길지 않아서 확실히 그동안 리뷰했던 다른 책에 비해 진도가 느리게 나가고 있어요.
그래도 이해에 시간이 더 걸려 진도만 느릴 뿐, 막상 각 잡고 공부하려고 이 책을 볼 때 설명이 쉽게 풀어져 있어 이해 안 가는 부분은 몇 번 다시 읽고 코드 따라 쳐보고 하면 어느 정도 알겠네 싶어 다음 진도로 넘어갈 수 있었습니다.
저자의 깃허브에 도메인 주도 개발 시작하기 책의 전반적인 내용이 담긴 예제 코드가 올라가 있어요. 개발 도서는 다 그렇긴 하지만 책 앞부분에 예제 소스를 내려받아 어떻게 사용하면 되는지에 대한 설명도 자세해서 좋았습니다. 예제 코드는 메이븐, 자바 17, 스프링 부트, JPA, 타임리프, MySql이 사용되었다고 해요. 그래서 확실히 JPA, 타임리프 사용을 해보셨던 분들이라면 공부할 때 한결 수월할 듯.
도메인 주도 개발 시작하기 도서에서는 도메인 모델을 표현할 때 알아야 할 기본적인 내용부터, 복잡한 도메인 모델들을 관리 가능한 단위로 묶어주는 역할인 애그리거트가 무엇이고 구현을 어떻게 해서 적용해야 하는지, 애그리거트의 논리적인 저인 리포지터리는 또 어떻게 구현하는지 등에 관해 단계별로 각 장마다 차근차근 따라갈 수 있도록 적혀있어요.
그러니 이 책을 완독하며 직접 코드를 쳐가며 실습해 본다면 DDD가 무엇이고 어떻게 사용하면 되는지 익히기 아주 좋습니다. 중간중간 보충 설명이나 참고사항, 유용한 팁, 주의할 점등에 관해서도 적혀있어서 도메인 주도 개발 입문자가 DDD 개발을 하면서 올바른 방식으로 사용할 수 있게 도와주더라고요.
흐름 좋게 도메인 주도 개발 방법이 적혀있는 도서이므로 웹 어플리케이션 개발 시 기존 DTO-DAO-서비스- 컨트롤러 방식에서 벗어나 도메인 주도 개발을 익혀보고 싶었다면, DDD 입문서로 이 책을 꼭 한 번 읽어보면 좋을 것 같습니다.
** 본 리뷰는 한빛미디어 <나는 리뷰어다> 리뷰어 활동으로 도서만을 제공받아, 리뷰어의 주관적인 견해로 작성 된 리뷰입니다. **장소
학교 선배가 백엔드 공부를 할 거라면 최범균님의 DDD Start!라는 책을 DDD 입문서로 추천한다고 말했던 기억이 있습니다. 근데 아쉽게도 지금은 절판됐고 지금은 막 리셀가로 팔리기 때문에 도서관이라도 가서 꼭 읽어보라고 말하더라고요. 백엔드 공부하다 보면 언젠가 읽어보겠지 싶었는데 이번에 한빛미디어에서 새롭게 나오게 되어 읽어보게 됐습니다.
Book Review
기본 지식
이 책의 예제 코드는 자바로 쓰여져 있으며 스프링 MVC와 JPA를 기반으로 구현되어 있습니다. 초반에는 개념에 대한 내용이 많아서 코드에 대해 정확히 모르시는 분이 읽어도 괜찮지만, 후반으로 갈수록 코드로 구현하면서 설명하는 부분이 많고 불필요한 설명은 생략되어 있으니 Spring과 JPA에 대한 경험이 어느정도 있으신 분께 추천드리는 책입니다.
신입 개발자
이 책은 DDD 고수가 되는 법을 알려주는 책이 아니며 DDD를 처음 접하는 입문자를 대상으로 하는 책이라고 합니다. DDD 입문자가 읽기에는 좋은 책이지만 백엔드 개발자를 목표로 하는 대학생 입장에서는 신입 개발자가 읽기에는 좀 어려운 책이라고 느꼈습니다. 후반으로 가면 갈수록 제가 JPA에 대한 이해가 낮아서 그런지 점점 읽기 힘들었습니다. 또한, DDD에 대한 개념적인 내용은 대략적으로 이해가 됐으나 이걸 어떻게 구현해야 할 지는 아직도 막막하다라고 느꼈습니다. 그러나 저자의 깔끔하고 자세한 설명 덕분에 충분히 공부해서 읽어볼 만한 책이라 생각합니다.
대상독자
대상독자는 아무래도 이 책의 저자께서 설명하신 것처럼 대략 3~4년의 개발 경험이 있다면 내용을 이해하는 데 어려움은 없을 것 같습니다. 또한, Spring에 관심 있고 자바 백엔드 개발자가 되고 싶은 대학생이라면 한 번쯤 읽어볼 만한 책이라 생각합니다.
이 책은 도메인 주도 설계(DDD)를 처음 배우는 개발자를 위한 책이다. 실제 업무에 DDD를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성했다. 이 책으로 도메인 모델을 이용하여 애플리케이션을 구현하면서 DDD에 대한 이해를 넓힐 수 있을 것이다.
[대상 독자]
- DDD를 처음 접하는 개발자
- DDD에 대해 잘은 모르지만 관심이 있는 독자
[주요 내용]
- 도메인 모델의 이해, 엔티티와 밸류의 개념
- 아키텍처의 주요 영역 구성요소와 DIP 패턴
- 애그리거트, 리포지터리 등 DDD 주요 패턴의 이해와 구현 방법
- 응용 서비스와 표현 영역을 연동하는 방법
- 도메인 서비스의 필요성과 구현 방법
- 도메인 모델의 트랜잭션 충돌을 처리하는 방법
- 도메인 이벤트를 이용하여 시스템의 결합도를 낮추고 기능을 확장하는 방법
- CQRS의 개념과 명령 모델/조회 모델을 나누는 방법
[서평]
이 책은 도메인 모델을 이용하여 애플리케이션을 구현하는 데 필요한 내용을 다루고 있으며 전체 11장으로 구성되어 있다. 처음 1장과 2장에서는 도메인 모델을 구현할 때 필요한 기본 개념을 다루고 있다. 1장에서 도메인 모델이 무엇인지, 엔티티와 벨류에 대해서 알아본다. 2장은 상위 수준에서 아키텍처의 영역과 DIP 패턴을 설명하고 도메인 영역의 구성 요소에 대해서 배운다.
3~5장은 애그리거트와 리포지터리를 설명한다. 애그리거트는 복잡한 도메인 모델을 관리 가능한 단위로 묶어주는 역할을 담당한다. 3장에서는 애그리거트가 무엇이고 구현을 어떻게 하는지 배운다. 4장에서는 애그리거트의 노리적인 저장소인 리포지터리를 구현하는 방법을 알아보고 5장에서는 검색 조건을 위한 스펙, 정렬, 페이징 등 조회 기능을 구현해 본다.
6장은 응용서비스와 표현 영역에 대해 설명한다. 응용 서비스가 어떻게 도메인 모델을 사용하고 어떤 역할을 수행하는지 알아보고 표현 영역과 응용 서비스의 연동에 대해 설명한다.
7장은 도메인 영역의 구성요소 중 하나인 도메인 서비스가 필요한 이유와 구현에 대해 설명한다.
8장에서는 애그리거트의 트랜잭션 범위에 대해 살펴본다. 애그리거트의 트랜잭션 처리를 위해 DBMS를 이용한 선점 잠금과 비전을 이용한 비선점 잠금을 구현하는 방법을 소개한다.
9장은 애그리거트와 더블어 가장 주용한 개념 중 하나인 바운디드 컨텍스트에 대한 내용을 다룬다. 바운디드 컨텍스트가 무엇이고 각 컨텍스트의 통합과 관계에 대해 배워본다.
10장과 11장은 각각 이벤트와 CQRS에 대해 설명한다. 10장은 도메인 이벤트를 이용해서 시스템의 결합도를 낮추고 기능을 확장하는 방법을 설명하며 비동기로 이벤트를 처리하는 몇 가지 구현 방법도 살펴본다. 11장은 CQRS가 무엇인지 알아보고, 이를 통해 어떤 효과를 얻을 수 있는지에 대해 설명한다.
개발 세계에는 여러가지 개발 방법론이 많다. 가장 유명한 건 아무래도 TDD이겠지만, 최근 가장 각광받는 건 DDD라고 생각한다. 그 이유는 아마 세상의 수많은 software는 대부분 현실의 문제를 해결하기 위해 만들었을텐데, 그걸 해결하는 게 여전히 힘들기 때문이라고 생각한다.
현실의 문제를 해결하는 게 아직도 힘든 이유도 여러가지가 있겠지만, 그 중 하나는 비즈니스를 하는 사람들과 개발자들간의 간극에 있다. 개발자들은 요구 사항에 맞춰 서비스를 만들(었다고 생각하)지만, 비즈니스를 하는 사람들은 내가 요구한 게 아니라는, 이 업계가 탄생한 순간부터 발생했던 문제. 애자일 방법론도 사실 이 문제 때문에 나오지 않았던가. 동작하는 소프트웨어를 전달하기 위해서.
DDD는 이런 간극을 좁히기 위한 고민의 산물이다. 그래서 오히려 초반에 ‘Garbage in garbage out’이라는 이 업계의 유명한 문구와 함께 도메인 전문가가 같이 개발에 참여해야 한다는 걸 이야기한다. 또 도메인 전문가의 요구 사항도 항상 옳은 건 아니라는 점을 알려준다. 즉 개발자와 도메인 전문가는 같은 도메인의 비즈니스 문제를 해결하기 위해 상호 작용을 하며 고민을 통해 문제를 해결해야 한다는 지극히 상식적인, 커뮤니케이션 문제부터 짚고 간다(그리고 이게 사실 애자일 선언문의 이야기이기도 하다) . 또 서로간의 소통을 해결하기 위해 용어를 통일해 모호함을 줄이고 이런 용어 역시 계속 업데이트해야 한다는 점도(소프트웨어 뿐만 아니라 문서도 지속적인 업데이트가 필요한데 이걸 모르는 경우가 참 많다).
도메인, 애그리거트, 계층 구조, 바운디드 컨텍스트 등 각 용어의 의미와 구조를 그림과 코드를 통해 설명하기 때문에 하나씩 따라가기도 좋다. 또 이 책을 읽다보면 처음부터 생각할 수도 있겠지만, 결국 이런 도메인 구조에 따라 코드를 작성하는 게 MSA와 바로 연결된다는 걸 알 수 있다. DDD를 계속해서 파고들었던 저자가 쓴 책인데다가 번역서가 아니라서 참 읽기도 자연스럽고 편하다는 점이 더 좋기도 하다.
여담으로 저자의 책 중에 DDD Start라는 책이 있는데, 그래서 그런지 이번 책의 github repository 이름이 ddd-start2이다.
솔직히 개발론이라 함은 그냥 이제껏 쌓여왔던 경험이 누적되어 특정 이름을 중심으로 묶여진 것이리라 생각된다. 특히 막 개발자에 입문한 사람들에게 있어서 새로이 등장한 개발론은 실전 개발에 꼭 적용해야 하는 대상으로써그리고 신봉해야 할 대상으로써 다가가는 부분이 적지 않은 것 같다. 특히 이전에 등장했던 개발론은 더이상 쓸모가 없거나 퇴물로 여겨지는 경우가 많은 것 같다.
필자가 생각건대, 그러한 관점은 본인의 사고의 틀을 확장시키는 데에하나도 도움이 안 될뿐더러 신기술 만능주의라는 잘못된 오류에 빠지는 누를 범하기에 필요충분조건이라 생각된다.
신규로 등장한 이론이 아무래도 각광받는 것은 당연할 수밖에 없단 생각이 들긴 한다. 아무래도 새로이 등장한 이론에는 요즘 개발 트렌드가 반영되었을 것이며 또한 신기술의 동향에 맞춰 구성되었을것이기 때문이다.
하지만 그렇다 하여, 앞서 언급한 것과 같이 이전에 등장했던 개발론들이전혀 쓸모없고 시대에 뒤떨어진 퇴물들이라고는 생각지 않는다. 이전 개발론 들이 있었기에 새로운 개발론이등장한 것이고, 새로 등장한 개발론들이 반드시 모든 개발 상황과 케이스에 딱 들여 맞는 것도 아니기때문이다.
그렇기에 필자는 이번에 리뷰를 진행하게 될 "도메인 주도개발"에 대한 내용을 기존 이론과 비교하며 나의 사견을 밝히기보단, 오로지 도메인 주도 개발이 무엇인지에 대한 관점에서 리뷰를 진행하려 했었고 그리했다.
도메인 주도 개발 이론은 학부 때 많이 배우는 MVC, MVP, MVVM 이론과비슷한 또 다른 하나의 패턴 법이라고 보면 편할 것 같다.
다만, 위의 패턴들은 웹 개발을 할 때에 많이 경험할 수 있는 패턴들이며특히나 회사에 가서 코드들을 보면 대부분의 위의 패턴들을 기반으로 개발되었기에 사전에 알아두면 많은 도움이 된다.
솔직히 학부 때 위 이론들은 그저 책에 쓰여있는 내용일 뿐, 실제로는많이 안 와닿을 수도 있겠다는 생각이 든다. 왜냐하면 대규모 트래픽을 직접 서비스를 구축하여 경험해보기 어렵고 또한 웹 서비스를 개발하더라도 개인의 영역에서 개발되기 때문에 협업의 기회 역시 많지 않기 때문이다.
하지만 그렇다 하더라도 이론을 차치하고 컴퓨터 학문은 실용학인 만큼 꼭 책의 내용들을 직접 실습해 보고 나아가자신만의 서비스들을 개발해 보길 권장한다.
【책의 구성】 '도메인 주도 개발 시작하기' 책은 어떤 책일까?
이 책은 우선 구성이 정말 좋은 책이고 또한 저자가 독자를상당히 배려해서 쓴 책임이 한눈에 보이는 책이다.
구성이 좋은 책이라 평한 이유는 책을 읽어 내려감에 있어서 불편한 부분이 없었기 때문이다. 보통 전공서라 함은 내용이 너무 딱딱해서 한 장 읽기도 상당히 버든이 들기 십상이다. 하지만 이번에 이 책을 공부하면서 필자는 단 한 번도 흐름이 멈추거나 중간에 답답했던 적이 없었던 것 같다.
또한 앞서 언급한 것처럼 컴퓨터학은 실용학이다. 따라서 글로만 백날배워봐야 실제 환경에서 코드로 그리고 알고리즘으로 문제를 잘 풀이하지 못한다면 배웠던 이론은 전혀 쓸모가 없게 되는 학문이라는 것이다. 이런 점에서 이 책은 실제 상황과 유사한 예시들을 코드로 풀어가며 독자들에게 설명하고 있다. 이 말인즉슨 위 책의 내용은 독자들이 추후, 혹은 이미 대면하고있는 회사에서 겪게 될 코드 구성과 개발론에 대한 팁들이 잘 녹아들어 있음을 의미한다.
책은 이론에 대해서 그 배경과 저자의 사견을 시작으로 각 상황별 적절한 코드 예와 엔티티 다이어그램, 시퀀스 다이어그램 등을 적절히 사용해가며 친절히 풀어가고 있다.
1챕터 : 도메인 모델시작하기
이 장에서는 이 책의 주 내용이 될, DDD 핵심 개념에 대해서 설명하는 장이다. 또한 이 책에서 앞으로전개하며 사용할 어휘들에 대해 자세히 설명되어 있다.
무엇보다 엔티티와 벨류의 정의가 무엇인지에 대해서 잘 정리되어 있는데, 이부분에 대해서는 필자도 많이 공감 가는 부분이어서 독자들이 꼼꼼히 공부하고 넘어가시길 권장한다.
마지막 부분에서는 각 오브젝트 생성 시에 getter와 생성자의 역할에대해서 설명하고 있다. 왜 객체 정의 시에 getter를남용하면 안 되는지 그리고 생성자의 역할이 얼마나 중요한지에 대해서 잘 나와있으니 이 부분도 꼼꼼히 챙겨가시길 권한다.
챕터 전반의 내용은 도메인 모델을 이용한 개발에 대한 시나리오를 설명하고 있으므로 도메인 지향의 개발 시 어떤부분을 고려해야 할지 그리고 각 레이어별 어떤 구성을 해야 할지 (뷰,서비스, 모델, 인프라)에 대해서 나만의 식견으로 한번 그려보도록 하자.
3챕터 : 애그리거트
이 장에서는 "애그리거트"에 대한 이론과 실무 환경에서의 구성에 대해서 설명하고 있다. 보편적으로각 엔티티에 대해서는 웹 개발을 어느 정도 개발해 본 사람들이라면 잘 알고 있는 것 같다. 하지만 애그리거트를어떤 식으로 구성해야 되는지 또한 특정 도메인을 중심으로 어떻게 구분해야 하는지에 대해서는 많은 개발자들이 생소해하리라 생각된다.
필자도 아직 도메인 단위로 엔티티를 구성하고 재조립하여 확실한 도메인 중심의 고립과 분리를 하라 하면 쉽사리모든 규약을 준수하진 못하리라 생각된다.
이 장에서는 이러한 구성법에 대한 팁과 노하우에 대해서 잘 설명하고 있다.
6챕터 : 응용 서비스와표현 영역
이 장은 응용 서비스 레이어와 표현 레이어에서의 역할을확실히 구분 지어 설명하고 있다. 일반적으로 응용 서비스 레이어를 보편적인 용어로는 서비스 레이어라고통상 사용한다.
서비스 레이어는 해당 서비스 REST-API에 맞는 Service들로 구성하여 목적한 바에 맞는 로직을 구성하는 레이어이다. 이또한 많은 개발자들이 잘 인지하고 있는 사항이지만 정확히 표현 영역과의 구분을 애매모호하게 이해하는 사람들 역시 적지 않은 것이 현실이다.
표현 영역은 사용자의 화면으로부터 입력을 받아서 서비스 레이어에 진입하기 직전 그리고 서비스 레이어에서 모든로직을 끝내고 표현 영역으로 값을 내려주는 그 직후의 모든 영역을 의미한다.
표현 영역에서 서비스 영역으로 넘어가는 그 사이에 과연 표현 영역은 어떤 값을 넘겨줘야 되는 것일까?
그냥 표현 영역에서 받은 모든 오브젝트들을 넘겨주면 안 되는 것일까?
필자의 생각과 동일하게 저자 역시 절대로 그리해서는 안된다고 말하고 있다. 위와같은 형태로 표현 레이어에서 서비스 레이어로 값을 전송해 주면 강한 커플링이 두 레이어 사이에 발생하게 되고, 추후 TC 구성이나 독립적인 단위로서의 동작에 큰 어려움이 발생하기 때문이다.
그렇다면 어떤 형태의 값을 넘겨줘야 되는 것일까?
그것은 책의 내용을 살펴보시길 권장한다.
【 "도메인 주도 개발 시작하기"를 읽고 나서…….】
DDD나 MVC나오브젝트 지향 개발론이나 절차 지향 개발론이나 그 모습과 형태는 아주 제각각이며 다양하다. 하지만 대부분의아키텍처 패턴 법과 개발론이 공통으로 가지고 있는 특징이 있다면 그것은 바로 추상화를 잘하라는 점이다.
즉 어떤 모듈의 동작을 커플링 도는 환경 속에 노출되지 않게 하며 최대한 독자적으로 동작할 수 있게 구성함으로써추후의 확장성과 이식성 그리고 신규 기술의 도입을 용이케 하라는 것이다.
DB와 서비스 로직을 구성하는 데에는 다양한 Lib로부터 가져온 기능과 클래스 등이 사용된다. 이것들은 언제든새로운 기술의 등장으로 변경이 필요한 요소들이다. 하지만 자신이 구축한 나만의 알고리즘은 그보다 뛰어난알고리즘이 나오지 않는 이상 쉽사리 변경될 일은 없다. (아직도c++의 sort는 quick sort를 이용하고있지 않은가?) 그렇기에 해당 알고리즘을 이용한 모듈을 최대한 독립시켜 외부 기능들과의 커플링을 제거함으로써추후 이식성을 높인다면 공인된 코드로써 많은 사람들에게 사랑받을 수 있을 것이리라 생각된다.
각 패턴의 가장 중요한 부분은 코드의 리사이클링과 코드의 독립성을 고도화함으로써 이식성과 확장을 함께 가져가는것임을 잊지 말자.
먼저 이 책은 DDD를 처음 접하는 개발자를 위한 책으로 DDD 입문자를 대상으로 하는 책이다.
DDD의 호기심을 채워주는 책
책에서 사용한 언어는 JAVA , Spring MVC, JPA(ORM)이다.
또한 maven, java 18, spring boot, jpa, 타임리프, MySQL을 이용해서 예제 코드를 작성한다.
예제 코드는 위의 깃허브에서 볼 수 있다.
책은 총 11 chapter로 구성이 된다.
chapter 1 도메인 모델 시작하기
chapter 2 아키텍처 개요
chapter 3 애그리거트
chapter 4 리포지터리와 모델 구현
chapter 5 스프링 데이터 JPA를 이용한 조회 기능
chapter 6 응용 서비스와 표현 영역
chapter 7 도메인 서비스
chapter 8 애그리거트 트랜잭션 관리
chapter 9 도메인 모델과 바운디드 컨텍스트
chapter 10 이벤트
chapter 11 CQRS
로 구성되어 있다
책 자체가 굉장히 깔끔하게 되어있다.
그림도 많이 있고 코드도 깔끔하게 나와있다.
또한 책의 가독성 또한 좋아서 잘 읽힌다.
책에 "잠깐"이라는 부분이 있는데
책을 읽다가 놓치기 쉬운 것들을 "잠깐'에서 알려줘서
한 번 더 생각할 수 있게 해준다.
읽는 이를 많이 신경 쓴 것 같다. 나 또한 전혀 생각지 못 한 부분이었는데
"잠깐"을 보고 왜 코드를 이렇게 짰는지를 알 수 있었다.
NOTE에서는 개념을 정리해 주거나 새로운 개념들에 대해서 자세히 알려준다.책은 크게 위와 같이 그림, 코드, 잠깐, Note로 구성되어 있다.책을 빠르게 한 번 읽어보았다.DDD가 무엇인 지에 대해서도 감을 잡을 수 있었을 뿐만 아니라개발하면서 몰랐던 개념들이나 헷갈렸던 개념들에 대해서도 자세히 알려주어서 좋았다.실제로 DIP가 무엇인 지 많이는 들어봤는데 제대로 이해는 못 한 상태였는데이 책을 읽고 이해할 수 있게 되었다.책에서 실제 애플리케이션 또한 구현하기에클론 코딩하면서 책을 따라 읽으면 DDD에 대한 지식뿐만 아니라실제 구현 방식에 대해서도 알 수 있어서 좋을 것 같다.
다만 위에서도 말했듯이java, spring, jpa을 가지고 설명을 하기에아무것도 모르면 읽기 힘들 것 같다.DDD의 기초를 배우고 싶으면 이 책을 읽는 걸 추천드립니다.
정확히는 '제한적'으로 적용할 수 밖에 없다고 생각했다. 왜냐하면 기존의 루비온레일즈와 같이 도메인드리븐 개발을 하는데에 구조적으로 조금 더 '편리하다'라는 것은 분명 존재하기 때문이다.
그렇지만 이 책은 훌륭히 스프링다운 코드로 DDD가 가능하다 라는 것을 훌륭히 설명한다.
이 책은 흔히 무분별하게 사용되는 '도메인'이라는 것의 정의부터 시작한다. 그리고 그것과 연관된 수 많은 가지들, DTO, 엔티티, 밸류, 상태 등의 설명과 함께
우리가 개발을 할 때의 전체적인 개념을 관통하여 하나하나 realworld의 예제에 가까운 사례로 설명을 한다.
이전에 보았던 이런 류의 책들 중 가장 큰 문제는 '도메인' 이라는 것에만 집착해서 현실에서 하기 힘든 방법, 퓨어하게 JPA를 사용해서 한다라던지 하는 퍼포먼스 또는 생산성을 고려하지 않은 구조를 제안한다는 것이다. 그런데 이 책은 과감히 확장성을 생각해 '마세라티 문제'의 상황에 빠지지 않고 현실에서 수행가능한 수준의 타협안을 제시하는 점이 좋았다.
그리고 시작은 DDD지만 책의 중반부터는 확장을 하면서 발생하는 문제들과 그 해결책을 가볍게나마 제시한다. Locking과 이벤트드리븐, CQRS등의 방식으로 말이다.
물론 이 책의 다 읽는다고 해서 시작할 때 부터 저것들까지 한번에 적용하는 것을 고민하고 실행한다면 정말 배보다 배꼽이 더 큰 사태가 발생하게 될 것이다. 그렇지만 근래 보았던 책 중에서는 가장 깔끔한 예시와 설명으로 발생하게 될 문제를 지적하면서도 그 해결 방법을 자연스레 설명하는 점이 매우 좋았다.
잡설1. 이 책의 좋은 점 중 하나가 예시로 나온 코드의 퀄리티 그 자체에 있다.
immutable을 리턴한다던지, 깔끔한 코드 분리라던지, 디자인패턴 적용이라던지 하는 부분에서 훌륭한 코드의 전형을 본 듯하다랄까.
한 명의 개발자로서 보면 행복해지는 느낌의 코드들 이었다.
즉 단순히 도메인 드리븐을 설명하는 것 외에 그 도메인 드리븐 개발을 위해 필요한 다른 기술들까지 볼 수 있는 훌륭한 책이라고 생각한다.
잡설2. DDD를 위한 번역본 등에서 볼 수 없는 재미있는 디테일도 좋았다. 가령 AGGREGATE의 발음관련 이야기라던지. 정말 한국사람을 위해 쓰여진 책과 같은 느낌이지 않는가.
확실히 더 잘 읽히는 책이다.
잡설3. 애초에 이 책을 '찾아서' 볼 정도라면 이 책에서의 독자 권장 레벨인 초중급은 절대 아닐 것이라고 생각되지만, 서비스 개발에 대하여 A부터 Z까지 한번 맛을 보고 겪었던 어려움을 이러한 방식으로도 풀 수 있구나 라는 관점에서 보는 것을 권장한다.
도메인 주도 개발은 회사에서 항상 적용해보고 싶었는데 내가 가진 지식이 많지도 않고 실제 경험도 없다보니 쉽게 해볼수는 없던 영역이었다. 책도 읽어볼 엄두가 나질 않아서 책도 많이 안읽은 주제중에 하나 였다. 그런데 이번에 새롭게 나온 이책을 읽어볼 기회가 생겨서 도메인 주도 개발을 다시 접해볼 수 있었다.
저자가 책에 써넣은대로 이 책은 초중급을 대상으로 쓰여진 책이다. 말 그대로 도메인 주도 개발에 대해서 알고 싶고 각각의 의미가 무엇인지 개념을 알고 싶고 어떻게 적용하는지 알고 싶은 분들을 위한 책이다. 그리고 책에 나오는 예제 코드들은 java, spring boot, jpa 등을 기반으로 설명을 해주고 있다. 따라서 책을 좀더 잘 이해하고 싶다면 앞에 말한 것들에 대한 사용경험이 있는것이 좋다. 특히 초반에는 개념에 대한 내용이 많다면 후반으로 갈수록 코드로 구현해 나가는 형식으로 설명을 하는 부분이 많기 때문에 spring boot, jpa 에 대한 경험은 필수적이라고 할 수있다.
내가 이 책을 읽으면서 가장 좋았던 부분들은 각각의 개념에 대한 설명들이었다. 도메인 주도 개발을 위한 필수적인 개념이지만 좀처럼 이해하기가 쉽지 않은 내용이었다. 그리고 개발과 연관해서 생각을 하다보니 헷갈리는 개념들도 많았다. 그런데 그런 부분들을 잘 설명을 해줬다.
특히 도메인 주도 개발에서 내가 가장 중요하다고 생각했던 바운더리 컨텍스트와 애그리거트 에 대한 개념을 잘 이해할 수 있었다. 개념적으로 이해를 하더라고 실제 코드로 적용을 해보기에는 내가 부족한 부분이 많긴 하지만 이론을 바탕으로 잘 적용을 해볼수 있을것 같다는 생각이 들었다.
도메인 주도 개발에 관심이 있고 이걸 적용해보고 싶은 분들은 한번쯤 읽어보기를 권하고 싶다.
이번에 리뷰하게 된 책은 '도메인 주도 개발 시작하기 - 최범균' 라는 책이다. 최범균님의 DDD Start!를 통해 도메인에 대해서 공부를 했고 DDD를 공부하고 싶은 사람들에게 추천했었는데 절판되어 슬퍼하던 중 한빛미디어에서 새롭게 출판하셨다는 소식을 듣고 내심 기분이 좋았다. 이전 책 'DDD Start!'와 비교해서 보니 삭제된 목차도 있고 추가로 생긴 목차도 있었다. 그렇다고 크게 다르지는 않아 이전 책을 리마인드 하는 느낌으로 책을 읽을 수 있었다.
도메인에 대한 개념이 전혀 없던 시절 나에게 도메인 개념을 채워준 책이다. 이 책은 여전히 도메인에 대한 개념을 쉽게 설명하고 있다. 이전 책보다 좋은 점은 그림이 깔끔하고 책이 조금 더 깔끔해진 느낌이라 가독성이 좋아졌다.
도메인 주도 설계의 개념은 에릭 에반스가 쓴 '도메인 주도 설계'라는 책에서 부터 시작되었고, 도메인을 이해하는 것 어려운 일이다. 도메인에 대한 기본 개념을 이해하고 시간을 들이다보면 도메인 이해 폭이 넓어지는 것 같다.
도메인에 대한 개념을 잡아주면서 그 이후 개발에서 일어날 수 있는 다양한 문제점과 고민점을 같이 고민해주는 책이다.
도메인 개념이 없는 분들이라면 책을 보면서 도메인에 대한 개념을 이해하는데 도움을 받을 수 있고, 도메인에 대한 개념이 어느정도 있는 사람이라면 그 도메인을 어떻게 '구현' 할 것인지에 대한 내용을 배울 수 있을 것 같다.
Spring JPA를 사용하는 방법과 발생할 수 있는 문제점.
트랜잭션 처리에 있어서의 고민해볼 점.
시스템과의 강결합을 어떻게 풀 것인지.(이벤트)
등 다양한 내용들을 다루면서 도메인에 대해서 설명하고 있다. 에릭에반스도 그렇지만 책에서 이야기하는 부분은 도메인주도 개발 뿐아니라 이벤트 기반 개발로도 이어질 수 있는 발판을 마련해주고 있다.
총평
개인적으로 나는 이 책의 1판인 DDD Start라는 책으로 도메인의 개념을 익혔고, 지금은 도메인에 대한 이해로 개발을 진행하고 있다. 그리고 개발에 있어서 이 책을 통해 배운 개념을 항상 기억하며 개발을 하고 있다. 도메인을 이해하고 개발하는 것과 모르고 개발하는 것은 많은 차이를 보였고 나 스스로도, 팀원들도 그렇게 느꼈던 것 같다.
도메인이라는 개념이 어색하고 익숙하지 않은 분들에게는 개념을 배우기 위해 추천하고 싶은 책.
도메인이라는 개념은 이해하지만 구현을 어떻게 해야할 지 고민하는 분들에게는 구현 방법을 배울 수 있는 책.
이 책은 도메인 모델을 이용하여 애플리케이션을 구현하는 데 필요한 내용을 다루며, DDD를 처음 접하는 개발자를 위한 책이다.
참고로 예제 코드는 자바로 되어 있는데, 자바를 몰라도 OOP나 다른 언어에 대한 개념에 있는 개발자라면 이해하는 데에 큰 무리는 없다.
데이터에 종속적인 애플리케이션 개발의 경우 모델링과 실제 개발과의 불일치가 발생할 수 있다. 이러한 불일치를 해소하기 위한 노력 중 하나가 바로 DDD이다. 그리고 도메인 주도 설계는 공통의 언어(*유비쿼터스 언어)를 사용하여 도메인과 구현을 충분히 만족하는 모델을 만든다.
여기서 공통의 언어라는 것은 사용자와 개발자가 동일한 언어로 소통하는 것을 말한다.
이 책의 각 챕터는 다음과 같다.
1. 도메인 모델 시작하기
2. 아키텍처 개요
3. 애그리거트
4. 리포지터리와 모델 구현(JPA 중심)
5. 스프링 데이터 JPA를 이용한 조회 기능
6. 응용 서비스와 표현 영역
7. 도메인 서비스
8. 애그리거트 트랜잭션 관리
9. 도메인 모델과 바운디드 컨텍스트
10. 이벤트
11. CQRS
이 책에서 다루는 내용중 개념적인 내용은 다음과 같다.
- 도메인과 도메인 모델
- 도메인 아키텍처: 표현, 응용, 도메인, 인프라스트럭처
- 도메인 영역의 주요 구성요소: 앤티티, 밸류, 애그리거트(복잡한 도메인 모델을 관리 가능한 단위로 묶어주는 역할), 리포지터리, 도메인 서비스
왜 이런 형태를 사용하는지를 잘 고민해 보면 좋을 것 같다. 왜냐면 소프트개발 방법론이라는 것이 보다 좋은 소프트웨어를 만드는 것이므로, 방법론에 대한 깊은 이해없이 따라하기 식이거나 구조를 맞추는 정도라면 오히려 비효율적일 것 같다.