13-1. Create, Read 구현하기

2026. 2. 10. 23:44·BackEnd/내일배움캠프

DTO란 무엇일까

DTO(Data Transfer Object)는 데이터 전송을 목적으로 사용하는 객체이다. 말 그대로 계층 간 또는 시스템 간에 데이터를 안전하고 명확하게 전달하기 위해 사용된다.

Spring 기반 웹 애플리케이션에서는 주로 Client ↔ Server, Controller ↔ Service, Service ↔ Repository 사이에서 데이터를 전달할 때 DTO를 활용한다.


DTO를 사용하는 이유

  1. 역할 분리
    • DB와 직접 매핑되는 Entity는 비즈니스 로직과 밀접하다
    • Client와 주고받는 데이터는 요구사항에 따라 자주 변경된다
    • Entity를 그대로 노출하면 구조 변경에 매우 취약해진다
  2. 보안 및 안정성
    • Entity에는 Client에게 노출되면 안 되는 필드가 있을 수 있다
    • DTO를 사용하면 필요한 데이터만 선택적으로 전달할 수 있다
  3. 유지보수성 향상
    • 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 흐름 정리

  1. 메모 데이터를 저장할 Memo(Entity) 클래스 생성
  2. 메모 생성 API를 받을 Controller와 메서드 작성
  3. Client 요청 데이터를 담을 MemoRequestDto 생성
  4. Client 응답 데이터를 담을 MemoResponseDto 생성
  5. DB 연결 전 단계이므로 Java 컬렉션(Map)을 임시 저장소로 사용

Read 흐름 정리

  1. DB 역할을 하는 memoList 조회
  2. Entity 리스트를 ResponseDto 리스트로 변환
  3. 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
'BackEnd/내일배움캠프' 카테고리의 다른 글
  • 14. Database
  • 13-2. Update, Delete 구현하기
  • 13. 메모장 프로젝트 설계
  • 12. HTTP 데이터를 객체로 처리하는 방법
JK-LEE98
JK-LEE98
백엔드 개발자
  • JK-LEE98
    JK-LEE98
    JK-LEE98
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 나의 지식 공유 (4)
      • SQL (4)
      • PS (10)
      • BackEnd (32)
        • Java (3)
        • Spring (4)
        • 내일배움캠프 (20)
        • 프로그래머스 데브코스 (5)
      • 건강한 나 되기🍀 (10)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
JK-LEE98
13-1. Create, Read 구현하기
상단으로

티스토리툴바