오늘은 DTO에 관하여 포스팅 한다.


DTO는 Data Transfer Object의 약자로서,


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


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


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



DTO란?



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

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

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




  위 클래스는 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는 리터럴 값 개념이다. (엄연히 말해서 리터럴을 흉내 낸것이지만)

'용어정리 > 프로그래밍용어' 카테고리의 다른 글

형상관리의 개념과 이유  (0) 2017.11.01
비즈니스 로직(Business Logic)이란?  (15) 2017.05.24
GET방식 과 POST방식  (32) 2016.12.10
컴포넌트(Component)란?  (8) 2016.10.20
URL 이란?  (2) 2016.06.14

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts