스프링 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)**을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
---|---|
Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)> (0) | 2025.03.29 |
Spring 기초 <11. Spring Data JPA vs MyBatis 차이 및 선택 기준> (1) | 2025.03.28 |
Spring 기초 <10. Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)> (0) | 2025.03.27 |
Spring 기초 <8. Spring에서 RequestParam vs PathVariable 차이점> (0) | 2025.03.25 |
Spring 기초 <7. Spring Boot에서 REST API 개발 (GET, POST, PUT, DELETE)> (0) | 2025.03.24 |
Spring 기초 <6. Spring MVC 기본 개념과 동작 원리 (DispatcherServlet 구조)> (0) | 2025.03.23 |
Spring 기초 <5. Spring에서 @Component, @Service, @Repository, @Controller 차이> (0) | 2025.03.22 |