DTO(Data Transfer Object)
DTO(Data Transfer Object)는 개발 과정에서 자주 등장하는 개념으로, 데이터를 전달하기 위한 객체입니다. 주로 계층 간 데이터 교환을 목적으로 사용되며, 시스템을 설계할 때 중요한 역할을 합니다.
- 현대적인 애플리케이션은 컨트롤러, 서비스, 리포지터리 같은 여러 계층으로 나뉘어 동작합니다.
- 이 계층 간에 데이터를 주고받을 때, 직접적으로 데이터를 전달하는 것이 아닌 DTO를 사용하여 데이터를 캡슐화합니다.
DTO 활용 : 엔티티(Entity)
DTO를 활용하여 엔티티(Entity)에 있는 민감한 정보를 제외한 데이터를 전달할 수 있습니다.
1. 엔티티(Entity)
- 엔티티는 데이터베이스와 직접 연결된 객체입니다.
- 데이터베이스의 테이블 구조를 자바 객체로 표현하며, id, createdAt 같은 시스템 정보도 포함됩니다.
public class Question {
private Long id;
private String subject;
private String content;
private LocalDateTime createDate;
private String sensitiveInfo; // 민감한 정보
// Getter, Setter 생략
}
2. DTO(Data Transfer Object)
- DTO는 엔티티와 달리 데이터 전달만을 목적으로 하는 객체입니다.
- 보통 사용자에게 필요한 데이터만 담아 전달합니다.
- 데이터를 캡슐화하고, 불필요하거나 민감한 정보를 숨기는 역할을 합니다.
public class QuestionDTO {
private String subject;
private String content;
private LocalDateTime createDate;
// Getter, Setter 생략
}
3. 차이점
- 엔티티에는 데이터베이스 관련 정보와 민감한 정보가 포함되어 있습니다.
- DTO는 사용자와 교환하는 데 필요한 데이터만 포함합니다.
4. 엔터티 → DTO 변환
public class QuestionService {
public QuestionDTO convertToDTO(Question question) {
QuestionDTO dto = new QuestionDTO();
dto.setSubject(question.getSubject());
dto.setContent(question.getContent());
dto.setCreateDate(question.getCreateDate());
return dto;
}
}
5. 그 외 Controller에서도 사용 가능
@GetMapping("/question/{id}")
public QuestionDTO getQuestion(@PathVariable Long id) {
Question question = questionService.findById(id);
return questionService.convertToDTO(question);
}
DTO 활용 : REST API
REST API에서 데이터를 JSON 형식으로 반환할 때도 DTO를 사용합니다.
1. DTO
public class UserDTO {
private String name;
private String email;
// Getter, Setter 생략
}
2. Controller
@GetMapping("/user")
public UserDTO getUser() {
return new UserDTO("Alice", "alice@example.com");
}
주의 사항
- DTO의 크기
- 너무 많은 데이터를 담으면 오히려 비효율적일 수 있습니다.
- 필요한 데이터만 포함하도록 설계해야 합니다.
- DTO와 엔티티의 중복
- DTO와 엔티티의 필드가 비슷해 보일 수 있지만, 각자의 역할이 다릅니다.
- 엔티티는 데이터베이스와 연동, DTO는 데이터 전달에 초점.
- 자동화 도구 활용
- ModelMapper, MapStruct와 같은 라이브러리를 사용하면 DTO 변환 작업을 쉽게 처리할 수 있습니다.
요약
DTO는 계층 간 데이터 교환을 안전하고 효율적으로 관리하기 위한 도구이다.
출처
OpenAI의 ChatGPT (https://openai.com)
반응형
'Java Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] Thymeleaf 템플릿 상속 (Template Inheritance) (0) | 2025.02.06 |
---|---|
[Spring Boot] PRG 패턴 (0) | 2024.12.20 |
[Spring Boot] Thymeleaf 속성 (0) | 2024.12.16 |
[Spring Boot] 템플릿 엔진 (Template Engines) (1) | 2024.12.15 |
[Spring Boot] Custom Query의 SQL 연산자 (2) | 2024.12.14 |