1. Question

Java에서 값 객체 VO(Value Object)란?

2. Answer

값 객체(Value Object, VO)는 자바에서 데이터를 전달하는 데 사용되는 객체로, 여러 속성을 하나의 객체로 묶어 표현한다. 값 객체는 주로 데이터를 전송하는 계층간의 통신에서 사용되며, DTO(Data Transfer Object)와 유사한 개념이지만, 불변성(Immutable)이라는 특성을 갖는 경우가 많다.

A. 값 객체의 특징

  • 불변성(Immutability): 값 객체는 생성 후 그 상태를 변경할 수 없어야 한다. 이는 객체가 안전하게 공유되고, 부수 효과(side-effects)없이 사용될 수 있도록 보장한다. 값을 변경하고 싶을 때는 새로운 값 객체를 생성해야 한다.

  • 동등성(Equivalence): 값 객체에서는 동일성(identity)가 아닌 동등성(Equivalence)을 기반으로 객체를 비교한다. 이는 객체가 메모리 상에서 같은 위치를 차지하는지(동일성)를 보는 것이 아니라, 객체가 가진 값들이 서로 같은지(동등성)를 평가하는 것을 의미한다. 따라서, 두 값 객체의 동등성을 올바르게 평가하기 위해서는 equals() 메서드와 hashCode() 메서드를 오버라이딩해야 한다.

  • 값의 묶음: 값 객체는 여러 값들을 하나의 단위로 묶어 표현한다. 예를 들어, 주소를 나타내는 값 객체는 거리, 도시, 우편 번호 등 여러 값을 포함할 수 있다.

  • 부작용 최소화: 불변 객체로서 값 객체는 함수형 프로그래밍 접근을 촉진하여, 애플리케이션 내에서 예기치 않은 부작용을 최소화한다.

B. 값 객체 예시 코드 (record)

public record Address(String street, String city, String zipCode) {}
  • 모든 필드에 대한 final 선언과 함께 private 접근 지정자가 기본적으로 적용된다.

  • 각 필드에 대한 public getter 메서드가 생성된다. (street(), city(), zipCode()와 같이 필드 이름과 동일한 메서드)

  • equals(), hashCode(), toString() 메서드가 자동으로 오버라이드되어, record의 모든 필드를 고려한 구현이 제공된다.

3. Detail

DTO(Data Transfer Object)VO(Value Object)는 자바에서 데이터를 처리하고 전송하는 데 사용되는 패턴이지만, 그들 사이에는 명확한 차이점이 있다.

A. DTO (Data Transfer Object)

DTO는 계층 간 데이터 전송을 위한 객체이다. 이는 보통 여러 계층(예: 프레젠테이션 계층과 비즈니스 로직 계층) 사이에서 데이터를 운반하는 데 사용된다. DTO는 단순히 여러 데이터 필드를 하나의 객체로 묶어서 전달하는 역할을 수행하며, 이 객체들은 일반적으로 로직을 포함하지 않고 순수한 데이터 필드와 그 데이터 필드에 접근할 수 있는 gettersetter 메서드를 포함한다.

  • 데이터 필드와 그 필드에 대한 접근 메서드(gettersetter)를 포함한다.

  • 특정 비즈니스 로직을 포함하지 않고 순수하게 데이터 전송에 사용된다.

  • 일반적으로 변경 가능하며, 불변성을 요구하지 않는다.

B. VO (Value Object)

VO는 데이터의 불변성에 더 큰 초점을 맞춘다. VO는 값 자체를 표현하기 위해 사용되며, 데이터가 객체를 통해 전달된 후에는 변경되지 않는다. VO는 동등성을 기반으로 비교되며, VO 인스턴스의 상태가 변경되는 것을 허용하지 않아 불변성을 강제한다.

  • 불변성을 가진다. 한 번 생성되면 그 상태가 변경되지 않는다.

  • 동등성에 기반하여 객체의 동일성을 평가한다. 즉, 객체의 내용이 같으면 두 객체는 동일하다고 간주한다.

  • 비즈니스 로직 내에서 값을 표현하는 데 사용되며, 여러 필드를 그룹화하여 하나의 단위로 사용한다.

C. DTO와 VO의 차이점

  • 변경 가능성: DTO는 변경 가능한 객체일 수 있으며, VO는 불변 객체이다.

  • 사용 목적: DTO는 데이터 전송에 중점을 두고 설계된 반면, VO는 값을 표현하는 데 중점을 둔다.

  • 로직 포함 여부: DTO는 단순히 데이터 전송을 위해 사용되며 로직을 포함하지 않는 반면, VO는 때때로 비즈니스 로직의 일부를 포함할 수 있다.

  • 동등성과 동일성: DTO는 주로 동일성(identity)에 기반해 비교되는 반면, VO는 동등성(equivalence)에 기반해 비교된다.

4. Reference

None

댓글남기기