요구사항을 확인하고 설계를 하는 단계에서 MVC패턴을 적용 시키려고보니 "도메인과 모델은 무슨차이인가" 부터 시작해서 "MVC패턴은 Model, View, Controller인데 MVC패턴에서 Domain이 더해지면 MVC패턴이 아닌건가?" 그리고는 최종적으로 그럼 Entity는 무슨차이지? 라는 궁금증이 생겼었다.
그래서 도메인, 모델 그리고 엔티티의 정확한 정의와 각 개념들은 어떤차이가 있는건지 그리고 MVC패턴과 연관관계를 알아봐야겠다라고 결심했다
도메인
도메인을 정의하기에 앞서 소프트웨어가 무엇인지에 대해 부터 정의하면 도메인을 이해하는게 편할 것이다.
소프트웨어는 사람이 현실세계에 있는 문제를 해결하거나 보다 편리하게 사용하기위해서 만드는 프로그램이라고 생각한다
예를 들어서 현시점에 음식점이나 카페에 가면 흔하게 볼 수 있는 키오스크는 코로나가 유행하던 시점에 캐시어와 손님사이에 대면을 최소화해야한다는 문제를 해결하기위해 만들어진 것이 주 목적이었으며 현재에는 고용주 입장에서는 인건비를 아낄 수 있고 손님입장에서는 더 편리하게 주문을 할 수 있을 것이다
이제 키오스크를 생각하면서 도메인을 생각해보자, 도메인은 비즈니스의 핵심단위 이다.
위에서 들었던 예시의 비즈니스는 바로 키오스크이다. 그렇다면 키오스크라는 비즈니스의 핵심단위는 무엇일까?
키오스크라는 기계는 사용자들에게 직접 UI를 제공하여 버튼을 몇 번 클릭함으로써 메뉴를 고르고, 음식을 주문하고 결제하도록 도와준다
A라는 손님이 어떤 메뉴를 골랐는지, 결제는 했는지를 알기위해서는 보이지 않는 곳에서 동작하는 소프트웨어가 필요한 것이다
이 소프트웨어를 만드는 것이 바로 개발자이다.
개발자들은 코드로 직접 키오스크 시스템을 구현하기전에 설계하는 과정이 필요한데, 이 때 비즈니스의 도메인을 추출하여 도메인을 정의해야한다
키오스크에서 도메인을 추출한다면 결제, 주문, 메뉴, 적립
등등 여러 도메인이 추출될 것이다
이제 도메인의 기본적인 개념에 대해서 이해했고 구현하는 관점에서 살펴보자
구현할 때는 주문
이라는 도메인은 객체로 구현되어야하기때문에 Order
라는 클래스로 다시 태어나게 된다Order
도메인 객체에는 어떤 상태와 어떤 기능을 가져야할지 생각해보자
먼저 어떤 도메인 객체와 협력할 것이며 협력하기위한 행동이 무엇인지 생각해보자
메뉴
과 협력하여 어떤 메뉴가 주문되는지 알아야할 것이다결제
과 협력하여 결제를 진행하고 결제완료 여부를 알아야 할 것이다적립
과 협력하여주문
의 금액이 얼마였는지를 알아야 적립금을 얼마를 줄 것인지 알 수 있을것이다주문
은 스스로 주문을 만들 수 있어야한다
위와 같이 간단하게 4개의 협력/기능만을 생각해 보았다
이제 기능을 생각해보았으니 어떤 상태가 필요할지 생각해보자
- 어떤메뉴를 주문했는지 알아야하기때문에
메뉴목록
이 필요할 것이다 - 결제는 보통 외부시스템과 연동되기때문에 결제여부와 취소여부만 알면 되기때문에
결제상태
가 있을 것이다 적립
객체에서는 적립금을 계산하기위해 총 주문금액이 얼마였는지 알아야할 것이다총주문금액
메뉴목록
결제상태
총주문금액
세 개의Order
도메인 객체의 상태를 생각해볼 수 있었다.
이제 상태들을 멤버변수로 기능들은 메서드로 구현하는 것이 바로 도메인이고 도메인 객체이다
Model
도메인이 무엇인지 완벽히 이해했다면 모델을 이해하는데 어려움이 없을 것이다
모델은 도메인보다 넓은의미에서 사용되며 도메인을 모델이라고 부를 수도 있다
가장 대표적으로 MVC패턴에서 모델은 모델의 상태를 직접 관리함과 동시에 Controller
계층 또는 View
계층으로 직접 데이터가 전달되기도한다.
엔티티도 마찬가지로 상태들을 직접 관리함과 동시에 데이터 접근계층에서만 사용될 수도 있고, 서비스 레이어에서 관리될 수도 있다.
개인적인 생각으로는 Model
을 설명하기위해 가장 대표적인 예시로 Dto
객체를 들 수 있을 것 같다
DTO는 Data Transfer Object
의 약자로 말 그대로 데이터를 전달하기위한 객체이다
위의 예시를 다시 가져와서 이해해보자주문
과 적립
이 협력할 때 적립금을 계산하기위해서는 주문객체의 총주문금액
이 필요하다
이 때 savePointDto
라는 Dto객체를 따로 만들어서 적립
객체로 보낼때 데이터를 전송하기위한 객체인 savePointDto
를 모델이라 할 수 있다
이외에도 View를 위한 객체도 Dto
객체이며 이렇듯 Model
은 다양한 의미에서 다양하게 사용되는 개념이다
Entity
엔티티는 더욱 간단하게 이해할 수 있을 것이다
데이터베이스에 저장되기위한 객체이다. 그렇기때문에 데이터베이스 접근계층과 가장 밀접한 관련이 있다
모델이나 도메인 객체와 다른점이 있다면 id와 같은 고유식별자 필드를 가지고 있다는 점이다
Reference
https://jaehoney.tistory.com/203#google_vignette - 도메인과 DDD
'에러 > 기타' 카테고리의 다른 글
인텔리제이 빌드시 캐시손상문제 - 컴파일, 빌드에 관한 해결방법 (1) | 2024.10.15 |
---|
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!