DTO 와 VO

Daniel·2023년 3월 15일
0

지금까지는

DTO객체 - 여러 계층을 넘나들며 데이터를 전달하는 객체
VO객체 - DB에서 값을 받는 객체, DB와 데이터 엑세스 계층을 넘나드는 객체 (DB에서 뽑아온 값을 넣는 객체)

라고 이해하고 사용해오다 이번 회사에서의 첫 프로젝트인 사내 프로젝트를 진행하며 조금 다르게 접근하는 방법을 경험해서 기록하고 좀 더 나은 방법을 찾아보고 공부하기위해 이 포스트를 작성한다.

DTO(Data Transfer Object)

애플리케이션의 계층 간에 전송해야 하는 데이터를 나타내는 간단한 POJO(Plain Old Java Object) 이다.

*POJO : 말 그대로 오래된 방식의 간단한 자바 오브젝트(EX.어떠한 것에 상속받지않고, 구현하지도 않으며, 어노테이션조차도 포함하고있지않은...)

DTO는 일반적으로 한 계층에서 다른 계층으로 데이터를 보내야 하고 수신 계층에서 데이터의 내부 표현을 노출하지 않으려는 경우에 사용

  • 오직 Getter/Setter 메소드만을 갖는다.

VO(Value Object)

When programming, I often find it's useful to represent things as a compound.
프로그래밍할 때, 사물을 복합물로 표현하는 것이 유용한 경우가 종종 있다.

A 2D coordinate consists of an x value and y value. An amount of money consists of a number and a currency. A date range consists of start and end dates, which themselves can be compounds of year, month, and day.
예를 들면 x, y로 이루어진 2차원 좌표를 표현하거나, 숫자와 통화로 이루어진 금액, 시작 날짜와 끝 날짜로 이루어진 날짜 기간 등이 있다.

-마틴 파울러-

위 마틴 파울러의 글에 따르면 즉, VO란 이렇게 도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체를 의미한다.
또한 특별한 로직을 포함 할 수 있으며, 객체의 불변성(객체의 정보가 변경되지 않는 것) 을 보장한다.

  • 객체의 불변성 : 서로 다른 이름을 갖는 VO 인스턴스를 가질 수 있다. 모든 속성이 같다면 두 인스턴스는 같은 객체임을 보장해야 한다.
    오버라이드된 equals(), hashCode()를 통해...전송과정에서 데이터가 변조되지 않음을 보장한다.

VO(Value Object)는 DTO와 유사하지만 일반적으로 애플리케이션의 동일한 계층 내에서 데이터를 전송 하는 데 사용된다.

VO(Value Object)는 데이터와 그 동작을 캡슐화하는 단순한 개체이지만 ID가 없습니다. ID가 있고 지속할 수 있는 엔터티와 달리 VO는 데이터를 전송하는 데 사용 되며 일반적으로 지속되지 않습니다.

  • Setter성격의 메소드는 포함하면 안되고, 생성자를 통해서만 값을 초기화해야 하고, 객체의 불변성(객체의 정보가 변경되지 않는 것)을 보장해야 한다!


위 간단한 정의를 요약하자면 DTO와 VO는 모두 응용 프로그램의 계층 간에 데이터를 전송하는 데 사용되지만 DTO는 일반적으로 서로 다른 계층 간에 사용되는 반면 VO는 단일 계층 내에서 사용된다는 말이다.

단일 계층에서 사용된다는 말이 무슨말이야?

VO가 일반적으로 단일 계층 내에서 사용된다는 것은 일반적으로 서로 다른 계층이 아닌 애플리케이션의 동일한 계층 내 구성 요소 간에 데이터를 전송하는 데 사용 된다는 의미이다.

예를 들어 프레젠테이션, 서비스 및 데이터 액세스 계층이 있는 3계층 아키텍처를 생각해보자. 프리젠테이션 계층은 DTO를 사용하여 데이터를 서비스 계층으로 전달할 수 있고, 서비스 계층은 VO를 사용하여 데이터 액세스 계층으로 데이터를 전달하고, 서비스 계층 내에서 데이터를 교환해야 하는 구성 요소는 데이터를 DTO로 변환하는 *오버헤드를 거치지 않고 VO를 사용하여 교환할 수 있다. 이렇게 하면 성능이 향상되고 애플리케이션 디자인이 간소화된다.

*OverHead : 프로그램의 실행흐름에서 나타나는 현상중 하나로 예를 들어 , 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상
즉, 특정 기능을 수행하는데 드는 간접적인 시간, 메모리 등 자원을 말한다.

이러한 방식으로 VO는 단일 계층 내에서 해당 계층 내의 구성 요소 간에 데이터를 전송하는 데 사용되는 반면 DTO는 다른 계층 간에 데이터를 전송하는 데 사용된다.

*구성요소 : 입력을 받고 처리를 수행하고 출력을 생성하는 블랙 박스로 생각할 수 있다.
특정 기능을 수행하기 위해 하나 이상의 메서드와 기타 데이터 구조, 변수 및 알고리즘을 포함

Note

  • 2023-02-09 발행

    사내 프로젝트를 하며 필드값을 들어온 다른 필드값에 의해 정해줘야하는 상황이 있었는데 내가 생각하는 VO객체와는 달라져서 이렇게 정리하고 다시보니 어떻게 해야 좀더 VO스럽게? 생성하고 사용해야하는지 알수있는 기회였다.

profile
응애 나 애기 개발자

0개의 댓글