[Java] 값 객체 VO(Value Object)란?
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
는 단순히 여러 데이터 필드를 하나의 객체로 묶어서 전달하는 역할을 수행하며, 이 객체들은 일반적으로 로직을 포함하지 않고 순수한 데이터 필드와 그 데이터 필드에 접근할 수 있는 getter
및 setter
메서드를 포함한다.
-
데이터 필드와 그 필드에 대한 접근 메서드(
getter
및setter
)를 포함한다. -
특정 비즈니스 로직을 포함하지 않고 순수하게 데이터 전송에 사용된다.
-
일반적으로 변경 가능하며, 불변성을 요구하지 않는다.
B. VO (Value Object)
VO
는 데이터의 불변성에 더 큰 초점을 맞춘다. VO
는 값 자체를 표현하기 위해 사용되며, 데이터가 객체를 통해 전달된 후에는 변경되지 않는다. VO
는 동등성을 기반으로 비교되며, VO
인스턴스의 상태가 변경되는 것을 허용하지 않아 불변성을 강제한다.
-
불변성을 가진다. 한 번 생성되면 그 상태가 변경되지 않는다.
-
동등성에 기반하여 객체의 동일성을 평가한다. 즉, 객체의 내용이 같으면 두 객체는 동일하다고 간주한다.
-
비즈니스 로직 내에서 값을 표현하는 데 사용되며, 여러 필드를 그룹화하여 하나의 단위로 사용한다.
C. DTO와 VO의 차이점
-
변경 가능성:
DTO
는 변경 가능한 객체일 수 있으며,VO
는 불변 객체이다. -
사용 목적:
DTO
는 데이터 전송에 중점을 두고 설계된 반면,VO
는 값을 표현하는 데 중점을 둔다. -
로직 포함 여부:
DTO
는 단순히 데이터 전송을 위해 사용되며 로직을 포함하지 않는 반면,VO
는 때때로 비즈니스 로직의 일부를 포함할 수 있다. -
동등성과 동일성:
DTO
는 주로 동일성(identity
)에 기반해 비교되는 반면,VO
는 동등성(equivalence
)에 기반해 비교된다.
4. Reference
None
댓글남기기