도메인, Entity, VO / DTO, DAO, Repository
2025. 5. 28. 15:23ㆍProjects/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 연동, 비즈니스 로직 구현 등)