IT Developer/Spring

Spring 기초 <9. Spring에서 DTO, Entity, VO의 차이 및 실무 적용법>

TEMA_ 2025. 3. 26. 13:23
반응형

스프링 Spring

9. Spring에서 DTO, Entity, VO의 차이 및 실무 적용법

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. DTO, Entity, VO란?

Spring 애플리케이션에서는 데이터를 다룰 때 DTO, Entity, VO를 활용하여 구조화된 데이터 관리를 수행
각 개념은 특정한 역할을 가지며, 목적에 따라 적절한 방식으로 사용해야 함

📌 DTO, Entity, VO의 개념 정리

개념역할주요 특징

DTO (Data Transfer Object) 계층 간 데이터 전송을 위한 객체 비즈니스 로직을 포함하지 않음, 가변(mutable) 객체
Entity 데이터베이스 테이블과 매핑되는 객체 JPA와 함께 사용되며, 비즈니스 로직 포함 가능
VO (Value Object) 불변(immutable)한 값 객체 동일한 값을 가지면 같은 객체로 취급

📌 DTO는 데이터를 주고받을 때 사용, Entity는 데이터 저장과 관련, VO는 변경되지 않는 값을 표현하는 데 사용됨.


2. DTO (Data Transfer Object) – 계층 간 데이터 전송

DTO는 컨트롤러와 서비스 계층 간 데이터 전송을 담당하는 객체
데이터를 가공하여 응답에 맞는 형태로 제공하는 역할

📌 DTO 클래스 예제

public class UserDTO {
    private Long id;
    private String name;
    private String email;

    public UserDTO(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Getter & Setter
}

UserDTO는 클라이언트에게 전달할 데이터를 가공하는 용도로 사용됨

📌 DTO의 특징
비즈니스 로직이 없음 → 단순히 데이터를 담는 역할
JSON 직렬화/역직렬화에 유리함 → API 응답 객체로 활용
도메인 모델(Entity)과 분리하여 사용 → 보안 및 유지보수성 향상

📌 DTO는 "컨트롤러와 서비스 계층 간의 데이터 전달을 위한 객체"


3. Entity – 데이터베이스와 매핑되는 객체

Entity는 데이터베이스의 테이블과 매핑되는 클래스이며, JPA를 활용하여 데이터베이스와 직접 연동
비즈니스 로직을 포함할 수 있으며, 영속성(Persistence)을 가짐

📌 Entity 클래스 예제

@Entity
@Table(name = "users")
public class User {

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

    private String name;
    private String email;

    // Getter & Setter
}

User 엔티티는 데이터베이스의 users 테이블과 매핑됨

📌 Entity의 특징
데이터베이스 테이블과 1:1 매핑
JPA에서 관리되며, 영속성 컨텍스트에 의해 생명주기가 결정됨
비즈니스 로직을 포함할 수 있음 (하지만 과도한 로직 포함은 지양해야 함)

📌 Entity는 "데이터베이스 테이블을 객체화하여 저장 및 조회할 수 있도록 하는 핵심 객체"


4. VO (Value Object) – 불변(Immutable)한 값 객체

VO는 값(데이터)의 불변성을 보장하는 객체
VO는 동일한 값을 가지면 같은 객체로 간주됨

📌 VO 클래스 예제

public class Money {
    private final int amount;
    private final String currency;

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

    public Money add(Money other) {
        if (!this.currency.equals(other.currency)) {
            throw new IllegalArgumentException("통화 단위가 다름");
        }
        return new Money(this.amount + other.amount, this.currency);
    }

    // Getter만 제공하여 불변성을 유지
}

Money VO는 금액과 통화를 나타내는 값 객체로, 불변성을 보장함

📌 VO의 특징
불변성을 유지하며 값이 변경되지 않음
같은 값을 가지면 동일한 객체로 취급됨
비즈니스 로직을 포함할 수 있음 (값 검증 등)

📌 VO는 "불변성을 보장하고, 값 자체의 의미를 가지는 객체"


✅ 여기까지 DTO, Entity, VO의 개념을 배웠습니다!
👉 "그렇다면, 실무에서는 이 객체들을 어떻게 사용할까?"
✅ 2부에서 DTO, Entity, VO의 실무 적용법을 배워봅시다!

반응형

 


 

2. 상세 주제 정리

 

1. DTO, Entity, VO를 함께 사용하는 방식

실무에서는 DTO, Entity, VO를 적절하게 조합하여 사용함

📌 DTO, Entity, VO의 사용 위치

계층사용 객체설명

Controller DTO 클라이언트 요청 및 응답 데이터 처리
Service DTO + Entity 서비스 로직 수행 및 데이터 가공
Repository Entity 데이터베이스와 직접 연결
Domain VO 도메인 모델에서 불변 데이터를 관리

📌 DTO는 계층 간 데이터 전달, Entity는 데이터 저장 및 조회, VO는 불변 데이터를 표현하는 역할


2. DTO와 Entity 변환 (Mapper 활용)

DTO와 Entity는 서로 변환하여 사용해야 함

📌 Entity → DTO 변환 예제 (ModelMapper 사용)

public class UserMapper {
    public static UserDTO toDTO(User user) {
        return new UserDTO(user.getId(), user.getName(), user.getEmail());
    }
}

Entity를 DTO로 변환하여 API 응답으로 사용

📌 DTO → Entity 변환 예제

public class UserMapper {
    public static User toEntity(UserDTO dto) {
        return new User(dto.getId(), dto.getName(), dto.getEmail());
    }
}

DTO 데이터를 Entity로 변환하여 데이터베이스에 저장 가능

📌 DTO와 Entity를 변환하면 "데이터 흐름을 명확하게 관리할 수 있음."


3. 실무에서 DTO, Entity, VO를 활용하는 예제

📌 DTO를 활용한 컨트롤러 예제

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {
        User user = UserMapper.toEntity(userDTO);
        User savedUser = userService.save(user);
        return ResponseEntity.ok(UserMapper.toDTO(savedUser));
    }
}

DTO를 사용하여 API 요청을 처리하고, Entity 변환 후 저장

📌 VO를 활용한 도메인 로직 예제

public class Order {
    private Money totalAmount;

    public Order(Money totalAmount) {
        this.totalAmount = totalAmount;
    }

    public void addAmount(Money amount) {
        this.totalAmount = this.totalAmount.add(amount);
    }
}

VO를 사용하여 금액 값을 안전하게 관리 가능

📌 실무에서는 "DTO와 Entity를 분리하고, VO를 사용하여 불변성을 유지하는 것이 좋은 설계 방식"


✅ 여기까지 DTO, Entity, VO의 차이와 실무 적용법을 배웠습니다!
👉 "그렇다면, Spring에서 CORS 설정 및 글로벌 예외 처리는 어떻게 할까?"
✅ 다음 회차에서 **Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)**을 배워봅시다!

 

 

반응형