DTO와 VO가 많은 개발자 사이에서 혼용되고 있다. 이 둘은 어떻게 다른지 어떤 용도로 사용하는지 알아보도록한다.

DTO(Data Transfer Object)

계층간의 데이터를 전달하기 위해 사용하는 객체다. 이 객체는 getter와 setter만 가질 수 있다. 다른 로직은 가질 수 없다. 데이터 전달만을 위한 객체이기떄문이다.

예시:

public class CrewDto {
	private String name;
	private String nickname;

	public String getName() {
		return name;
	}

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

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}

DTO를 불변객체로 만들어 레이어간의 전달 과정 중에 값이 변조되는 것을 방지할 수 있다.

public class CrewDto {
	private String name;
	private String nickname;

	public CrewDto(String name, String nickname) {
		this.name = name;
		this.nickname = nickname;
	}

	public String getName() {
		return name;
	}

	public String getNickname() {
		return nickname;
	}
}

이런 DTO를 사용하면 어떤 장점이 있을까?

  • 여러 데이터를 DTO 하나로 묶어서 보내어 네트워크 오버헤드를 줄일 수 있다.
  • DTO를 사용하지 않을 경우 View의 요구 사항이 수정되었을 때, 도메인의 내용을 수정하게 되고 그에따라 다른 클래스들에도 많은 영향을 준다. 하지만 DTO를 사용하면 이 DTO 클래스만 수정하면 된다.
  • 다른 레이어에서 필요없거나 사용하면 안되는 로직들을 숨길 수 있다.
  • 도메인의 Presentation을 위한 필드와 로직을 분리시켜서 관리할 수 있다.

VO(Value Object)

값 자체를 표현하기 위한 객체이다. 값이란 식별자를 가지지 않고 속성값이 모두 같으면 같은 객체라고 취급하는 개념이다. 예를들어 일상생활 속의 금액이나 시간 등이 있을 것이다. 값 그 자체를 나타내기 때문에 불변 객체가 된다. VO는 DTO와 다르게 로직을 가질 수 있다. 또한 동등성 검사가 이루어져야 되기 때문에 equals()hashCode()의 오버라이딩이 필요하다.

public class Money {
	private final int value;

	public Money(int value) {
		this.value = value;
	}

	public int getHalfValue() {
		return value / 2;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) {
			return true;

		}
		if (!(o instanceof Money)) {
			return false;

		}
	}

	@Override
	public int hashCode() {
		return Objects.hash(value);
	}
}

DTO vs VO

DTO와 VO는 둘 다 데이터를 보관하고 있다는 공통점때문에 많은 개발자들이 혼동을 한다. 아래의 표로 두 개념의 차이를 비교해본다.

제목 DTO VO
용도 레이어 간 데이터 전달 값 자체 표현
동등 결정 속성값이 모두 같다고 해서 같은 객체가 아니다 속성값이 모두 같으면 같은 객체다
가변/불변 setter 존재 시 가변, setter 비 존재 시 불변 불변
로직 getter/setter외의 로직을 갖지 않는다 getter/setter외의 로직을 가질 수 있다

참고 자료

https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html

태그:

카테고리:

업데이트:

댓글남기기