DTO와 VO, 아주 쉽게 알아보기
DTO (Data Transfer Object) 와 VO (Value Object) 란 무엇일까요?
DTO(Data Transfer Object) 와 VO(Value Object) 는 객체지향 프로그래밍에서 데이터를 담는 용도로 사용되는 객체입니다. 둘 다 비슷해 보이지만, 사용되는 목적과 특징이 조금 다릅니다.
간단히 말해,
- DTO: 데이터를 한 곳에서 다른 곳으로 이동시키는 역할을 합니다. 마치 우체부가 편지를 배달하는 것처럼, 데이터를 안전하게 전달하는 통입니다.
- VO: 특정한 값을 나타내는 객체입니다. 마치 '주소'라는 값 자체를 하나의 객체로 표현한 것처럼, 값 자체에 의미를 부여합니다.
좀 더 자세히 알아볼까요?
DTO
- 주요 목적: 데이터베이스에서 조회한 데이터를 화면에 표시하거나, 다른 시스템으로 전송하기 위해 사용됩니다.
- 특징:
- 데이터베이스 테이블의 구조와 유사하게 설계되는 경우가 많습니다.
- 불필요한 메소드를 포함하지 않고, 순수하게 데이터만 담습니다.
- 가변적일 수 있으며, setter/getter 메소드를 통해 값을 변경할 수 있습니다.
VO
- 주요 목적: 특정한 비즈니스 로직에서 사용되는 값을 표현합니다.
- 특징:
- 불변성을 가지는 경우가 많습니다. 즉, 한번 생성된 값은 변경되지 않습니다.
- equals() 메소드를 오버라이드하여 값 비교를 수행합니다.
- 비즈니스 로직에 따라 추가적인 메소드를 가질 수 있습니다.
예시를 통해 비교해 볼까요?
예시: 주문 정보
- DTO: 주문 목록을 조회할 때 사용되는 주문 정보 DTO
public class OrderDto {
private Long orderId;
private String customerName;
private List<OrderItemDto> orderItems;
// getter, setter
}
- VO: 주소 정보를 나타내는 주소 VO
public class AddressVo {
private String city;
private String street;
private String zipcode;
// 생성자에서 값을 초기화하고, getter만 제공
}
차이점:
- OrderDto: 주문 정보를 화면에 표시하거나, 다른 시스템으로 전달하기 위한 목적으로 사용됩니다. 데이터베이스의 Order 테이블과 유사한 구조를 가지고 있습니다.
- AddressVo: 주소라는 값 자체를 표현하며, 주문 정보에서 주소를 나타낼 때 사용됩니다. 불변성을 가지며, equals() 메소드를 오버라이드하여 두 주소가 같은지 비교할 수 있습니다.
왜 DTO와 VO를 사용할까요?
- 코드 가독성 향상: 각 객체의 역할이 명확해져 코드를 이해하기 쉽습니다.
- 유지보수성 향상: 데이터베이스 구조 변경 시 DTO만 수정하면 되므로 유지보수가 용이합니다.
- 재사용성 증가: VO는 다양한 곳에서 재사용될 수 있습니다.
- 안정성 향상: 불변성을 가진 VO는 예기치 않은 값 변경으로 인한 오류를 방지할 수 있습니다.
결론
DTO와 VO는 데이터를 다루는 방식에 따라 구분되는 개념입니다. 어떤 객체를 DTO로 만들고, 어떤 객체를 VO로 만들지는 개발 상황과 요구사항에 따라 달라질 수 있습니다.
핵심:
- DTO: 데이터 전달, 가변적
- VO: 값 표현, 불변성