Java
VO: Value Object
정의
한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체
목적 및 특징
- 관련된 데이터를 묶어두지 않고 흩어놓게 되면, 각각 정보에 대한 정보를 외부에 공개해야 한다. 이는 객체지향의 중요한 특징 중 하나인 캡슐화를 깨트린다. 따라서 X값, Y값의 쌍으로 표현되는 2차원 좌표, 시작 날짜와 끝 날짜로 이루어진 기간 등을 VO로 묶어 표현할 수 있다.
- 자가 유효성 검사 (Self-Validation)
- 모든 유효성 검사는 생성 시간에 이루어져야 하며, 따라서 유효하지 않는 값으로 VO를 생성할 수 없다.
- Immutable(Read-Only) 특징
- 생성자로만 생성
- equals & hash code 메서드를 재정의해야함
- 객체가 포함하고 있는 속성값들을 기준으로 객체를 비교하는 동등성 비교를 통해 객체를 비교해야 한다.
- 속성값이 같은 객체는 같은 객체임을 보장하면서 VO를 사용할 수 있다.
예시
- 나이에 대한 처리시, 나이가 음수는 아닌지, 나이가 상식을 뛰어넘도록 큰 값을 (가령 21억) 가지고 있지는 않은지 등을 검사해야한다. → 로직으로 검증
비교군과의 차이
- DTO
- 레이어간 데이터 전송용
- Entity 객체를 보호하기 위함
- 값 변경 상관 없음
- VO
- 값 자체 표현용
- 값 변경 불가능
- 동등성 비교임
분류 | DTO | VO | Entity |
정의 | 레이어간 데이터 전송용 객체 | 값 표현용 객체 | DB 테이블 매핑용 객체 |
상태 변경 여부 | Y/N | N | Y/N |
로직 포함 여부 | N | Y | Y |