DTO란

오하수·2026년 1월 16일
post-thumbnail

DTO(Data Transfer Object)

DTO는 데이터를 다른 계층 또는 시스템 간에 전송하기 위해 사용되는 객체이다. DTO는 일반적으로 데이터를 캡슐화하고, 네트워크 전송, 파일 저장, API 응답 등에서 사용하는 구조체로 활용된다.


DTO의 특징

1. 데이터 전송 목적
DTO는 주로 데이터 전송을 목적으로 하며, 비즈니스 로직을 포함하지 않는다.

2. 단순성
DTO는 주로 데이터를 담기 위한 필드와 해당 필드에 접근하기 위한 getter/setter 메서드로 구성된다.

3. 직렬화 가능
네트워크를 통해 데이터를 전송할 때 직렬화 가능한 형태로 구현된다.

4. 무상태
DTO는 보통 무상태(stateless) 객체로 사용된다.

5. 변경 가능
DTO는 일반적으로 변경 가능(mutable) 객체로 설계된다.


DTO를 사용하는 이유?

  • 계층 간 명화관 분리: 백엔드의 내부 도메인 모델과 프론트엔드로 노출되는 데이터 구조를 분리할 수 있다. 이를 통해 내부 모델이 변경되어도 외부 API는 안정적으로 유지할 수 있다.

  • 데이터 변환 및 가공 : 백엔드의 데이터 모델을 프론트엔드에서 사용하기 적합한 형태로 변환할 수 있다. 예를 들어, 날짜 형식 변환이나 계산된 필드 추가 등이 가능하다.

  • API 버전 관리 : API가 발전함에 따라 여러 버전의 DTO를 유지하여, 이전 API 버전과의 호환성을 보장할 수 있다.

  • 유효성 검증 : DTO에서 데이터 유효성 검증 로직을 구현하여 시스템에 들어오는 데이터의 품질을 보장할 수 있다.


DTO 사용

요청 DTO(클라이언트 -> 서버)

public class MemoRequestDto {
    private String username;
    private String contents;

    // getter / setter
}

응답 DTO(서버 -> 클라이언트)

public class MemoResponseDto {
    private Long id;
    private String username;
    private String contents;

    public MemoResponseDto(Memo memo) {
        this.id = memo.getId();
        this.username = memo.getUsername();
        this.contents = memo.getContents();
    }
}

Controller에서 DTO 사용하는 흐름

@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
    Memo memo = memoService.createMemo(requestDto);
    return new MemoResponseDto(memo);
}
  1. 클라이언트 -> MemoRequestDto
  2. service에서 Entity 생성
  3. Entity -> MemoResponseDto
  4. 클라이언트에게 반환
profile
오늘하루도수고하세용~

0개의 댓글