본문 바로가기
[Review]/Book

[도서 리뷰] 도메인 주도 개발 시작하기

by 해피빈이 2022. 4. 24.

> 진행에 앞서

모바일 개발자. 특히 안드로이드 개발자로 지내오면서, 도메인이란 무엇인지, 설계가 어떻게 되어야 하는지 깊게 고민하기 시작한 것은 그리 오래되지는 않은 것 같다. 한.. 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. 테스트에 대한 부분도 따로 나와있지는 않아서 아쉬웠다.

테스트는 도메인 주도 설계의 큰 장점 중 하나라고 생각했기에 이러한 언급이 왜 없을까 생각이 들었다. 스프링이나 서버 관점에서는 테스트를 달리할지도 모르지만, 그렇다해도 단위테스트는 의미가 있을것이다. 플랫폼이나 프레임워크에 종속되지 않는 테스트 방법에 대한 것을 알려주었다면 좀 더 도움이 되었을 것 같다.

 

> 추천 독자

- 구조적인 설계를 고민하는 중급 이상의 개발자

- 도메인 주도 개발이 반영된 코드를 베이스로 하는 팀에 소속된 팀원

- 트렌드한 개발에 관심있는 개발자

 

> 개인적인 평점

- 가격: 8 / 10

- 내용: 9 / 10

- 디자인: 7 / 10

- 구성: 9 / 10

 

> 정보

저자: 최범균

출판사: 한빛미디어

가격: 28,000원

전체 페이지: 356페이지

 

** 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

반응형

댓글