DTO란 무엇일까

DTO(Data Transfer Object)는 데이터 전송을 목적으로 사용하는 객체이다. 말 그대로 계층 간 또는 시스템 간에 데이터를 안전하고 명확하게 전달하기 위해 사용된다.
Spring 기반 웹 애플리케이션에서는 주로 Client ↔ Server, Controller ↔ Service, Service ↔ Repository 사이에서 데이터를 전달할 때 DTO를 활용한다.
DTO를 사용하는 이유
- 역할 분리
- DB와 직접 매핑되는 Entity는 비즈니스 로직과 밀접하다
- Client와 주고받는 데이터는 요구사항에 따라 자주 변경된다
- Entity를 그대로 노출하면 구조 변경에 매우 취약해진다
- 보안 및 안정성
- Entity에는 Client에게 노출되면 안 되는 필드가 있을 수 있다
- DTO를 사용하면 필요한 데이터만 선택적으로 전달할 수 있다
- 유지보수성 향상
- API 스펙 변경 시 DTO만 수정하면 된다
- 내부 로직(Entity)은 영향 범위를 최소화할 수 있다
RequestDto와 ResponseDto
DTO는 용도에 따라 보통 두 가지로 나누어 설계한다.
- RequestDto
- Client로부터 전달받은 데이터를 담는 객체
- API 요청(Request)에 사용
- ResponseDto
- Client에게 반환할 데이터를 담는 객체
- API 응답(Response)에 사용
이렇게 분리하면 요청과 응답의 책임이 명확해지고, 코드 가독성도 좋아진다.
DTO를 사용하는 예제 구조
@RestController
@RequestMapping("/api")
public class MemoController {
private final Map<Long, Memo> memoList = new HashMap<>();
// Create
@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
// RequestDto → Entity
Memo memo = new Memo(requestDto);
Long maxId = memoList.size() > 0 ? Collections.max(memoList.keySet()) + 1 : 1;
memo.setId(maxId);
memoList.put(memo.getId(), memo);
// Entity → ResponseDto
return new MemoResponseDto(memo);
}
// Read
@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
return memoList.values().stream()
.map(MemoResponseDto::new)
.toList();
}
}
Create 흐름 정리
- 메모 데이터를 저장할 Memo(Entity) 클래스 생성
- 메모 생성 API를 받을 Controller와 메서드 작성
- Client 요청 데이터를 담을 MemoRequestDto 생성
- Client 응답 데이터를 담을 MemoResponseDto 생성
- DB 연결 전 단계이므로 Java 컬렉션(Map)을 임시 저장소로 사용
Read 흐름 정리
- DB 역할을 하는 memoList 조회
- Entity 리스트를 ResponseDto 리스트로 변환
- Client에 List 형태로 반환
Entity를 직접 반환하면 안 되는 이유
- Entity는 DB 구조와 1:1로 맞물려 있다
- Client 요구사항 변경이 Entity 변경으로 이어질 수 있다
- 불필요한 필드까지 노출될 위험이 있다
DTO를 사용하면 이러한 문제를 깔끔하게 분리할 수 있다.
정리
- DTO는 데이터 전달 전용 객체이다
- Entity와 Client 사이의 중간 계층 역할을 한다
- RequestDto / ResponseDto로 분리하는 것이 일반적이다
- Entity를 직접 반환하지 않고 DTO로 변환해 반환하는 것이 권장된다
DTO 개념을 제대로 이해하면 API 설계의 품질이 한 단계 올라간다.
'BackEnd > 내일배움캠프' 카테고리의 다른 글
| 14. Database (0) | 2026.02.10 |
|---|---|
| 13-2. Update, Delete 구현하기 (0) | 2026.02.10 |
| 13. 메모장 프로젝트 설계 (0) | 2026.02.10 |
| 12. HTTP 데이터를 객체로 처리하는 방법 (0) | 2026.02.10 |
| 11. Path Variable과 Request Param (0) | 2026.02.10 |