Entity 이해하기

옹심이·2024년 12월 18일
0
post-thumbnail

시작하며

엔티티하면 뭐가 떠오를까.

JPA의 @Entity, 관계형 데이터베이스에 저장하기 위한 도메인 객체라는 것이 가장 먼저 떠오른다.

하지만 내가 알고 있던게 전부가 아닐수도?

엔티티의 종류와 유래, 정확한 정의를 살펴보자

세 가지 Entity

경력을 더할수록 도메인 모델에 대한 이해가 쌓이면서 실제 도메인 모델의 엔티티와 DB 관계형 모델의 엔티티는 같은 것이 아님을 알게 되었다.
-DDD START 저자 최범균님-

최범균님의 인용 어구이다.

도메인 모델의 엔티티? DB 관계형 모델의 엔티티? 무슨 말인지 이해가 안간다. 내가 아는 엔티티는 JPA 엔티티밖에 없는데..

세 가지 엔티티를 알아보며 엔티티가 무엇인지 파악해보려고 한다. 세 가지 엔티티는 다음과 같다

  1. 도메인 엔티티
  2. DB 엔티티
  3. JPA 엔티티

1. 도메인 엔티티

'도메인'과 '엔티티' - 이 두 용어는 많이 들어봤지만 설명하기가 쉽지 않다. 먼저 도메인에 대해 간단히 알아보자.

도메인은 간단히 '비즈니스 영역'을 의미한다.
예를 들어, 은행 앱을 개발한다면 은행이 도메인이 되는 것이다.

도메인 모델은 특정 도메인의 문제를 해결하기 위해 만들어진 클래스 모델이다.
은행 앱에서는 Account, Transaction, Money와 같은 개념을 클래스로 구현해야 하는데, 이렇게 만들어진 개념 모델들을 '도메인 모델'이라고 한다.

이러한 도메인 모델 중에는 특별한 성질을 가진 모델들이 있다. Account나 Transaction을 예로 들면, Money 모델과는 달리 고유한 식별자를 가질 수 있으며, 도메인에 특화된 비즈니스 로직과 생명주기를 갖는다.

이처럼 도메인 모델 중 이런 특별한 기능을 가진 모델들을 도메인 엔티티라고 한다. 도메인 모델은 2가지 특징을 가진다.

  1. 식별 가능한 식별자를 가진다.
  2. 비즈니스 로직을 가진다.

정리하면, 도메인 엔티티는 고유한 식별자와 비즈니스 로직을 갖는 특별한 클래스로 만들어진 객체를 의미한다.

일반적으로 소프트웨어 개발 분야에서 말하는 엔티티는 이 도메인 엔티티를 뜻한다. 이는 개발의 주된 목적이 비즈니스 영역의 문제를 해결하는 데 있기 때문이다.

그리고 개발 과정에서 말하는 모델링이란 곧 도메인을 모델링하는 것을 의미한다. 도메인 모델링의 핵심 산출물은 도메인 모델이며, 이 도메인 모델에는 여러 객체의 종류가 포함되는데 그 중 하나가 도메인 엔티티인 것이다.

2. DB 엔티티

이는 도메인 엔티티의 개념과 관계 없이 원래 데이터베이스 업계에서도 사용하던 용어이다.

데이터베이스 분야에서 표현하고자 하는 유형, 무형의 객체를 표현하기 위한 수단으로 사용된다라는 것만 기억하자.

3. JPA 엔티티

관계형 데이터베이스에 있는 데이터를 객체로 매핑하는데 사용되는 클래스를 의미한다.

@Entity라는 에너테이션을 지정하여 사용할 수 있고, DB 엔티티에 조금 더 가까운 개념으로 이해할 수 있다. 왜냐하면, JPA가 관계형 데이터베이스에 뿌리를 두고 있기 때문이다.

엔티티를 이야기할 때 JPA 엔티티를 설명하는 것이 틀린 것은 아니지만 앞서 알아본 것처럼, 소프트웨어 개발에서 엔티티는 도메인 엔티티를 의미하는 것이다.

둘은 유사하면서도 혼용될 때가 많지만 엄연히 다른 것이다.

그래서 엔티티가 뭔데?

지금까지 살펴본 세 가지 엔티티는 모두 엔티티라는 큰 카테고리의 하위 개념일 뿐이다.

그렇다면 엔티티란 정확히 무엇이며 이렇게 다양하고 복잡한 개념을 어떻게 받아들여야할까?

엔티티의 유래와 정의를 알아보고 JPA 엔티티와 비교해보자.

최초에 프로그래밍 언어를 연구하던 사람들과 데이터베이스를 연구하던 사람들에게 한 가지 고민이 있었다고 한다.

                     “유 무형의 자산을 데이터로 어떻게 표현하지?” 

예를 들어, 사용자라는 데이터를 표현하려는데, 사용자는 아이디, 이메일 등의 정보를 갖고 있다고 할 때 사용자 같은 자산 정보를 뭐라고 불러야 할까?

프로그래밍 언어와 데이터베이스 분야에서는 이처럼 표현하고 싶은 유무형의 자산 전보를 엔티티로 지칭하기로 했다. 왜 이렇게 지칭했는지는 아무도 모른다고 한다.

이제 용어를 정리했으니 다음으로 이 엔티티를 어떻게 표현할지 고민한다.그들의 고민은 비슷했지만 진영이 달랐기에 다른 방식으로 표현되었다. 객체 지향 진영에서는 ‘클래스’를, 데이터베이스 진영에서는 ‘테이블’을 사용에 데이터를 표현했다.

추후에 실 서비스를 만들기 위해 양쪽 진영에서 협업할 필요가 생겼다.

클래스와 테이블 둘 다 데이터를 표현하기 위한 고민의 산물이지만 결과물이 너무나도 달랐기에, 1대 1로 매핑하는데는 무리가 있었다. (자세히 알아보려면 다음 포스트를 읽어보는 것을 추천한다.)

그래서 데이터베이스에서 데이터를 가져와 도메인 모델에 옮기는 MyBatis 등의 라이브러리가 만들어졌고, 쿼리의 결과를 도메인 모델에 매핑해 잘 사용해왔다.

이후 번거로운 매핑 작업을 줄이고자 ORM이라는 솔루션이 등장하여 이를 자동으로 처리해줄 수 있게 되었다. 그 중 가장 대표적인 것이 JPA인 것이다.

이쯤해서, JPA의 특징을 살펴보자.

  1. JPA 엔티티는 관계형 데이터베이스의 엔티티를 지칭한다.
  2. @Entity 어노테이션이 적용된 객체는 영속성 객체다
  3. @Entity는 영속성 객체를 만들기 위한 도구이다

엔티티의 등장 배경과 JPA의 속 뜻을 고려하면, JPA의 엔티티는 소프트웨어 개발에서 사용되는 '엔티티' 개념보다 DB 엔티티에 가까우며 ‘영속성 객체’라고 설명하는 것이 맞는 것 같다.

영속성은 데이터가 영원히 이어지도록 어딘가에 저장하고 불러올 수 있는 것을 의미하며 @Entity가 지정된 클래스가 역할을 완벽히 수행하기 때문이다.

JPA 엔티티는 영속성 객체를 위한 도구일 뿐이며, 소프트웨어 개발 분야의 엔티티의 개념과 다르다는 것을 알 수 있다.

정리

  • 엔티티는 데이터로 표현하려는 유무형의 대상이다
  • DB 엔티티는 데이터베이스 분야에서 데이터로 표현하려는 대상이다.
  • 소프트웨어 개발 분야에서 말하는 엔티티는 도메인 엔티티다.
  • 도메인 엔티티는 도메인 모델 중에서도 식별자와 비즈니스 로직을 가지고 특별하게 관리되는 객체이다.
  • JPA 엔티티는 관계형 데이터베이스의 엔티티를 지칭한다
  • JPA의 @Entity은 영속성 객체를 만들기 위한 도구이며, 이것이 적용된 객체는 영속성 객체이다.
  • 도메인 엔티티와 DB 엔티티는 다르다

0개의 댓글