도메인 모델의 의미를 이해하기 위한 공부에 참고하면 좋을 것 같다고 이 글을 추천해주셨다.
그렇게 해서 시작된 도메인 모델의 의미를 찾아나가는 공부..
그 결과 지난 글처럼 혼돈에 빠져버렸다.
분명 글도 읽어보고 위의 글 외에도 "도메인", "도메인 모델", "도메인 계층" 등의 키워드로 여러 글을 읽었는데, 찾아볼 수록 내용의 범위가 점점 넓어졌다.
DDD부터 레이어드 아키텍처, MVC 패턴 등의 내용을 읽게 되었는데 뭔가 개념이 명확해진다기보다는 진행했던 과제와 피드백, 여러 글에서 말하는 개념이 모두 뒤섞여서 혼란스러워졌다.
사실 그냥 있는 그대로, 적혀있는 그대로 받아들이면 "아 이런 개념이구나~" 싶을텐데
내가 작성한 코드에 적용해보려고 하니까 오히려 그게 더 헷갈리게 만든 것 같다.
대부분의 내용이 자바 관련 내용이고 데이터베이스도 NoSQL은 아니라서 용어에서부터 좀 다르게 느껴졌다.
그래서 일단 차근차근 하나씩 잘 모르겠는 부분을 정리해보려고 한다.
헷갈림 첫번째.
도메인 클래스와 서비스 클래스의 차이는 무엇인가..!
계층형 아키텍처에서 주로 3개의 계층으로 나누어 설명을 하고 있고, 그 중 Domain(Business or Service) 계층에 대한 이야기이다.
Domain 계층을 서비스 계층, 기반 서비스 계층으로 나눈다고 하는데 공유해주신 글에서는 용어를 좀 다르게 표현해서 도메인 계층과 서비스 계층으로 나눠서 사용하신다고 한다.
여기서 도메인 계층과 서비스 계층에 대해 설명을 써놓으셨는데도 실제 구현했을 때의 그림이 잘 안그려졌다. 그게 아무래도 도메인 로직이라는 용어에 대한 개념이 모호해서 그런 것 같다..
그동안 NestJS로 백엔드 코드를 작성했는데, 파일은 크게 module, controller, service, repository, schema 로 구분해서 작성했다. (guard, interceptor 등 제외)
controller는 요청을 받아 적절한 서비스를 호출해주고 서비스에서 리턴한 데이터로 응답을 처리하는 계층이다. 이거까진 똑같아서(?) 문제 없이 이해가 잘 되었다.
service에는 비즈니스 로직을 작성하는 부분으로 이해하고 만들었다. 비즈니스 로직이 뭐냐 라고 물어본다면 기능 및 동작 구현을 위해 진행되어야 하는 과정들(?)이라고 설명할 것 같다.
그런 로직을 전부 Service 클래스에 구현해놨다. (ex. UserService, ProductService 등)
repository는 데이터베이스에 쿼리를 날리는 클래스로, service에서 직접 DB 데이터를 다루지 않게 해서 비즈니스 로직과 데이터 액세스 로직이 분리될 수 있도록 하는 역할을 한다.
schema는 mongoose를 사용하고 있어서 나오게 되었는데, mongoose에서는 모든 것이 schema에서 파생되어서 schema로 model을 생성하고, model의 인스턴스가 document다.
위와 같은 상황에서 도메인 계층과 서비스 계층을 이해해보려고 했다.
도메인 계층
- Rich Domain 모델을 기반의 문제 도메인 해결에 순수하게 집중하는 계층
- Business 로직만 담당하며, 외부의 특정 기술이나 구현 의존성을 최대한 피한다.
서비스 계층
- 기반 서비스 계층 혹은 애플리케이션 계층 등으로 불린다.
- 도메인 로직과 함께 사용되는 기반 환경의 로직들을 수행한다.
- 트랜잭션
- 메일 & SMS 발송 등 다른 인프라와의 통신을 담당하는 역할도 한다.
공유해주신 글에서 이렇게 설명까지 해놓으셨는데 도메인 계층 - 비즈니스 로직만 담당한다
라는 부분에서 우리 Service 클래스에 비즈니스 로직 넣어놨는데.. 이거 맞나?
해서 이해 1트 실패..
비즈니스 로직에 대한 정의가 좀 다른 것 같다..ㅠㅠ
이해하기 2트.
그러면 "우리가 service로 크게 만든 클래스 하나가 도메인 클래스와 서비스 클래스로 나눌 수 있다는건가?" 라고 생각을 하게 됐고, 그렇다면 도메인 클래스는 뭐고 서비스 클래스는 뭘까?
계속 이런저런 글을 봐도 뭔가 확실하게 이해가 안되서 (전)팀장님께 질문드렸당..하핳..(감사감사)
(내가 이해한 도메인에 대한 개념)
일단도메인
이라는 용어가 지난 글에서 얘기했던 것처럼프로그래밍으로 해결하고자 하는 주제에 대한 영역과 핵심 비즈니스 요구사항을 의미하는 단어
라 해서 그냥 간단하게 리소스랑 동일한 개념으로 생각했다.
보통 API만들 때 리소스로 구분해서 만든다고 해서 서비스에서 다루는 개념(?)들을 기준으로 나누는데 도메인이 그거랑 동일한게 아닐까 생각했다.
지금 회사 기준으로 생각해보면 User, Product, Order, Project 등이 각각 도메인일 것이다.
도메인 로직과 서비스 로직을 구분해서 설명해주셨다.
도메인 로직은 운영하는 서비스의 정책이 녹여져 있는 것들을 의미하고,
서비스 로직은 어플리케이션에서 처리되어야 하는 것들을 의미한다.
"도메인" 이라는 게 내가 이해한 것처럼 서비스에서 관리하는 주된 개념 및 데이터?이기 때문에 도메인 관련 로직은 우리가 Nestjs를 쓰든 생으로 express위에 바로 구현을 하든 변함없이 사용될 수 있는 로직이라는 것이다.
서비스 로직은 어플리케이션에 따라 처리되는 로직인데, 예를 들어 Nestjs라면 Service 클래스를 만들 때 @Injectable() 을 사용해서 다른 곳에서도 주입해서 사용할 수 있게 만드는데, 이 @Injectable()
에서부터 Nestjs에서 제공하는 함수이기 때문에 도메인 클래스라고 할 수 없게 된다.
단순히 저런 데코레이터로 구분하는건 아니겠지만, 도메인 로직은 언어가 달라지지 않는 이상 어떤 프레임워크던 간에 동일하게 사용할 수 있어야 하는거고, 서비스 로직은 어플리케이션에 따라 달라질 수 있다.. 라고 이해했다.
뭔가 뿌옇게 보이던게 그나마 좀 이해가 되었는데, 또 막상서비스 계층에 트랜잭션이나 도메인 로직과 함께 사용되는 기반 환경의 로직들을 수행한다고 해놓은걸 보면 제대로 이해하고 있는게 맞는건지.. 모르겠음😢
피드백 받은걸로 공부하려고 하다보니까 그냥 피드백 준 사람한테 바로 물어보고 싶어진다... 아는 사이면 물어보는건데...ㅋㅋㅋㅋ ㅠㅠ
그냥 아키텍처 관련 책 한권을 읽고 공부를 하는 것도 좋을 것 같다는 생각을 했다. (전)팀장님도 책 추천해주셨으니 올해 가기 전에 아키텍처 관련 책 한 권 읽어야겠다.
헷갈리는 점 첫 번째는 어느 정도 이해하고 마무리..