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

면접 질문

  • VO의 특징
  • DTO VS VO