도메인&엔티티

Siyoon's dev blog·2024년 5월 14일
post-thumbnail

클린 아키텍처를 공부하며 다른 아키텍처와의 차이점을 이해하려고 애써도 잘 와닿지 않았던 가장 큰 이유중 하나는 도메인엔티티의 개념에 대해 명확하게 알지 못했기 때문이었다.
(사실 현재도 두 개념이 어렵게 느껴진다.)

아마 두 용어는 아키텍처를 설계하는 단계에서 자주 등장하는 단어들이 아닐까 싶다.
(e.g. 비즈니스 로직을 표현하기 위한 도메인 객체DB의 엔티티와는 상관 없게 설계한다.???)

필자가 두 개념을 이해하기 어려웠던 이유를 생각해보면 문맥에 따라 의미가 달라지기 때문이었다.

지금부터 도메인과 엔티티가 무엇인지 어떤 차이가 있는지 알아보자.

도메인 (domain)

도메인은 특정 기능이나 비즈니스 로직을 중심으로 구성된 개념

여기에서 말하는 비즈니스 로직이란 소프트웨어가 해결하고자 하는 문제를 의미한다.
쉽게 말해, 도메인이란 구현하고자 하는 기능 또는 소프트웨어로 해결하고자 하는 문제를 처리하는개념인 것이다.

예를 들어, e-commerce 서버를 구축한다고 가정해보자.
유저 관리 도메인로그인, 프로필 관리와 같은 필요 기능의 개념이 될 수 있고,
주문 관리 도메인주문 생성, 결제 처리와 같은 핵심 비즈니스 로직을 처리하는 개념이 된다.

엔티티 (entity)

엔티티는 도메인 내에서 고유한 식별자(ID)를 가지는 객체

즉, 엔티티란 도메인(소프트웨어로 해결하고자 하는 문제 영역, 기능, 속성들로 구성된 개념)에서 식별 가능한 객체를 뜻한다.
(도메인은 엔티티를 포괄하는 개념)

엔티티는 아래와 같이 크게 두가지 맥락에서 의미가 달라진다.

  1. 도메인 모델 맥락에서의 엔티티
  2. 데이터베이스 맥락에서의 엔티티

도메인 모델 맥락에서의 엔티티는 도메인 내의 중요한 비즈니스 로직을 담은 객체를 말한다.

// 도메인 모델 맥락에서의 엔티티
class User {
  private id: number;
  private username: string;
  private password: string;

  constructor(id: number, username: string, password: string) {
    this.id = id;
    this.username = username;
    this.password = password;
  }

  // 💁💁 비즈니스 로직 메서드 💁💁
  changePassword(newPassword: string) {
    if (newPassword.length < 8) {
      throw new Error("Password must be at least 8 characters long");
    }
    this.password = newPassword;
  }
}

데이터베이스 맥락에서의 엔티티는 데이터베이스 테이블에 매핑되는 객체를 말한다.

// 데이터베이스 맥락에서의 엔티티 (typeORM을 사용하는 경우)
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
class UserEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;
}

헷갈리는 개념인 도메인엔티티에 대해 알아보았다.
개념을 정확히 이해했다면 아래 문장이 무슨 의미인지 보다 쉽게 이해할 수 있을 것이다.

도메인 모델과 데이터베이스 엔티티를 분리하여 비즈니스 로직을 더 잘 관리하고, 외부 의존성을 줄일 수 있습니다.

profile
직접 글을 쓰는 지루함을 즐기기 위한 블로그

0개의 댓글