Entity
▶ Entity의 개념
- 실제 DB의 테이블과 1:1로 매핑되는 핵심 클래스(객체)이며, DB의 테이블 내에 존재하는 칼럼만을 필드로 가져야 한다.
Entity를 기준으로 테이블 생성되고 스키마가 변경되며, Entity를 요청이나 응답값을 전달하는 클래스로 사용하면 안 되고
상속이나 구현체여서는 안된다!
▶ Entity의 특징
- id를 통해 각각 Entity를 구분
- 비즈니스 로직 포함 가능
- setter를 가지면 가변 객체로 활용가능 하지만 객체의 일관성을 유지해야 유지 보수성이 올라가기 때문에 setter 사용을 지양해야 한다.
▶ Entity 예시코드
DTO
▶ DTO의 개념
- DTO는 계층 간 데이터 교환을 위해 사용하는 객체이며 여러 레이어 사이에서 사용할 수 있다.
▶ DTO의 특징
- 주로 View와 Controller 사이에서 데이터를 주고받을 때 활용
- getter/setter 메서드를 포함하며, 비즈니스 로직은 포함 X
- setter를 가지는 경우 가변객체로 활용
- 생성자를 이용해서 초기화하는 경우 불변객체로 활용가능
▶ DTO 예시코드
VO
▶ VO 의개념
- VO(Value Object) 값 그 자체를 표현하는 객체이며, VO는 객체들의 주소가 달라도 값이 같으면 동일 객체이다.
▶ VO의 특징
- 객체의 불변성을 보장
- VO는 getter/setter메서드와 함께 비즈니스 로직도 포함가능
- 값 비교를 위해 equals()와 hashCode() 메서드를 오버라이딩 해야 한다.
▶ VO 예시코드
📌 Entity vs DTO vs VO 비교
구분 | Entity | DTO | VO |
생성 목적 | 데이터베이스 테이블 매핑 객체 | 레이어간 데이터 전송 객체 | 값 표현 객체 |
로직 포함 | 가능 | 불가능 | 가능 |
상태 변경 여부 | 가변 or 불변 객체 | 가변 or 불변 객체 | 불변 객체 |
getter 사용 | 가능 | 가능 | 가능 |
setter 사용 | 불가능 | 가능 | 가능 |
Spring Tier 범위 | Service <-> Repository | Controller <->Service Client <-> Controller |
Controller <->Service |