개발끄적

VO DTO Entity 개념과 차이점

누구세연 2023. 11. 11. 17:05

VO, DTO, Entity는 소프트 웨어 개발에서 데이터를 표현하고 다루는 데 사용되는 세 가지 패턴입니다.

항상 사용하고 있지만 정확한 개념과 차이점을 알고 사용하는 것이 좋을 것 같아 정리해 보았습니다.

 

VO (Value Object)

소프트웨어 개발에서 특정 값을 나타내는 객체입니다. 주로 불변(immutable)하게 설계되어 있어서 한 번 생성된 후에는 값을 변경할 수 없습니다. 이는 객체의 안정성과 일관성을 유지하고자 하는 목적에서 나온 개념입니다.

 

VO는 주요 특징은 다음과 같습니다.

  • 불변성(Immutable)
    VO는 한 번 생성되면 값을 변경할 수 없습니다. 이는 값의 일관성과 안정성을 보장하며, 예측 가능한 동작을 제공합니다.
  • 종속성(Dependabillity)
    VO는 값을 나타내는 객체로 주로 특정 비즈니스 규칙에 종속됩니다. 예를 들어, 날짜, 금액, 좌표 등이 값 객체의 예시입니다.
  • 동일성 기반 동등성(Equivalence Based on Identity)
    VO는 주로 값이 같으면 동일하고 간주됩니다. 따라서 두 VO 객체가 같은 값을 가지면, 두 객체는 동일한 것으로 간주됩니다.
  • 비즈니스 의미 부여(Meaningful Business Value)
    VO는 특정 비즈니스 의미를 가진 값을 나타내기 위해 사용됩니다. 예를 들어, 금액 객체는 특정 금전의 양을 나타냅니다.

아래는 Java에서의 간단한 VO의 예시입니다.

public class Money {
    private final int amount;

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

    public int getAmount() {
        return amount;
    }

    // 다른 메서드들...
}

이 예시에서 Money 클래스는 불변성을 가진 값 객체입니다. amount 필드는 한번 설정되면 변경될 수 없고 getAmount 메서드를 통해서만 값을 얻을 수 있습니다. 이렇게 값 객체를 사용하면 코드의 가독성이 좋아지고, 데이터의 일관성을 유지하는데 도움이 됩니다.

 

 

DTO

소프트웨어 개발에서 주로 계층 간 데이터 전달을 위해 사용되는 객체입니다. 

DTO는 비즈니스 로직을 포함하지 않고, 주로 데이터 전송을 위한 목적으로 사용됩니다. 

이는 서로 다른 시스템이나 레이어 간에 데이터를 전송할 때 사용되는 객체로, 데이터를 캡슐화하고 전달하는 데 중점을 둡니다.

 

DTO의 주요 특징은 다음과 같습니다.

  • 비즈니스 로직의 부재
    DTO는 주로 데이터 전송을 위한 목적으로 사용되기 때문에, 비즈니스 로직을 담고 있지 않습니다. 
    데이터를 담고 전송하기 위한 필드들로 이루어져 있습니다.
  • 데이터 전송을 위한 구조
    주로 여러 필드를 가지고 있고, 이 필드들은 다른 시스템 또는 계층 간에 데이터를 전송하는 데 사용됩니다.
  • 가변성
    DTO는 주로 가변 한 형태를 가지며, 필요에 따라 데이터 전송을 위한 구조가 변경될 수 있습니다.
  • 클라이언트-서버 또는 서비스 간 데이터 전송
    주로 클라이언트와 서버 간 또는 서비스 간에 데이터를 주고받을 때 사용됩니다.

아래 Java에서의 간단한 DTO의 예시입니다.

public class UserDTO {
    private String username;
    private String email;

    // 간단한 생성자, 게터, 세터 등...

    // 다른 메서드들...
}

이 예시에서 UserDTO 클래스는 사용자 정보를 전송하기 위한 목적으로 사용되는 데이터 전송 객체입니다.

필드로는 사용자의 이름(username)과 이메일(email)이 있으며, 비즈니스 로직을 담고 있지 않습니다.

주로 웹 요청이나 응답, 서비스 간 데이터 교환 등에 사용됩니다.

 

Entity

소프트웨어에서 데이터베이스에 저장되고 관리되는 객체를 주로 나타냅니다.

주로 데이터베이스의 테이블과 매핑되어 데이터베이스에서 행으로 표현됩니다.

 

Entity의 주요 특징은 다음과 같습니다.

  • 지속성(Persistence)
    일정한 기간 동안 존재하며, 데이터베이스에 저장되어야 합니다. 따라서 애플리케이션이 종료되거나 데이터베이스가 리셋되더라도 데이터가 유지됩니다.
  • 유일성(Identity)
    각 Entity는 유일한 식별자를 가지고 있어야 합니다. 이를 통해 애플리케이션 내에서 특정한 Entity를 구별할 수 있습니다.
  • 데이터와 비즈니스 로직
    데이터 : Entity는 주로 데이터를 표현하기 위해 사용됩니다. 예를 들어, 사용자 정보, 주문 정보 등이 Entity로 표현될 수 있습니다.
    비즈니스 로직 : Entity는 종종 비즈니스 로직을 가지기도 합니다. 예를 들어, 주문이나 사용자 정보를 다루는데 필요한 특정 동작들이 이에 해당합니다.
  • 생명주기(Lifecycle)
    Entity는 일정한 생명주기를 가집니다. 생성, 수정, 삭제 등의 동작에 따라 데이터베이스에 영향을 주며, 이를 통해 데이터의 변화를 추적할 수 있습니다.

예를 들어 Java에서 JPA(Java Persistence API)를 사용한 Entity 클래스 예시입니다.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

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

    private String username;
    private String email;

    // 생성자, 게터, 세터, 비즈니스 로직 등...

    // Getter와 Setter 메서드는 데이터베이스와 객체 간의 상호작용을 도와주는 역할을 합니다.
}

이 예시에서 User 클래스는 @Entity 어노테이션을 통해 JPA에게 이 클래스가 데이터베이스의 테이블과 매핑된다는 것을 알려줍니다.

@Id 어노테이션은 이 클래스 id 필드가 데이터베이스에서 Primary Key 역할을 한다는 것을 나타냅니다.

 

 

VO vs DTO vs Entity

  VO DTO Entity
목적 주로 값을 나타내기 위해 사용되며, 주로 불변성과 값의 안정성을 강조합니다.
비즈니스 로직을 가지지 않습니다.
계층 간 데이터 전송을 위해 사용되며, 주로 가변성을 가집니다.
비즈니스 로직을 가지지 않고, 데이터 전송에 중점을 둡니다.
데이터베이스에 저장되고 관리되는 객체로 비즈니스 로직을 가질 수 있습니다.
주로 데이터베이스 테이블과 매핑됩니다.
불변성 여부 불변(Immutable)하며, 한 번 생성된 후에는 값을 변경할 수 없습니다. 주로 가변하며, 데이터 전송을 위한 목적으로 사용되므로 변경이 가능합니다. 객체의 상태가 변경될 수 있으며, 데이터베이스의 상태와 일치시키기 위해 업데이트 될 수 있습니다.
비즈니스 로직 포함 여부 주로 데이터의 값을 표현하기 위한 목적으로 사용되며 비즈니스 로직을 포함하지 않습니다. 비즈니스 로직을 포함하지않고 단순히 데이터 전송을 위한 목적으로 사용됩니다. 비즈니스 로직을 가질 수 있으며, 주로 데이터의 행동과 관련된 로직이 포함됩니다.
사용 용도 주로 값의 안정성을 필요로 하는 곳에서 사용됩니다.
예를 들어, 금액, 날짜, 좌표 등이 값 객체의 예시 입니다.
계층 간 데이터 전송이 필요한 곳에서 사용됩니다.
주로 서비스 간 데이터 교환, 웹 요청 및 응답에 사용됩니다.
데이터베이스에서 지속성을 가지는 객체로 데이터베이스 테이블과 매핑됩니다.
비즈니스 로직을 가지기도 합니다.

 

이러한 패턴들은 각자의 목적과 특징을 가지고 있어 소프트웨어를 구조화하고 다루는 데에 유용하게 활용됩니다.