도메인과 엔티티는 뭔 차이일까

최혜성·2024년 1월 30일
0
post-thumbnail

Entity

엔티티는 흔히 볼 수 있는 개념이다.

단순하게 말하면 'DB 테이블과 매핑되어 DB에 저장될 수 있는 객체' 로 볼 수 있다.
매번 Spring에서 데이터를 저장하고 불러오고 할때 Entity 어노테이션으로 쉽게 쓸 수도 있고, 그냥 하나의 모델로써 사용하곤 한다.

Domain???

멀티모듈, 패키징 등등을 보다보면 간혹 Entity와 Domain을 분리시켜 놓은 분들이 많았다.
두개 다 같은 개념 아닌가? 라고 생각하며 클래스를 봐도 같은 값을 담아놓는 객체일뿐 별 차이가 없었다.
굳이 보자면 Entity에 일부 로직이 섞인 정도?

https://devfunny.tistory.com/874
https://velog.io/@yeahg_dev/Domain%EA%B3%BC-Entity%EC%9D%98-%EA%B0%9C%EB%85%90
https://mangkyu.tistory.com/160
https://www.ibm.com/docs/en/igfa/10.0.0?topic=reports-domains-entities-attributes
그래서 글들을 찾아보니 요런 느낌으로 정의되어 있었다.

혼재

여러 블로그 글을 보다보면 DB에 저장되는 Entity Class. 즉 @Entity로 선언된 데이터 클래스를 엔티티로 부르는 경우도 있고, 도메인 객체로 부르는 경우도 있다.
이렇게 혼재되어 있는 사례가 워낙 많아 사실 잘 구분하기 어렵다.

음..

내가 생각해본 도메인과 엔티티의 개념은 다음과 같다.

  • 도메인 : 기능적인 logic들을 담고 있는 주체.
  • 엔티티(모델) : 데이터베이스와 밀접하게 관련되어 데이터와 일부 로직을 담고 있는 주체.

어렵다

좀더 쉽게 보자면 '엔티티 ⊂ 도메인' 일 수 있다는 느낌이다.
컴공 과목 듣다보면 소프트웨어 설계 비스무리한 과목에서 UML 설계 같은거 배울텐데
그때 유스케이스 다이어그램이라는것을 배울것이다.

유스케이스 다이어그램에서 한 액터가 수행하는 기능들을 유스케이스라고 하는데, 이를 도메인으로 볼 수 있다.
식당 액터가 음식을 만들고, 음식을 주문받는등의 행위 등등

그러면 엔티티는 무엇인가.
해당 도메인을 가지고 DB와 연결하고 데이터를 저장하는 주체로써 구현된다면 엔티티로 볼 수 있지 않을까?
그런데 음식을 만든다는 '행위'를 통째로 DB에 저장하지는 않는다. 보통 음식제작(음식, 가격, 수량..)이런식의 '데이터'를 저장한다.
이때, 음식을 만드는 '행위'는 도메인이 될것이고, 음식제작의 '데이터'는 엔티티가 될것이다.

그러면 도메인에서 DB에 저장되는 부분이 엔티티가 아닐까? 만약 웹에서 Response를 받아왔는데 이게 DB에 저장안되면 도메인이고, DB에 저장한다음 따로 처리하는 클래스 생기면 엔티티고..

그래서 '기능'을 갖고 있는 클래스면 도메인, '데이터'에 초점을 두고 DB와 가까우면 엔티티.
이 개념이 스프링에서는 Model = Entity로 되어 있어 더 혼재되는게 강한거 같기도 하고..

-> 글 적다보니 괜히 꼬여서 더 어려워졌당..
-> 이 논리대로면 MVVM 클린 아키텍처에서 UseCase - Domain / Entity - Model 개념이 맞을듯?

현재 진행중인 프로젝트 패키지 구조를 각자의 기능에 맞게 구성해뒀는데, 이게 도메인 기반 구조인듯. 기존에 Controller별로, 엔티티별로 묶었다가 대참사 나서..

이걸 참조하면 좀 이해가 될것 같다.

profile
KRW 채굴기

0개의 댓글