새소식

JAVA 교육/Spring

DTO 와 VO 의 차이점

  • -

     오늘은 DTO와 VO에 관하여 알아보자

DTO는 Data Transfer Object의 약자로서,

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

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

두 약자가 어떻게 다른지 알아보고 가도록 하자

 

DTO란?


풀 명칭에서 유츄 할 수 있드시, 데이터를 오브젝트로 변환하는 객체이다. 
중요한 것은 주체가 누구인가를 아는 것이 중요하다.
Data Transfer Object에서 Object는 우리가 만드는 DTO 클래스이다. PersonDTO를 예를들자면, 아래와 같다.

 

package kr.co.basicspring.test03;

public class LoginVO { 	// Value Object

	private String id;
	private String pw;
	public LoginVO() {}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	@Override
	public String toString() {
		return "LoginVO [id=" + id + ", pw=" + pw + "]";
	}
}

 

 위 클래스는 id, pw 필드에 데이터를 쓰고/읽는 역할인 setter/getter가 존재한다.
여기서 중요한건 Property(프로퍼티) 개념이다. 자바에서, 프로퍼티라는 개념을 사용하기 위해 우리는 지켜야 할 약속이 있다. setter/getter에서 set과 get 이후에 나오는 단어(또는 단어들)가 property라고 약속한다.
따라서, 윗 클래스에서의 프로퍼티는 id과 pw이다.
중요한 점은 프로퍼티는 멤버변수 id,pw로 결정되는 것이 아닌 getter/setter에서의 id과pw임을 명심해야한다.
다른 말로 하자면 멤버변수의 변수명은 아무렇게나 지어도 영향이 없고 setter/getter로 프로퍼티를 표현 한다는 의미이다. 

 이러한 프로퍼티 개념을 왜 설명하냐면, DTO에 들어갈 데이터 셋팅 때문이다. 자바는 다양한 프레임워크에서 데이터 자동화 처리를 위해 리플렉션 기법을 사용한다. 데이터 자동화 처리에서 제일 중요한것은 표준규격이다. 예를 들어, 윗 클래스 DTO에서 property가 id,pw면 id, pw의 키값으로 들어온 데이터는 리플렉션 기법으로 setter를 실행시켜 데이터를 넣을 수 있다. 중요한 것은, 우리가 setter를 요청하는 것 이 아닌, 프레임워크단(우리눈에 안보이는)에서 setter가 실행된다는 점이다. 그로 인하여, Layer간(쉽게 한가지 예를 들자면, 서버 코딩 -> view 코딩)에 데이터를 넘길때는 DTO를 쓰면 편하다는 것이다.  데이터가 자동적으로 클래스화가 된다는 것이다. 한가지 더 예를 들자면,

form 에서 id 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 , 값을 받아야할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 id속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 LoginDTO를 자료형으로 값을 받을 수 있다는 것이다. 결론적으로, 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 [개발자로 홀로 서기]

 

DTO와 VO란?

오늘은 DTO에 관하여 포스팅 한다. DTO는 Data Transfer Object의 약자로서, VO ( Value Object )랑 혼용해서 쓴다. 보통은 DTO와 VO를 혼용해서 사용들 하지만, 필자는 용어를 정확히 구분해서 쓰는걸 중요하다고..

mommoo.tistory.com

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.