우아한 테크코스 프리코스에 참여하면서, MVC구조에 대해서 많이 들여다 보았다.
MVC 모델을 기반으로 프로젝트를 설계하다 보면 Domain과 Model의 역할과 책임이 모호해지는 경우가 생긴다.
최근 스터디에서는 이를 주요 탐구 주제로 삼았고, 이에 대해서 쪼금 얘기해보자 한다.
먼저 MVC가 무엇인가 살펴보자.
1️⃣ MVC란 무엇일까?
"MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다."
MVC - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN
MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고
developer.mozilla.org
각 컴포넌트는 다음과 같은 역할을 맡는다.
- Model(모델): 애플리케이션의 데이터와 비즈니스 로직을 담당한다. 데이터의 저장, 조회, 수정, 삭제와 같은 작업과 비즈니스 규칙을 처리한다.
- View(뷰): 사용자에게 데이터를 표시하는 사용자 인터페이스. 모델로부터 데이터를 받아와 화면에 보여주고, 사용자 입력을 받는다.
- Controller(컨트롤러): 사용자 입력을 처리하고, 해당 요청을 모델과 뷰로 전달하는 중개자 역할. 비즈니스 로직을 모델에 위임하고 결과를 뷰에 전달한다.
주로 사용자 인터페이스 계층에서의 관심사 분리에 중점을 두는 것을 볼 수 있다.
백엔드 소프트웨어를 만든다는 것은 UI와 완전히 분리된 작업이라고 생각했기 때문에, 백엔드를 처음 시작했을 때는 이 내용이 크게 와닿지 않았다.
UI는 그저 front-end에서 담당하고, controller라는 entry point를 거쳐 특정 로직이 수행되고 결과가 반환된다고 생각했다.
다만 프리코스에서 요구한 소프웨어의 특징은 사용자의 input을 시작으로 특정 result를 반환해야 한다는 것이였다. 이 때문에 MVC 패턴에 대한 수요가 생기고, 많은 사람들이 이 패턴을 바탕으로 설계를 했다고 생각한다.
2️⃣ Domain과 Model 알아보기
그럼 본론으로 들어와서
Domain과 model이 무엇이고, 그들의 차이에 대해서 알아보자.
Model 이란?
- 데이터와 비즈니스 로직을 관리하는 컴포넌트다.
- 데이터베이스와 상호 작용하고, 데이터를 저장하거나 수정하는 기능을 제공한다.
Domain이란?
- 애플리케이션이 다루는 비즈니스 영역을 의미한다.
- 해당 영역의 엔티티, 속성, 행동, 규칙 등을 정의한다.
- 비즈니스 로직 중에서도 핵심적인 개념과 규칙에 집중한다.
역할들을 바탕으로 Domain과 model의 관계를 추론하면
→ Domain은 Model의 일부이며, 비즈니스 로직의 핵심적인 부분을 담당한다.
무엇이 다를까?
그럼 이들의 차이는 무엇이 있는지 알아보자
- 범위의 차이:
- Model은 데이터 처리와 비즈니스 로직 전체를 포함하는 광범위한 개념이다.
- Domain은 그 중에서도 비즈니스 문제와 관련된 핵심 부분을 지칭합니다.
- 역할의 차이:
- Model은 데이터의 저장, 수정, 삭제 등 CRUD 작업과 관련된 기능을 수행한다.
- Domain은 비즈니스 규칙과 로직을 구현하여, 애플리케이션이 해결하려는 문제를 직접적으로 수행한다.
- 구성 요소의 차이:
- Model은 Domain 모델, 데이터 접근 레이어, 서비스 로직 등을 포함한다.
- Domain은 엔티티 간의 관계, 비즈니스 규칙, 도메인 서비스 등을 포함한다.
차이를 통해서, Model은 데이터와 비즈니스 로직 전반을 관리하지만, 도메인은 그 중에서도 비즈니스 문제 영역의 핵심 로직을 담당하는 것을 볼 수 있다.
3️⃣ Domain과 Model의 역할과 책임
Model과 Domain의 차이를 통해서 각 컴포넌트가 갖는 구체적인 역할과 책임에 대해서 정리해보자.
Domain의 역할과 책임
- 역할
- 비즈니스 로직의 구현: 도메인은 애플리케이션이 해결하려는 핵심 비즈니스 로직을 갖고 있다.
- 문제 영역의 모델링: 특정 비즈니스 도메인에 대한 엔티티, 값 객체, 도메인 서비스 등을 정의하여 문제 영역을 표현한다.
- 비즈니스 규칙과 제약 관리: 도메인 객체들은 자신의 상태와 행동에 대한 비즈니스 규칙과 제약 조건을 관리한다.
- 책임
- 비즈니스 규칙 준수: 모든 비즈니스 로직이 정해진 규칙에 따라 정확하게 동작하도록 보장한다.
- 상태 일관성 유지: 도메인 객체들은 자신의 상태를 일관성 있게 유지하며, 불변성을 지킨다.
- 도메인 이벤트 처리: 중요한 상태 변화나 비즈니스 이벤트 발생 시 적절한 조치를 취하거나 다른 컴포넌트에 알린다.
Model의 역할과 책임
- 역할
- 데이터와 비즈니스 로직의 관리: 모델은 애플리케이션의 데이터 구조와 비즈니스 로직 전반을 관리한다.
- 데이터베이스와의 상호 작용: 데이터의 저장, 조회, 수정, 삭제 등의 CRUD 작업을 수행한다.
- MVC 패턴에서의 데이터 제공자: 컨트롤러와 뷰에 필요한 데이터를 제공한다.
- 책임
- 데이터 접근 로직 구현: 데이터베이스나 외부 데이터 소스와의 통신을 처리한다.
- 데이터 검증과 변환: 입력된 데이터의 유효성을 검사하고 필요한 형식으로 변환한다.
4️⃣ 마치며
Domain은 비즈니스 로직과 상태를 담고 있는 서비스의 key object이고, Model이 작업 수행을 위해 필요로 하는 존재이다.
‘클래스의 책임과 역할에 따른 경계’는 매번 개발을 할 때 가장 중요하게 생각하는 부분 중 하나다.
Domain과 model의 책임과 역할을 정리하면서 차후 개발하는 프로젝트에서 좀 더 나은 개발을 할 수 있지 않을까 기대한다.
'Backend' 카테고리의 다른 글
AWS lambda python 패키징 오류 타파 (0) | 2024.12.07 |
---|---|
전략 패턴을 사용하여 test에 적용하기 (0) | 2024.11.27 |
Interface를 테스트 하라? (0) | 2024.11.25 |
맨땅에 머리부터 박아보는 DDD 도전기 - 1 (1) | 2024.11.24 |
방어적 프로그래밍 (0) | 2024.11.06 |