스프링

도메인, 모델, 엔티티에 대해

윤소룡 2024. 9. 22. 20:49

엔티티, 도메인, 모델이 라는 단어를 혼용해서 사용하곤 한다.
Java에서는 Domain을 더 많이 쓰고, C#에서는 Model이 더 많이 사용된다.

찾아본 결과 엄밀하게 정의되지 않은 관념적 언어에 가까웠는데,
이에 대해 여러 글들을 통합해서 적어보았다.

Domain

domain is the conceptual area I’m working inside of.원문 글

 

The difference between domains, domain models, object models and domain objects - Code with Jason

I recently came across a question regarding the difference between domains and domain models. These terms probably mean different things to different people, but I’ll define the terms as I use them. Domain When I’m working on a software project, the do

www.codewithjason.com

 

위에서 말한 것 처럼, 도메인은 작업을 나타낸다. 만약 내가 예약앱을 만든 다면 예약이 도메인일 것이다.

이떄 하나의 작업을 여러개의 작업 작업으로 분리할 수 있듯이, 도메인도 하위 도메인으로 나눌 수 있다.
예를 들자면 상품 주문, 예약, 배송 등등..이 될 수 있을 것이다.

이는 도메인 객체(Domain Model) 이어지는데, 이는 다음과 같다.

Domain Model

같은 요구사항이라도, 구현 방법은 다를 수 있다.
정확히 말하면 현실의 문제를 해결하기 위해 우리가 떠올리는 여러 방법들이다. 모호하고, 사람마다 다르다.

Domain Object Model

Domain Object Model은 위의 Domain Model을 실제 코드로 옮긴 것이다.

때문에 이 코드의 순수성을 지키려고 하는 프로그래머도 있다.
JPA, Lombok 등 여러 라이브러리에 의존성이 생기는 순간, 처음에 내가 떠올린 Domain Object Model의 순수성이 사라진다고 보는 것이다. 이를 분리함으로서 내가 나중에 다른 라이브러리를 사용하거나, 마이그레이션하는 경우에도 도메인 객체는 그대로 사용할 수 있게 된다.

 

Spring의 핵사고날 아키텍쳐를 대표적인 예시로 볼 수 있을 것이다.

Entity

An entity is a lightweight persistence domain object.

 

위 문장은 oracle 공식문서 에서 정의한 Entity이다.

한국어로 풀어서 설명하자면복잡한 로직을 담고 있지 않으면서 요구사항을 나타낼 수 있는 영속 객체라고 할 수 있다.

영속 객체라는 표현이 들어간 만큼, 외부의 컨텍스트에 저장될 것이다.
따라서 Entity 클래스는 실제 DataBase의 테이블에 매핑되는 클래스이다.