Skip to content

DTO & Validation

English ID edited this page Dec 19, 2024 · 2 revisions

DTO

DTO를 모아 두는 클래스

// `final` 클래스로 선언합니다.
public final class BoardCommandDto {
    // private 생성자만 선언합니다.
    private BoardCommandDto() {}

    // 이곳에 내부 클래스로 각 요청/응답에 대한 DTO를 선언합니다.
}

유틸리티 클래스처럼 다음 선언 방식을 채택합니다.

  • final 클래스로 선언합니다
  • private 생성자만 선언합니다.

이 클래스의 용도 외 사용을 설계상 막아 둘 수 있습니다.
이 두 조치를 빠뜨려도 큰 실수를 유발하지 않습니다. 발견한 사람이 추후 추가합니다.

여러 Request/Response DTO의 배치

public final class BoardCommandDto {
    private BoardCommandDto() {}

    // All request DTOs listed below
    //  (here)

    // All response DTOs listed below
    //  (here)
}
  • 여러 기능의 Request와 Response가 번갈아 나오면 원하는 DTO를 눈으로 탐색하는 과정이 느려집니다.
  • IDE가 탐색을 보조하지만, 육안으로 탐색하기 편한 배치는 높은 집중 요구로 인한 심적 피로도를 덜어 줍니다.

Record를 사용한 DTO

// ⚠️ Uncompleted example
public record BoardCreateRequest(String title, String content) {}

Record는 생성자와 클래스를 동시에 선언하며, 생성자 파라미터에 담은 것들이 동시에 필드입니다.
모든 필드는 불변(immutable)입니다.

  • DTO는 전달 과정에서 의미와 내용이 변질되지 않는 것을 지향하기로 합니다.
    즉, DTO는 불변 객체를 베스트 프랙티스의 요건 중 하나로 봅니다.
  • DTO 접미사는 Request 또는 Response로 합니다. (suffix는 논의 중이므로 채택이 바뀔 수 있습니다.)
  • DTO는 접미사로 DTO를 붙이지 않습니다. 대신 다른 단어가 이 의미를 대신 전달합니다.

Request DTO와 Validation

@Builder
public record BoardCreateRequest(
        @NotNull(message = "제목을 입력하십시오.")
        @Size(min = 3, message = "제목은 세 글자 이상 입력하십시오.")
        @Size(max = 50, message = "제목은 최대 50글자입니다.")
        String title,
        
        @NotNull(message = "본문을 입력하십시오.")
        @Size(min = 3, message = "본문을 세 글자 이상 입력하십시오.")
        String content
) {}
  • 파라미터에 많은 애노테이션이 있으므로, 섹션 구분을 위해 파라미터 사이에 빈 줄(single blank line)을 둡니다.

참고: 유효성 오류 응답 메시지는 추후 다국어를 지원할 예정입니다. 관련 설정과 예제는 다음 링크를 참고하세요:

Quick

  • Home
  • Code Styles
    • Controller
    • Service
      • Interface: Use Cases
      • Command Service
      • Query Service
    • Repository (Spring Data JPA Only)
      • CQRS
      • Command Repository
      • Query Repository
    • Domain
      • Enum Status
      • Base Entity
      • UUID Base Entity
      • JPA Entity
    • Error Code & Exceptional Response
      • Interface Error Code
      • Enum Error Code (impl. Error Code)
      • Custom Exception
      • Extended Custom Exception
    • 상수 관리
      • Static Final 기호상수
      • Enum을 통한 상수 관리
  • 프로젝트 보조 도구 활용
    • 작업 환경 및 운영 환경
      • Docker Compose (작업 환경)
      • Flyway (작업 환경, 운영 환경의 일치 필요)
Clone this wiki locally