////
Search
Duplicate
🛝

Chapter 10. 도메인

도메인이 무엇인지 확실하게 알아보는 장이다.
일반적으로 소프트웨어 공학에서의 도메인은 어플리케이션이 해결하고자 하는 문제 영역을 의미한다.
그러나 이렇듯 딱딱하고 추상적인 설명은 우리에게 잘 와닿지 않는다. 따라서 저자는 이 장에서 서술적인 설명을 바탕으로 우리의 이해를 이끌어내고자 한다.
또한 백엔드 개발자의 입장에서 도메인은 어떻게 바라보는 것이 좋은지 이야기하고 어플리케이션을 개발한다는 말이 왜 도메인을 개발한다는 말과 같은 뜻인지, 어플리케이션의 본질이 왜 프레임워크가 아닌 도메인인지 이야기한다.

1. 소프트웨어 개발의 시작

비즈니스 관점에서 소프트웨어의 시작은 뭘까? 사업가 입장에서 소프트웨어 시스템을 만들게 되는 계기는 뭘까?
일반적으로 비즈니스는 소프트웨어를 만들어야겠다는 전제로 시작되지 않는다. 비즈니스는 현실 세상에서 발생하는 문제에서 출발한다. 즉 사용자가 겪는 문제를 해결해주는 것이 비즈니스인 것이다. 소프트웨어는 비즈니스의 해결책 중 하나일 뿐이다.
저자의 기준에 있어서 사업가라는 사람은 대다수 사람들이 겪는 문제와 고민을 분석, 해결하는 사람이다.
여기서 린 방식에 대한 언급이 등장하는데, 사용자의 문제를 해결한다는 초점에 맞춰서 언급할 필요가 있었기 때문이다.
저자가 정리한 린 방식의 업무 스타일이란?
사용자의 문제 상황을 인식한다.
문제 상황에 따라 어떤 솔루션을 제공하면 좋은 반응을 얻을 것이라고 가설을 세운다.
가설이 맞다면 결과가 어떤 지표로 반영될 것이라고 가정한다.
가설을 검증할 수 있는 가장 빠른 방법을 생각하고 이를 실험한다.
사용자와 지속적으로 소통하면서 가설의 방향성을 지속적으로 조정, 확장한다.
지금까지 사용자를 계속 언급해온 부분에서 느낄 수 있듯 우리가 그동안 언급해온 도메인의 정의에 있어서 문제 영역이란 사용자가 겪는 문제 영역이다.
이런 관점에서 개발자의 역할은 뭘까? 바로 고객이 겪는 문제 상황을 소프트웨어로 해결해주는 것이다.
개발자는 도메인을 분석하고, 고객이 겪는 문제를 인지하여 이에 맞는 도메인 솔루션을 제공해줄 수 있어야 한다.
우리가 개발해야 하는 것은 그냥 어플리케이션이 아닌 도메인 어플리케이션이다. 그러므로 도메인이 무엇인지를 잘 파악하고 있어야 한다.

2. 어플리케이션의 본질

우리는 그냥 어플리케이션을 개발하지 않는다. 도메인 어플리케이션을 개발한다. 이 부분을 명확하게 기억하고 있자.
앞서 프레임워크는 어플리케이션의 핵심이 아니라고 하며 본질은 도메인이라고 했다. 그렇다면 왜 프레임워크는 본질이 될 수 없을까?
우리의 역할은 도메인 어플리케이션을 만드는 것이기 때문이다. 그러니 도메인이 가장 중요하다.
프로젝트 설계자의 입장에서 사용될 구현이나 도구는 선택사항이어야 한다는 전제로 설계에 임해야 유연하게 변경 가능한 소프트웨어를 만들 수 있다.
도메인의 유형에 따라 도구와 구현은 달라질 수 있다. 즉, 도구를 전제로 설계하는 것은 결과물이 이에 의존하는 형태로 나올 수 밖에 없기 때문에 적절한 설계가 아니다.

3. 도메인 모델과 영속성 객체

이번 장의 내용은 도메인 모델과 영속성 객체는 구분해야 하는가?이다.

1. 통합하기 전략

이 전략의 장점은 개발 속도가 상대적으로 빠르다는 장점이 있다. 굳이 두 개의 클래스로 구분하지 않고 변환을 위한 toModel, from 같은 메소드를 만들지 않아도 되기 때문이다.
더불어 JPA의 역할이 ORM이라는 점에서 자연스러운 선택이기도 하다.
다만 이 전략을 사용하는 경우, ORM 관련 로직과 객체의 도메인 로직이 혼재해 책임이 제대로 눈에 들어오지 않는다는 단점이 있다.

2. 구분하기 전략

이 전략을 사용하면 굳이 ORM을 사용할 필요가 없다. 하지만 이는 되려 구분하기 전략이 추구하는 바이기도 한데, 도메인이 ORM 같은 특정 구현 로직에 의존하지 않기 위해 만들어진 전략이기 때문이다.
이를 통해 JDBCTemplate, MyBatis로의 전환을 쉽게 할 수 있을 뿐 아니라 더 나아가 DBMS에도 의존하지 않는다.
다만 작성해야 하는 코드의 양이 늘어난다는 점은 확실히 단점으로 작용한다. 더불어 이를 사용하면 ORM이 제공해주는 기능들을 누리기가 어려워진다.

3. 평가

통합하기 전략
도메인과 영속성 객체를 통합한다.
작성해야 하는 코드의 양이 줄어든다.
도메인이 영속성 라이브러리에 강결합된다.
구분하기 전략
도메인과 영속성 객체를 분리한다.
작성해야 하는 코드의 양이 늘어난다.
도메인과 영속성 라이브러리가 분리된다.
말은 구분하기 전략이 되게 좋고 옳아보이는 것처럼 했지만 앞서 말했듯 은탄환은 없다. 상충 관계를 잘 생각해서 전략을 선택하는 것이 좋다.