도메인, Entity, VO / DTO, DAO, Repository

2025. 5. 28. 15:23Projects/JemiLog

1. 도메인, Entity, VO 

개념 의미 주 역할 쓰임 예시 
도메인 전체 비즈니스 개념을 코드로 표현 전체 비즈니스 로직 담당 서비스 전반 Trip, Reservation등
Entity 도메인의 한 형태로 
DB에 저장되는 객체
DB와 연결된 객체 JPA, ORM @Entity가 붙은
Trip, Member
VO
(Value Object)
도메인 안에서 값 그 자체로
의미를 가지는 객체 
불변 객체 주소, 기간, 이름 등 Address, Period 등

1) 도메인(Domain) = 개념의 총 집합

  • 도메인: 프로젝트에서 중요한 개념들
  • 예: 여행 예약 앱의 도메인 = Trip(여행 일정), Member(사용자), Reservation (예약)
  • Entity와 VO는 도메인을 구현하는 방식
    도메인을 코드로 표현할 때 → Entity로 만들 수도 있고, VO로 분리할 수도 있다.

2) Entity = DB와 연결된 도메인 객체

  • ID(primary key)를 갖고 있음
  • 값이 바뀔 수 있음 (가변 객체) 
  • 비즈니스 로직을 포함할 수도 있음
  • DB 테이블과 1:1로 매핑
  • 영속성 컨텍스트에 의해 관리됨
  • Entity는 보통 Service 레이어에서 사용됨
  • JPA에서는 @Entity 어노테이션을 붙여 사용

3) VO (Value Object) = 불변 값 그 자체

@Embeddable
public class Address {
    private String city;
    private String street;
}
  • 값 그 자체로 의미가 있는 객체, 도메인을 표현하는 “부속 값”
  • 예: 주소, 기간, 돈, 전화번호, 이름, 좌표 등
  • 불변(immutable)으로 만드는 게 일반적
  • DB에 저장될 수도 있고, 안 될 수도 있음 (Embedded 형태로 저장 가능)
  • equals와 hashCode 반드시 override
  • 동일성 비교는 ID가 아니라 값 자체
  • JPA에서는 @Embeddable + @Embedded로 사용 가능

2. DTO와 DAO/Repository 

개념 주 역할 쓰임 예시 
DTO 데이터 전달 주로 프론트와 주고받는 데이터 형식을 유연하게 조절하기 위해 사용됨  TripCreateRequest,
TripResponse
DAO / Repository DB 접근 (SELECT, INSERT 등) DB 로직과 도메인 로직을
깔끔하게 분리하기 위해
TripRepository.findById()

1) DTO = Data Transfer Object, 데이터 전송 객체 

  • DTO는 기능은 없고 데이터를 전달만 하는 용도로 사용되는 객체를 뜻한다.
  • DTO에 기능이 있으면 안되는가? 그것은 아니다. 객체의 주 목적이 데이터를 전송하는 것이라면 DTO라 할 수 있다.
  • 객체 이름에 DTO를 꼭 붙여야 하는 것은 아니다. 대신 붙여두면 용도를 알 수 있다는 장점은 있다.
    참고로 이런 규칙은 정해진 것이 없기 때문에 해당 프로젝트 안에서 일관성 있게 규칙을 정하면 된다.

2)DAO/Repository = DB 접근을 위한 구조

  • 도메인 객체를 DB에 저장하거나 조회하는 역할
  • 이때 사용하는 건 보통 도메인 객체(Entity)
  •  DB와 비즈니스 로직 사이의 경계를 만들어준다. 
  •  

정리하면 

도메인은 프로젝트에서 핵심이 되는 기능, 개념의 묶음이고 (여행, 멤버, 예약 등)
그 도메인 안에서 Entity, VO 등을 이용해서 도메인 로직을 구현하는 구조이다. 

도메인 = 프로젝트 내 핵심 기능, 개념 
└──→ Entity = 주연 배우 (DB와 연결된 핵심 객체)
└──→ VO = 조연 배우 (그 안에서 쓰이는 불변값 객체)
└──→ DTO, Repository, Service = 스태프들 (프론트 연동, DB 연동, 비즈니스 로직 구현 등)