Develop/Coding

DTO, VO, Entity, POJO 의 특징과 차이점

junu24 2024. 11. 30. 20:14

 

1. DTO (Data Transfer Object)

정의:

  • 데이터 전송 객체로, 계층 간 데이터 전송을 목적으로 사용됩니다.
  • 주로 컨트롤러와 서비스 간, 또는 외부 API와 데이터를 주고받을 때 사용됩니다.
  • 비즈니스 로직은 포함하지 않으며, 데이터 구조와 Getter/Setter만 포함됩니다.

특징:

  • 역할: 데이터를 캡슐화하여 네트워크 또는 계층 간에 전송.
  • 변경: 전송 과정에서만 사용되므로 유연하게 설계 가능.
  • 목적: 필요한 데이터만 담아 과도한 데이터 전송 방지.

예시 코드:

@Getter
@Setter
public class UserDTO {
    private String name;
    private String email;

    // 기본 생성자
    public UserDTO() {}

    // 생성자
    public UserDTO(String name, String email) {
        this.name = name;
        this.email = email;
    }

}

용도:

  • 클라이언트 요청 데이터를 받아 처리하거나, 응답 데이터를 전달할 때 사용.

2. VO (Value Object)

정의:

  • 값 객체로, 고정된 데이터(immutable)를 표현합니다.
  • 상태를 변경하지 않으며, 주로 값의 동등성(equality)을 비교하기 위해 사용됩니다.

특징:

  • 역할: 읽기 전용 데이터 표현.
  • 불변성: 생성 후 값이 변경되지 않음.
  • 목적: 특정 값을 논리적으로 그룹화하거나 표현.

예시 코드:

@Getter
public class AddressVO {
    private final String street;
    private final String city;

    // 생성자
    public AddressVO(String street, String city) {
        this.street = street;
        this.city = city;
    }

    // equals와 hashCode 구현 (값 비교를 위함)
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        AddressVO address = (AddressVO) obj;
        return street.equals(address.street) && city.equals(address.city);
    }

    @Override
    public int hashCode() {
        return Objects.hash(street, city);
    }
}

용도:

  • 특정 값들을 묶어서 사용해야 할 때.
  • 주소, 돈, 날짜와 같은 불변 객체 표현.

3. Entity

정의:

  • 데이터베이스 테이블과 1:1 매핑되는 클래스.
  • JPA 또는 Hibernate와 같은 ORM(Object-Relational Mapping) 프레임워크에서 사용.

특징:

  • 역할: DB와 직접적으로 매핑되는 데이터 구조.
  • 변경: 데이터베이스 상태를 반영해야 하므로 가변 객체로 설계.
  • 목적: DB 작업(Create, Read, Update, Delete)에 활용.

예시 코드:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;

@Getter
@Setter
@Entity // JPA 엔티티 클래스임을 표시
public class UserEntity {
    @Id // 기본 키 필드
    @GeneratedValue // 자동 생성되는 키
    private Long id;
    private String name;
    private String email;

    // 기본 생성자 (JPA 요구)
    public UserEntity() {}

    // 생성자
    public UserEntity(String name, String email) {
        this.name = name;
        this.email = email;
    }

}

용도:

  • 데이터베이스와 연동되어 데이터를 저장하거나 조회하는 데 사용.
  • 비즈니스 로직은 포함하지 않음.

4. POJO (Plain Old Java Object)

정의:

  • 순수한 자바 객체로, 특정 프레임워크나 라이브러리에 의존하지 않는 객체.
  • 특별한 애노테이션이나 상속이 필요하지 않음.

특징:

  • 역할: 단순한 데이터 구조 표현.
  • 변경: 자유로운 설계 가능.
  • 목적: 복잡한 종속성을 피하고 간단하게 데이터를 저장.

예시 코드:

@Getter
@Setter
public class Product {
    private String name;
    private double price;

    // 기본 생성자
    public Product() {}

    // 생성자
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

}

용도:

  • 간단한 데이터 저장, 비즈니스 로직과 무관한 객체.

차이점 요약

구분 DTO VO Entity Pojo
역할 데이터 전송 값 표현 DB 매핑 단순 객체
가변성 가변 불변 가변 가변
종속성 프레임워크 종속적 독립적 ORM 종속적 독립적
예시 요청/응답 데이터 주소, 돈 등 사용자, 상품 등 단순 데이터 저장 객체
반응형