본문 바로가기
공부/Java

DTO와 VO 비교

by JERO__ 2022. 3. 17.

결론 먼저!

  • DTO : 데이터 전달
  • VO : 값 표현

1. DTO

  • Data Transfer Object
  • 데이터를 전달하기 위해 사용하는 객체
  • 데이터를 담아서 전달하는 바구니
  1. DTO 특징
    • 오직 getter/setter 메서드만 갖는다.
      • Setter를 삭제하고 생성자로 받기!
    • 다른 로직을 갖지 않는다.
  2. DTO 예시
  • Dto 클래스
public class CrewDto{
		private final String name;
    private final String nickName;

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

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}
  • Service Layer 메소드
public CrewDto createNewCrew() {
    String newName = "공재호";
    String newNickName = "zero";

    CrewDto crewDto = new CrewDto();
    crewDto.setName(newName);
    crewDto.setNickName(newNickName);

    return crewDto;
}
  • Web Layer(Controller) 메소드
public String createNewCrew() {
    CrewDto newCrewDto = sampleService.createNewCrew();
    String nameOfNewCrew = newCrewDto.getName();
    String nickNameOfNewCrew = newCrewDto.getNickName();
    return nameOfNewCrew + nickNameOfNewCrew;
}
  1. Entity Class와 DTO Class를 꼭 분리해서 사용하기
    • View에 DTO Class를 통해 객체를 전달한다.

2. VO

  • Value Object
  • 값 그 자체를 표현하는 객체
  1. 특징
    • 다른 함수를 가질 수 있다.
    • equals()와 hashCode()를 오버라이딩해 값을 통해 비교하도록 한다.
  2. 예시
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 == null || getClass() != o.getClass()) {
            return false;
        }
        Money money = (Money) o;
        return value == money.value;
    }

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

DTO vs VO

DTO VO

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

댓글