42DAYS) [Spring MVC] API 계층 - DTO, DTO Validation(유효성 검증)

nacSeo (낙서)·2022년 12월 16일
0

◉ 학습목표

1. DTO에 대해 알고, Controller 클래스에 적용시킬 수 있다.
2. DTO Validation(유효성 검증)에 대해 알고 적용시킬 수 있다.
  1. DTO

⦿ 학습내용

☞ DTO (Data Transfer Object)

✔︎ 마틴 파울러(Martin Fowler)가 'Patterns of Enterprise Application Architecture'라는 책에서 처음 소개한 엔터프라이즈 애플리케이션 아키텍처 중 하나
✔︎ 주로 클라이언트가 서버쪽으로 전송하는 요청 데이터를 전달받을 때, 서버에서 클라이언트쪽으로 전송하는 응답 데이터를 전송하기 위한 용도로 사용

☞ DTO 필요성

✔︎ 클라이언트의 Request Body를 하나의 객체로 모두 전달받을 수 있기 때문에 코드 자체가 간결해짐
✔︎ Request Body의 데이터 유효성(Validation) 검증이 단순해짐

☞ DTO와 JSON

✔︎ JSON 형식의 Request Body를 전달받기 위해서는 DTO 객체에 @RequestBody 애너테이션을 붙여야 함
✔︎ Request Body를 JSON 형식으로 전달하기 위해서는 @RequestBody 애너테이션을 메서드 앞에 붙여줘야 하지만, ResponseEntity 객체를 리턴 값으로 사용할 경우 @RequestBody 생략 가능

☞ 직렬화 (Serialization)

✔︎ 서버 쪽에서 클라이언트에게 응답 데이터를 전송하기 위해 DTO 같은 Java 객체를 JSON 형식으로 변환하는 것
✔︎ Java 객체 (DTO) → 직렬화(Serialization) → 전송 가능한 형태 (JSON)

☞ 역직렬화 (Deserialization)

✔︎ 클라이언트 쪽에서 JSON 형식의 데이터를 서버 쪽으로 전송하면 서버 쪽의 웹 애플리케이션이 전달받은 JSON 형식의 데이터를 DTO 같은 Java 객체로 변환하는 것
✔︎ 직렬화된 파일 (JSON) → 역직렬화(Deserialization) → Java 객체 (DTO)

  1. DTO 유효성 검증 (Validation)

⦿ 학습내용

☞ 유효성 검증의 필요성

✔︎ 프런트 엔드쪽에서 유효성 검증을 진행했더라도, 서버 쪽에서 추가적으로 유효성 검증을 반드시 진행해야 함
✔︎ 프런트 엔드쪽에서의 유효성 검증 프로세스는 사용자 편의성 측면에서 필요한 작업이기 때문

☞ 유효성 검증 적용

✔︎ 의존 라이브러리 추가

  • build.gradle 파일의 dependencies 항목에 org.springframework.boot:spring-boot-starter-validation 추가

✔︎ @NotBlank : 정보가 비어있는지 검증
✔︎ @Email : 유효한 이메일 주소인지 검증
✔︎ @Pattern(regexp = "[정규표현식]", message = "[메시지]")

  • 정보가 정규표현식(Regular Expression)에 매치되는지 검증
  • 유효성 검증에 실패하면 내장 디폴트 메시지가 콘솔에 출력 (생략 가능)

✔︎ @Valid

  • 클래스에서 유효성 검증 로직이 실행되게 하는 애너테이션
  • 파라미터의 @RequestBody 애너테이션 앞에 추가

☞ 쿼리 파라미터 및 @Pathvariable에 대한 유효성 검증

✔︎ @Min(1)

  • @Pathvariable("") 매개변수 따옴표 안에 사용된 URI path가 1이상의 숫자일 경우에만 유효성 검증 통과

✔︎ @Validated

  • Spring에서 지원하는 @Validated 애너테이션을 사용하면 쿼리 파라미터(Query Parameter 또는 Query String) 및 @Pathvarible에 대한 유효성 검증 진행
  • 클래스 레벨에 애너테이션 적용

☞ Jakarta Bean Validation

✔︎ 애너테이션 기반 유효성 검증을 위한 표준 스펙
✔︎ Jakarta Bean Validation의 애너테이션을 이용하면 Controller 로직에서 유효성 검증 로직 분리 가능
✔︎ Hibernate Validator : Jakarta Bean Validation 스펙을 구현한 구현체

☞ Custom Validator

✔︎ Jakarta Bean Validation에서 빌트인(Built-in)으로 지원하지 않는 애너테이션은 Custom Validator를 통해 Custom Annotation을 구현한 후 적용 가능
✔︎ Custom Validator 구현 절차

  • Custom Validator를 사용하기 위한 Custom Annotation 정의
  • 정의한 Custom Annotation에 바인딩 되는 Custom Validator 구현
  • 유효성 검증이 필요한 DTO 클래스의 멤버 변수에 Custom Annotation 추가

◉ 느낀 점

☞ Controller, 핸들러 메서드에 이어 DTO와 유효성 검증에 관해 알아봤다. 이번 시간에도 마찬가지로 실습 및 과제와 함께 진행하면서, 직접 코드를 타이핑해보며 몸소 느껴서 좀 더 학습에 도움됐던 것 같다.

이로써, 전체적으로 보면 클라이언트로부터 요청받은 데이터를 API 계층에서 받고 넘겨주는 과정까지를 공부한 것이다. 다음 시간에는 API 계층 밑에 있는 비즈니스 로직을 처리하는 서비스 계층과 API 계층 간의 관계에 대해 공부하게 된다.
이렇게 큰 틀을 계속 생각하며 하나 하나 퍼즐처럼 채워나가며 공부하는 습관을 가지면 내용들이 보다 잘 정리될 것 같다.

◉ 내일의 키워드

・ DI를 통한 API 계층 ↔︎ 서비스 계층 연동
・ 매퍼(Mapper)를 이용한 DTO 클래스 ↔︎ 엔티티(Entity) 클래스 매핑
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글