[Spring MVC] API 계층 - DTO

박채은·2022년 12월 25일
1

Spring

목록 보기
13/35

DTO란?

  • Data Transfer Object
    • 데이터를 전송하기 위한 객체
    • 데이터 전송은 다음과 같은 경우에 일어난다.
      • 클라이언트 -> 서버 시의 요청 데이터
      • 서버 -> 클래이언트 시에 응답 데이터
  • 엔터프라이즈 애플리케이션 아키텍쳐 패턴 중 하나

DTO를 사용하는 이유

1. 코드의 간결함을 유지하기 위해서

  • 클라이언트 요청 데이터가 들어올 때, 파라미터에 @RequestParam 애너테이션을 사용하면 코드 자체가 굉장히 길어지고 복잡해진다.

  • 유효성 검증을 핸들러 메서드 내에 작성하면, 코드가 길고 복잡해진다.

2. 도메인 객체와의 분리를 위해서

3. HTTP 요청의 수를 줄이기 위해서

  • DTO 클래스에서 유효성 검사를 통해 HTTP 요청 수를 줄일 수 있다.

4. (new!) 순환 참조 문제를 방지하기 위해서 -> 순환 참조에 대한 블로깅


DTO 클래스

  • DTO 클래스 생성 시, 멤버 변수 이외에 각 멤버 변수에 해당하는 getter 메서드는 필수이다.
    • getter 메서드가 없으면 Response Body에 해당 멤버 변수의 값이 포함되지 않는 문제가 발생합니다.
  • setter 메서드는 필수는 아니다.

사용하는 애너테이션

  • @RequestBody : JSON 형식의 Request Body를 DTO 클래스의 객체로 변환을 시켜주는 역할을 한다.

  • @ResponseBody : DTO 클래스의 객체를 JSON 형식의 Response Body로 변환하는 역할을 한다.


직렬화/역직렬화

  • JSON -> Java 객체(DTO) : 역직렬화 (Deserialization)
  • Java 객체(DTO) -> JSON : 직렬화 (Serialization)

✅ Spring MVC에서는
1) 핸들러 메서드에 @ResponseBody 애너테이션이 붙거나
2) 핸들러 메서드의 리턴값이 ResponseEntity 인 경우
내부적으로 HttpMessageConverter가 동작하여 응답 객체(DTO)를 JSON 형식으로 바꿔줍니다.


DTO Validation

  • 서버 쪽에서 유효한 데이터를 전달 받기 위해서 데이터를 검증하는 것
  • 프론트엔드 쪽에서도 유효성 검증을 실행하지만, 브라우저의 개발자 도구를 사용해서 값을 조작할 수 있기 때문에 서버 쪽에서의 유효성 검사는 필수적이다.
  • 유효성 검증을 위해 Jakarta Bean Validation이라는 표준 스펙에서 지원하는 내장 애너테이션들을 사용한다.
    • Jakarta Bean Validation은 API가 아닌 스펙(인터페이스)이다.
    • Jakarta Bean Validation을 구현한 구현체가 Hibernate Validator이다.

유효성 검증을 위한 의존 라이브러리 추가

build.gradle 파일의 dependencies에

org.springframework.boot:spring-boot-starter-validation

을 추가해준다.


사용하는 애너테이션

✔️ @Valid, @Validated

  • @Valid : 파라미터의 DTO 변수에 붙여 DTO를 검사한다.
  • @Validated : Controller 클래스에 붙여, 쿼리 파라미터 또는 @PathVariable로 받아오는 URI 변수를 검사한다.

💡 @Validated@Valid 기능을 포함하며 실제로도 @Valid 대신 @Validated를 사용해도 정상 동작한다!

하지만 모두 @Validated 로 사용하지 않는 이유가 있을까?
(이유는 아직도 모르겠다.)


  • @NotNull : Null만 허용하지 않는다. (""" "은 허용)
  • @NotEmpty : Null, "" 을 허용하지 않는다. (" "은 허용)
  • @NotBlank : Null, "", " " (공백) 모두 허용하지 않는다.
  • @Pattern : 정규 표현식에 매치되는 유효한 값인지를 검증
  • @Email : 유효한 이메일 주소인지 검증한다.
  • @Size : 문자열의 최소, 최대 길이를 지정할 수 있다.
  • @Min / @Max

✔️ 정규식

실습을 하면서, 정규식에 대해서 많이 검색해봤는데 정규식에 대한 모든 것을 외울 순 없다는 생각이 들었다.
기본적인 정규식은 알아야 하지만 결국 많이 써봐야 할 것 같아서 정규식에 대한 정리보다는, 도움이 됐던 블로그를 남겨두겠다.

🚨 주의 🚨
정규식은 문자열이다!
그러므로 정수형에는 적용하지 않는다.


Custom Validator

DTO 클래스에 유효성 검증을 적용하다보면 Jakarta Bean Validation에 내장된(Built-in) 애너테이션 중에 목적에 맞는 애너테이션이 존재하지 않을 수 있다.

=> 이 경우에는 목적에 맞는 애너테이션을 직접 만들어야 한다!


[참고]
@NotNull, @NotEmpty, @NotBlank 의 차이점
정규식 테스트 사이트
https://choonse.com/2021/07/27/184/
https://mkki.github.io/regex/2018/02/13/regular-expression-tutorial.html
https://jamesdreaming.tistory.com/201

0개의 댓글