VO(Value Object), DTO(Data Transfer Object) 구분해서 사용하기.

들어가기

VO = Value Object, DTO = Data Transfer Object 사실 난 위 두형태의 클래스를 그저 도메인 단위의 데이터를 저장하는 용도로 여겼었다. 그리고 내가 경험한 프로젝트에는 보통 VO라는 명칭의 클래스를 사용했었다. (DTO라는 명명으로 클래스를 사용해 본적 없다.)

그러나 지금 내가 보고 있는 스프링 책에서는 이 VO와 DTO를 구분해서 사용하는데, 그 내용이 재미있어 정리해본다.


VO와 DTO를 구분해서 사용

VO와 DTO둘다 데이터를 저장하는 용도이다. 다만 각각 밀접한 영역을 구분해서 사용한다.

VO는 Database와 밀접하다. 즉 DB의 도메인정보를 클라이언트에게 전달할 때, 그 도메인단위 정보를 VO로 구현하여 사용한단다.

VO는 이렇게 DB에 밀접한 데이터를 클래스화할때 사용한다.

위처럼 예를들어 사용자 정보를 DB에서 가져오거나, 아니면 View로부터 사용자 정보를 가져와 DB에 저장할때 VO를 사용한다.(위 이미지가 화살표가 일방향이지만, 양방향 모두 가능하다.)

UserVO예제 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.hanumoka.sample.vo;

public class UserVO {

private String uid;
private String upw;
private String uname;
private int upoint;

public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUpw() {
return upw;
}
public void setUpw(String upw) {
this.upw = upw;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUpoint() {
return upoint;
}
public void setUpoint(int upoint) {
this.upoint = upoint;
}

@Override
public String toString() {
return "UserVO [uid=" + uid + ", upw=" + upw + ", uname=" + uname + ", upoint=" + upoint + "]";
}


}

하지만 DTO는 VO보다 조금 더 협소한 영역에서 사용한다.

LoginDTO는 로그인 요청이 뷰에서 컨트롤러로 전송될때 사용된다.

LoginDTO 예제소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.hanumoka.sample.dto;

public class LoginDTO {

private String uid;
private String upw;

private boolean useCookie;

public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUpw() {
return upw;
}
public void setUpw(String upw) {
this.upw = upw;
}
public boolean isUseCookie() {
return useCookie;
}
public void setUseCookie(boolean useCookie) {
this.useCookie = useCookie;
}

}

Login을 위한 데이터는 UserVO와 완벽히 일치하지 않는다. UserVO가 가진 맴버변수보다 적은 멤버변수를 갖을 수 있으며, UserVO에는 없는 추가적인 변수를 가질수도 있다. 이렇게 DB의 도메인과 일치하지 않으며, 어떤 로직에 사용되는 영속적이지 않는 데이터를 포함하는 클래스를 DTO클래스로 만들어서 사용한다. VO는 DB부터 View까지 양방향적으로 사용되는데 반해, DTO는 뷰에서 컨트롤러 방향으로 일방향 적으로 사용된다.

여태 난 VO 클래스에 DTO 를 합쳐서 사용했었다. 이렇게 VO와 DTO를 분리하면 관리해야 할 파일의 개수가 늘어나지만, 소스의 가독성과 목적성을 쉽게 파악하고 쓸대없이 전달되는 프로퍼티를 줄일 수 있는 장점이 있다.

참고자료

코드로 배우는 스프링 웹 프로젝트(구멍가게 코딩단)