본문 바로가기
Spring과 진짜 초면인 우리들에게

DDD 설계에서 빼놓을 수 없는 삼총사! Entity & DTO & VO

by eddy0223 2023. 4. 5.
Spring과 진짜 초면인 우리

 

 

DDD 설계에서 빼놓을 수 없는 삼총사가 있죠!

바로바로바로~

Entity vs DTO vs VO

이미지 출처: https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html

 

Entity, DTO, VO는 소프트웨어에서 데이터 모델링을 할 때 사용하는 객체이죠!

각각에 대한 개념 / 특징 / 예시를 한번 살펴보도록 할게요~

 

  1. Entity
    • 개념: 데이터베이스에서 영속적으로 저장되는 실제 데이터를 나타내는 객체
    • 특징: 고유한 식별자가 있고, 데이터를 변경하는 메서드를 가지며, 비즈니스 로직을 포함할 수 있다
    • 예시: 회원, 상품, 주문 등
  2. DTO (Data Transfer Object)
    • 개념: 여러 개의 값을 가지고 있으며, 서로 다른 시스템 또는 계층 간의 데이터 교환에 사용되는 객체
    • 특징:비즈니스 로직을 가지고 있지 않으며, 데이터 전송을 목적으로 설계되어 수정 가능한 속성을 가진다
    • 예시: 회원 가입을 위한 입력 데이터 객체, 상품 정보를 담는 객체 등
  3. VO (Value Object)
    • 개념: 값 그 자체로 의미가 있는 객체로, 변경 불가능한 값 객체
    • 특징: 불변성을 가지며, 두 개 이상의 속성을 하나의 불변 객체로 묶어서 사용한다
    • 예시: 날짜, 시간, 주소 등

Entity 데이터베이스와의 연동이 필요한 경우,

DTO 서로 다른 시스템 또는 계층 간의 데이터 교환에 사용되는 경우,

VO 값의 불변성과 함께 속성을 묶어 사용해야 하는 경우에 사용됩니다!

 

각각의 객체는 서로 다른 목적과 특징을 가지고 있으니,, 객체를 적절하게 활용하여 소프트웨어를 설계하는 것이 중요하겠네요~!

 

(아래에 예시 코드도 궁금할때 한번 슥~ 둘러보아요)


Entity 예시

 

import javax.persistence.*;

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;

    @Column(nullable = false)
    private String name;

    protected Book() {
    }

    public Book(String name) {
        if (name == null || name.isBlank()) {
            throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다", name));
        }
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

DTO 예시

package ..dto.book.request;

public class BookCreateRequest {

    private String name;

    public String getName() {
        return name;
    }
}

VO 예시

public class Address {
    private final String city;
    private final String street;
    private final String zipcode;

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    // Getter
}