백문이불여일타

DTO, VO 차이점 본문

Java

DTO, VO 차이점

퇴근각 2019. 7. 19. 13:18

DTO는 Data Transfer Object의 약자로서,

VO ( Value Object )랑 혼용해서 쓴다.

보통은 DTO와 VO를 혼용해서 사용들 하지만,

필자는 용어를 정확히 구분해서 쓰는걸 중요하다고 생각한다.

 

 

DTO란?


 

풀 명칭에서 유츄 할 수 있드시, 데이터를 오브젝트로 변환하는 객체이다. 

중요한 것은 주체가 누구인가를 아는 것이 중요하다.

Data Transfer Object에서 Object는 우리가 만드는 DTO 클래스이다. PersonDTO를 예를들자면, 아래와 같다.

 

class PersonDTO{
 private String name;
 private int age;

 public void setName(String name){
  this.name = name; 
}

 public String getName(){
  return this.name; 
}

 public void setAge(int age){ 
  this.age = age; 
}

 public int getAge(){
  return this.age;
  
 } 
 
}

 

위 클래스는 name, age 필드에 데이터를 쓰고/읽는 역할인 setter/getter가 존재한다. 
여기서 중요한건 Property(프로퍼티) 개념이다. C#은 Property 개념을 문법으로써 제공해준다. 
윗 클래스를 C#에서는 간단하게 public int Name{ set; get; } 과 같이 간단하게 표현 할 수 있다. 

C# 예시 에서의 Property는 Name이다.  하지만 자바에서 Property는 문법적으로 제공되지 않는다. 

자바에서, 프로퍼티라는 개념을 사용하기 위해 우리는 지켜야 할 약속이 있다. 

setter/getter에서 set과 get 이후에 나오는 단어(또는 단어들)가 property라고 약속한다.

따라서, 윗 클래스에서의 프로퍼티는 name과 age이다. 

중요한 점은 프로퍼티는 멤버변수 name,age로 결정되는 것이 아닌 getter/setter에서의 name과age임을 명심해야한다.

다른 말로 하자면 멤버변수의 변수명은 아무렇게나 지어도 영향이 없고 setter/getter로 프로퍼티를 표현 한다는 의미이다. 

 

이러한 프로퍼티 개념을 왜 설명하냐면, DTO에 들어갈 데이터 셋팅 때문이다.

자바는 다양한 프레임워크에서 데이터 자동화 처리를 위해 리플렉션 기법을 사용한다.

데이터 자동화 처리에서 제일 중요한것은 표준규격이다.

예를 들어, 윗 클래스 DTO에서 property가 name,age면 name, age의 키값으로 들어온 데이터는 리플렉션 기법으로 setter를 실행시켜 데이터를 넣을 수 있다. 중요한 것은, 우리가 setter를 요청하는 것 이 아닌, 프레임워크단(우리눈에 안보이는)에서 setter가 실행된다는 점이다.

그로 인하여, Layer간(쉽게 한가지 예를 들자면, 서버 코딩 -> view 코딩)에 데이터를 넘길때는 DTO를 쓰면 편하다는 것이다.  

데이터가 자동적으로 클래스화가 된다는 것이다.

 

한가지 더 예를 들자면,

form 에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 , 값을 받아야할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 PersonDTO를 자료형으로 값을 받을 수 있다는 것이다.

 

결론적으로, key & value로 존재하는 데이터는 자동화 처리된 DTO로 변환되여 우리는 손 쉽게 데이터가 셋팅된 오브젝트를 받을 수 있다. 우리가 흔히 마주치는 JSP에서 JavaBeans 또한 표준규격 DTO며, json 조차도 프로퍼티 규격만 잘 지킨다면, 얼마든지 편하게 DTO로 받을 수 있다.

 

 

VO란?


 

DTO와 마찬가지로 풀 명칭에서 유추 할 수 있드시, 값 오브젝트이다.

값 오브젝트는 말 그대로 값을 위해 쓰는것이다. 

자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다. 

불변 클래스라 하면, readOnly 특징을 가진다.

예를 들자면 String,Integer,Color 클래스등이 있다. 

이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다. 

Color 클래스를 예로 들어 설명 해보자면, Red를 표현 하기 위해서는 Color.RED등 과 같이 값을 표현하기 위해 getter 기능만이 존재한다.

 

왜 DTO랑 VO랑 혼용해서 사용할까?


 

필자의 주관적인 생각이지만, 관용적으로 잘못 쓰이는 표현이지 않나 싶다. 

DTO도 VO도 결론적으로는, 직접 데이터를 넣어주기 보다는 넣어진 데이터를 getter를 통해 사용하므로 주 목적은 같다. 하지만 앞서 설명했드시, DTO는 불변 클래스 성격과는 거리가 멀다.

또한, DTO는 인스턴스 개념이고 VO는 리터럴 값 개념이다.

(엄연히 말해서 리터럴을 흉내 낸것이지만)



출처: https://mommoo.tistory.com/61 

Comments