DTO vs VO vs Entity

장선규·2023년 4월 25일
0

Spring

목록 보기
2/4

DTO (Data Transfer Object)

DTO는 데이터를 전달하기 위한 객체이다. 단순히 데이터를 주고받거나 전환하는 용도로 사용하기 때문에 로직을 갖지 않고 Getter/Setter 메소드만 갖는다.

public class MemberDto {
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Setter를 없애고 생성자를 이용하여 객체를 초기화하는 경우 불변객체로 사용할 수 있다. Setter가 없기 때문에 데이터 변조가 일어나지 않기 때문이다.

public class MemberDto {
    private final String name;
    private final int age;

    public MemberDto(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Lombok을 사용하면 훨씬 간단하게 DTO를 만들 수 있다.

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
public class MemberDTO {
    private String name;
    private int age;
}

VO (Value Object)

VO는 값 그 자체를 표현하는 객체이다. 비즈니스 로직을 포함할 수 있고, 객체의 불변성을 보장한다.
즉, 객체들의 주소가 달라도 모든 값이 같다면 동일한 것으로 여긴다는 뜻이다.

ex)
자동차A (가격: 1000, 생산일: 20230425)
자동차B (가격: 1000, 생산일: 20230425)
자동차C (가격: 2000, 생산일: 20230425)
이 상황에서 서로 다른 두 객체인 자동차 A,B는 동일하다고 보는 것

VO는 Getter와 함께 비즈니스 로직도 포함할 수 있지만, Setter는 가지지 않는다. 그리고 값 비교를 위해 equals()hashCode() 메소드를 오버라이딩 해야한다.

public class Car {
    private final int price;
    private final String date;

    public Car(int price, String date) {
        this.price = price;
        this.date = date;
    }
	
    public int getPrice() {
        return price;
    }
    
    public String getDate() {
        return date;
    }

   
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return price == car.price && Objects.equals(date, car.date);
    }

    @Override
    public int hashCode() {
        return Objects.hash(price, date);
    }
}

Entity

Entity는 DB테이블과 매핑되는 클래스이다. id를 통해 각각의 Entity를 구분할 수 있고, 비즈니스 로직을 포함할 수 있다.

  • 주의) Entity를 기준으로 테이블이 생성되고 스키마가 변경되므로, Entity를 요청이나 응답값을 전달하는 클래스로 사용해선 안 된다.

다음은 JPA를 사용한 Entity 예제 코드이다.

import javax.persistence.*;

@Entity
public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   privae Long id;
  
   @Column(nullable = false)
   private String name;
  
   @Column(nullable = false)
   private String email;
  
   @Builder
   public User(String name, String email) {
      this.name = name;
      this.email = email;
   }
  
   public User update(String name, String email) {
      this.name = name;
      this.email = email;
      return this;
   }
}

Reference

https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
https://youngjinmo.github.io/2021/04/dto-vo-entity/

profile
코딩연습

0개의 댓글