✅ DTO란?

2025. 10. 9. 13:06·2025/[풀스택]SeSAC 웹개발자 7기
반응형

 

✅ DTO란?

DTO(Data Transfer Object) 는 말 그대로
컨트롤러 ↔ 서비스 ↔ 프론트엔드 사이에서 데이터를 “주고받을 목적”으로만 쓰는 객체예요.
즉, 데이터 운반용(transfer) 객체입니다.


✅ DTO의 역할

(1) Entity(=DB 구조) 와 API 요청/응답 데이터 구조를 분리시켜줍니다.

  • Entity는 DB 테이블 구조 그 자체이지만,
  • DTO는 API 요청마다 필요한 필드만 포함하거나, 추가로 계산된 데이터를 담을 수도 있죠.

(2) 보안 / 유연성 / 문서화를 동시에 확보합니다.
예를 들어,

  • 회원가입 시 → password, email, nickname만 필요
  • 로그인 시 → email, password만 필요
  • 마이페이지 조회 시 → nickname, profileImage, bookmarkCount 등 필요
    이렇게 요청마다 구조가 달라요.

즉,
👉 “User 관련”이라도 “모든 API에서 같은 필드”를 주고받지 않아요.
그래서 UserDTO 하나로 모든 상황을 커버하려 하면, 필드가 비대해지고 의미가 불분명해집니다.


✅ 그렇다면 “DTO를 계속 만들어야 하나?”

정확히 말하면 “필요한 만큼만, 목적에 따라 분리” 하는 게 맞습니다.

예를 들어 User 관련이라면 보통 이렇게 나뉘어요 👇

DTO 이름 용도 포함 필드 예시

UserSignupRequest 회원가입 요청 name, email, password, nickname, phone
UserLoginRequest 로그인 요청 email, password
UserResponse 응답용 (회원정보 조회 등) userId, email, nickname, createdAt
UserDTO (공용) 간단한 내부 전달 userId, email, token 등
RefreshTokenRequest 토큰 갱신용 refreshToken

이렇게 나누는 이유는:

  • Swagger 문서가 자동으로 요청/응답 구조를 명확히 보여줍니다.
  • 실수로 password를 응답에 포함시키는 등 보안 위험을 줄입니다.
  • 필드 이름/형식이 각 API 목적과 1:1로 대응됩니다.
  • 팀 개발 시, API 변경 범위를 최소화할 수 있습니다.

✅ “그럼 왜 UserDTO 하나만 쓰면 안 되나요?”

지금 UserDTO는 이미 로그인, 회원가입, 응답 등 서로 다른 책임을 다 포함하고 있죠.

예를 들어, UserDTO 안에는:

private String password;
private String token;
private String refreshToken;
private String preferenceKeywords;

이렇게 요청용 + 응답용 + 내부용 필드가 뒤섞여 있습니다.

그래서 이걸 전부 다 모든 API에서 쓰면 이런 문제가 생깁니다:

  • Swagger 문서에는 password/token/refreshToken이 전부 노출됨.
  • 회원가입 요청에 token이 붙어도 오류가 안 나서 디버깅 어려움.
  • 다른 팀원이 API를 볼 때, “이 DTO가 어디서 어떤 필드로 쓰이는지” 불분명해짐.

즉, 재사용성은 좋아 보이지만 유지보수성이 급격히 떨어집니다.


✅ 정리 (핵심 3줄)

(1) DTO는 “요청/응답 목적별로 가볍게 분리”하는 게 맞습니다.
(2) UserDTO 하나로 모든 걸 커버하면 Swagger 문서와 실제 로직이 불일치하게 됩니다.
(3) DTO를 여러 개 두는 이유는 “엔티티를 오염시키지 않고, API 단위로 의미를 명확히” 하기 위함입니다.


💡 결론:

“User 관련 API니까 UserDTO 하나로 통일하자”는 발상은 초반엔 편하지만,
실무에서는 “요청/응답 단위로 분리된 DTO”가 훨씬 깔끔하고 안전합니다.
RefreshTokenRequest처럼 단일 필드 전용 DTO는 작지만, API 명세·보안·확장성 측면에서 큰 이점을 줍니다.

 

저작자표시 비영리 변경금지 (새창열림)

'2025 > [풀스택]SeSAC 웹개발자 7기' 카테고리의 다른 글

✅ DB 인덱싱(Database Indexing) 이란?  (0) 2025.10.26
✅ (메일링서비스) Gmail SMTP 발송 한도?  (0) 2025.10.09
[b1a4 팀프로젝트 TIL] 251001수(6) 배느실  (0) 2025.10.01
서울시 25개 전체 구 카페정보를 최대한 많이 수집하는 전략?  (0) 2025.10.01
API 기반 크롤링?  (0) 2025.10.01
'2025/[풀스택]SeSAC 웹개발자 7기' 카테고리의 다른 글
  • ✅ DB 인덱싱(Database Indexing) 이란?
  • ✅ (메일링서비스) Gmail SMTP 발송 한도?
  • [b1a4 팀프로젝트 TIL] 251001수(6) 배느실
  • 서울시 25개 전체 구 카페정보를 최대한 많이 수집하는 전략?
d0yclub
d0yclub
2024.06.17 open
  • d0yclub
    개발꿈나무 김도이
    d0yclub
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 서재 (0)
      • 2024 (13)
        • [FE]Next.js2기 (6)
        • [FE]우아한테크코스7기-프리코스 (6)
      • 개발공부 (25)
        • HTML CSS (6)
        • JavaScript (2)
        • React.js (4)
        • DB - mySQL (0)
        • error.log (8)
      • 2025 (32)
        • 멋쟁이사자처럼 프론트엔드스쿨플러스 4기 (1)
        • [풀스택]SeSAC 웹개발자 7기 (29)
        • 개인프로젝트 (1)
        • 팀프로젝트 (1)
      • 자료구조&알고리즘 풀이 (3)
        • 프로그래머스 (2)
      • 2026 (0)
        • [AI]SeSAC microsoft AI엔지니어 .. (0)
        • 개인프로젝트 (0)
        • 팀프로젝트 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스나이퍼팩토리
    팀프로젝트
    Next.js
    회고
    EC2
    배느실
    GCP
    유데미
    KPT
    DTO
    프로젝트캠프
    미래내일일경험
    트러블슈팅
    프론트엔드개발자양성과정
    RDS
    부트캠프
    웅진씽크빅
    udemy
    KPT회고
    TIL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
d0yclub
✅ DTO란?
상단으로

티스토리툴바