0%

Java 개발에서 DTO와 VO

DTO와 VO?

Spring framework를 사용해서 개발을 하다 보면 DTO와 VO라는 것에 대해 한번쯤은 들어보게 됩니다.
이것에 대해 찾아보면 개념에 대한 설명도 많지만, 사용 범위나 사용 여부, 본질에 대한 투기장이 열리기도 합니다.

이번 포스팅에서는 무엇이 맞고 틀린 것에 대한 것보다는, VO와 DTO에 대한 개념을 정리하고 언제 어떻게 쓰는지, 저는 어떤 식으로 활용을 하는지에 대해서 알아보는 포스팅을 해보도록 하겠습니다.


VO(Value Object)

VO는 Value Object. 한글로는 값 객체로 해석되고 말 그대로 데이터를 담는 객체를 의미합니다.
특히 DB에서 한 테이블에 대한 컬럼들과 매칭하여 사용하는 것으로 많이 사용합니다.
Mybatis 등에서도 DAO(Data Access Object)에서 테이블에 대한 결과를 VO에 담아서 처리하는 방식을 많이 사용합니다.
Getter와 Setter 메서드를 통해서 값을 접근합니다.

보통 다음과 같이 VO를 사용합니다.(예시를 위해 DB의 Account라는 테이블의 값을 담는 VO를 예시로 들었습니다.)

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
public class AccountVo {
private int idx;
private String id;
private String pw;

public int getIdx() {
return this.idx;
}

public String getId() {
return this.id;
}

public String getPw() {
return this.pw;
}

public void setIdx(int idx) {
this.idx = idx;
}

public void setId(String id) {
this.id = id;
}

public void setPw(String pw) {
this.pw = pw;
}
}

DTO(Data Transfer Object)

VO는 DB에서 컬럼에 대한 매칭에 사용했다면, DTO는 이름과 같이 데이터 전송에 쓰이는 객체입니다.
View단에 사용하거나 다른 비즈니스 로직에 전송을 할 때 사용합니다.

간단한 예를 들어보면…
회원 정보를 보여주는 페이지에서 Account 라는 테이블의 idx, id, pw의 값 외에도 연락처, 이메일 등의 정보를 함께 전달해야 할 때 각각의 VO를 전달하게 되어 불필요한 정보 전달이 발생할 수 있습니다.
그래서 다음과 같이 DTO를 만들어 보낼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
public class MemberDto {
private int accountIdx;
private String id;
private String pw;

private String email;
private String phone;

//각 값에 대한 Getter & Setter 메서드
}

물론 여기서 저기 account 부분을 Vo 객체 자체를 넣고 진행할 수 도 있습니다.


VO와 DTO의 결론?

정리하면 다음과 같습니다.
예전에는 두 가지를 분명하게 나눠서 사용을 하였습니다.
하지만 최근에는 경계가 애매하여 근무하는 개발팀마다 용도를 정하고 그에 맞춰서 사용합니다.
또한 JPA를 사용할 때는 VO가 Jpa의 Entity 영역과 겹쳐서 VO를 다르게 사용하는 경우도 있습니다.