•
도메인이 무엇인지 확실하게 알아보는 장이다.
•
일반적으로 소프트웨어 공학에서의 도메인은 어플리케이션이 해결하고자 하는 문제 영역을 의미한다.
•
그러나 이렇듯 딱딱하고 추상적인 설명은 우리에게 잘 와닿지 않는다. 따라서 저자는 이 장에서 서술적인 설명을 바탕으로 우리의 이해를 이끌어내고자 한다.
•
또한 백엔드 개발자의 입장에서 도메인은 어떻게 바라보는 것이 좋은지 이야기하고 어플리케이션을 개발한다는 말이 왜 도메인을 개발한다는 말과 같은 뜻인지, 어플리케이션의 본질이 왜 프레임워크가 아닌 도메인인지 이야기한다.
1. 소프트웨어 개발의 시작
•
비즈니스 관점에서 소프트웨어의 시작은 뭘까? 사업가 입장에서 소프트웨어 시스템을 만들게 되는 계기는 뭘까?
•
일반적으로 비즈니스는 소프트웨어를 만들어야겠다는 전제로 시작되지 않는다. 비즈니스는 현실 세상에서 발생하는 문제에서 출발한다. 즉 사용자가 겪는 문제를 해결해주는 것이 비즈니스인 것이다. 소프트웨어는 비즈니스의 해결책 중 하나일 뿐이다.
◦
저자의 기준에 있어서 사업가라는 사람은 대다수 사람들이 겪는 문제와 고민을 분석, 해결하는 사람이다.
•
여기서 린 방식에 대한 언급이 등장하는데, 사용자의 문제를 해결한다는 초점에 맞춰서 언급할 필요가 있었기 때문이다.
◦
저자가 정리한 린 방식의 업무 스타일이란?
▪
사용자의 문제 상황을 인식한다.
▪
문제 상황에 따라 어떤 솔루션을 제공하면 좋은 반응을 얻을 것이라고 가설을 세운다.
▪
가설이 맞다면 결과가 어떤 지표로 반영될 것이라고 가정한다.
▪
가설을 검증할 수 있는 가장 빠른 방법을 생각하고 이를 실험한다.
▪
사용자와 지속적으로 소통하면서 가설의 방향성을 지속적으로 조정, 확장한다.
•
지금까지 사용자를 계속 언급해온 부분에서 느낄 수 있듯 우리가 그동안 언급해온 도메인의 정의에 있어서 문제 영역이란 사용자가 겪는 문제 영역이다.
•
이런 관점에서 개발자의 역할은 뭘까? 바로 고객이 겪는 문제 상황을 소프트웨어로 해결해주는 것이다.
◦
개발자는 도메인을 분석하고, 고객이 겪는 문제를 인지하여 이에 맞는 도메인 솔루션을 제공해줄 수 있어야 한다.
•
우리가 개발해야 하는 것은 그냥 어플리케이션이 아닌 도메인 어플리케이션이다. 그러므로 도메인이 무엇인지를 잘 파악하고 있어야 한다.
2. 어플리케이션의 본질
•
우리는 그냥 어플리케이션을 개발하지 않는다. 도메인 어플리케이션을 개발한다. 이 부분을 명확하게 기억하고 있자.
•
앞서 프레임워크는 어플리케이션의 핵심이 아니라고 하며 본질은 도메인이라고 했다. 그렇다면 왜 프레임워크는 본질이 될 수 없을까?
•
우리의 역할은 도메인 어플리케이션을 만드는 것이기 때문이다. 그러니 도메인이 가장 중요하다.
◦
프로젝트 설계자의 입장에서 사용될 구현이나 도구는 선택사항이어야 한다는 전제로 설계에 임해야 유연하게 변경 가능한 소프트웨어를 만들 수 있다.
•
도메인의 유형에 따라 도구와 구현은 달라질 수 있다. 즉, 도구를 전제로 설계하는 것은 결과물이 이에 의존하는 형태로 나올 수 밖에 없기 때문에 적절한 설계가 아니다.
3. 도메인 모델과 영속성 객체
•
이번 장의 내용은 도메인 모델과 영속성 객체는 구분해야 하는가?이다.
1. 통합하기 전략
•
이 전략의 장점은 개발 속도가 상대적으로 빠르다는 장점이 있다. 굳이 두 개의 클래스로 구분하지 않고 변환을 위한 toModel, from 같은 메소드를 만들지 않아도 되기 때문이다.
◦
더불어 JPA의 역할이 ORM이라는 점에서 자연스러운 선택이기도 하다.
•
다만 이 전략을 사용하는 경우, ORM 관련 로직과 객체의 도메인 로직이 혼재해 책임이 제대로 눈에 들어오지 않는다는 단점이 있다.
2. 구분하기 전략
•
이 전략을 사용하면 굳이 ORM을 사용할 필요가 없다. 하지만 이는 되려 구분하기 전략이 추구하는 바이기도 한데, 도메인이 ORM 같은 특정 구현 로직에 의존하지 않기 위해 만들어진 전략이기 때문이다.
•
이를 통해 JDBCTemplate, MyBatis로의 전환을 쉽게 할 수 있을 뿐 아니라 더 나아가 DBMS에도 의존하지 않는다.
•
다만 작성해야 하는 코드의 양이 늘어난다는 점은 확실히 단점으로 작용한다. 더불어 이를 사용하면 ORM이 제공해주는 기능들을 누리기가 어려워진다.
3. 평가
•
통합하기 전략
◦
도메인과 영속성 객체를 통합한다.
◦
작성해야 하는 코드의 양이 줄어든다.
◦
도메인이 영속성 라이브러리에 강결합된다.
•
구분하기 전략
◦
도메인과 영속성 객체를 분리한다.
◦
작성해야 하는 코드의 양이 늘어난다.
◦
도메인과 영속성 라이브러리가 분리된다.
•
말은 구분하기 전략이 되게 좋고 옳아보이는 것처럼 했지만 앞서 말했듯 은탄환은 없다. 상충 관계를 잘 생각해서 전략을 선택하는 것이 좋다.