Coding History

VO, DTO, Entity의 차이점

BlackBirdIT 2024. 9. 9. 02:32

최근 내 개인프로젝트를 준비하면서 mybatis를 버리고 JPA 도입했다. 그 과정에서 객체를 담당하는 클래스를 VO에서 Entity로 바꾸는 과정이 있었는데, 솔직히 암만 봐도 같은 기능인데 차이점이 뭐길래 이름을 바꾸는가 궁금해서 알아왔다.

1. VO (Value Object)

정의

  • VO(Value Object)는 값 그 자체를 표현하는 객체. 동일한 값을 가지고 있으면 동일한 객체로 취급됨. 불변성을 보장하며, 값 자체를 비교하기 때문에 객체의 ID나 참조가 아닌 내용으로 동일성을 판단한다.

주요 특징

  • 불변성: VO는 생성 후 상태가 변하지 않는다. 값을 수정하려면 새로운 VO 객체를 생성해야 한다.
  • 동일성 판단: VO는 객체의 상태(값)가 동일하면 같은 객체로 간주된다.
  • 비즈니스 로직 포함 가능: VO는 값과 관련된 비즈니스 로직을 포함할 수 있다.
  • 사용 예: 좌표(Point), 돈(Money), 날짜(Date) 등

예시 코드

public class Money {
    private final int amount;

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

    public int getAmount() {
        return amount;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Money money = (Money) o;
        return amount == money.amount;
    }

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

2. DTO (Data Transfer Object)

정의

  • DTO는 계층 간 데이터를 전송하기 위한 객체. 주로 Controller와 Service 간 또는 외부 API 간의 데이터를 주고받기 위한 목적으로 사용된다. 순수한 데이터의 전달이 목적이므로, 비즈니스 로직을 포함하지 않는다.

주요 특징

  • 가변성: 데이터를 전달하는 목적으로 생성되며, 데이터를 담고 보내는 객체이기 때문에 값이 변경될 수 있다.
  • 로직 없음: DTO는 비즈니스 로직을 포함하지 않고, 오직 데이터 전달의 역할만 수행한다.
  • 직렬화 가능: 데이터를 외부로 전송하기 위해 직렬화(Serialization)되어 사용된다.
  • 사용 예: API 요청/응답 데이터, 뷰와 데이터 전달 객체 등

예시 코드

public class UserDTO {
    private String name;
    private int age;

    public UserDTO(String name, int age) {
        this.name = name;
        this.age = 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;
    }
}

3. Entity

정의

  • Entity는 데이터베이스 테이블과 매핑되는 객체로, 영속성을 가지며, JPA(Entity Framework) 등을 통해 데이터베이스와 직접적으로 상호작용하는 객체다. Entity는 고유한 식별자를 가지며, 동일성은 주로 ID를 기준으로 판단된다.

주요 특징

  • 식별자(ID) 존재: Entity는 고유한 식별자를 가지며, 이를 통해 동일성을 판단한다.
  • 가변성: 필요에 따라 상태를 변경할 수 있으며, 데이터베이스에 반영된다.
  • 영속성: 데이터베이스와 연결되어, 데이터의 생성, 수정, 삭제가 가능하다.
  • 사용 예: User, Order, Product 등의 데이터베이스 테이블과 매핑되는 클래스

예시 코드 (Java)

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int age;

    // Getters and Setters
}

요약

  • VO: 값 그 자체를 표현하는 객체로, 불변성을 가집니다. 동일성은 값에 기반한다.
  • DTO: 계층 간 데이터 전송을 위한 객체로, 비즈니스 로직 없이 데이터 전달에 초점이 맞춰져 있다.
  • Entity: 데이터베이스와 직접적으로 매핑되며, 고유한 식별자를 가지는 객체로, 영속성을 가진다.

뭐 알고 보니까 결국 따지고 보면 같은 기능이라고 느껴지긴하지만 타인이 코드를 볼 때, 의도를 조금 더 구분하기 쉬우려고하는 목적이 있는 것 같다.