1. DTO에 대해 알고, Controller 클래스에 적용시킬 수 있다.
2. DTO Validation(유효성 검증)에 대해 알고 적용시킬 수 있다.
- DTO
✔︎ 마틴 파울러(Martin Fowler)가 'Patterns of Enterprise Application Architecture'라는 책에서 처음 소개한 엔터프라이즈 애플리케이션 아키텍처 중 하나
✔︎ 주로 클라이언트가 서버쪽으로 전송하는 요청 데이터를 전달받을 때, 서버에서 클라이언트쪽으로 전송하는 응답 데이터를 전송하기 위한 용도로 사용
✔︎ 클라이언트의 Request Body
를 하나의 객체로 모두 전달받을 수 있기 때문에 코드 자체가 간결해짐
✔︎ Request Body
의 데이터 유효성(Validation) 검증이 단순해짐
✔︎ JSON 형식의 Request Body
를 전달받기 위해서는 DTO 객체에 @RequestBody
애너테이션을 붙여야 함
✔︎ Request Body
를 JSON 형식으로 전달하기 위해서는 @RequestBody
애너테이션을 메서드 앞에 붙여줘야 하지만, ResponseEntity 객체를 리턴 값으로 사용할 경우 @RequestBody
생략 가능
✔︎ 서버 쪽에서 클라이언트에게 응답 데이터를 전송하기 위해 DTO 같은 Java 객체를 JSON 형식으로 변환하는 것
✔︎ Java 객체 (DTO)
→ 직렬화(Serialization) → 전송 가능한 형태 (JSON)
✔︎ 클라이언트 쪽에서 JSON 형식의 데이터를 서버 쪽으로 전송하면 서버 쪽의 웹 애플리케이션이 전달받은 JSON 형식의 데이터를 DTO 같은 Java 객체로 변환하는 것
✔︎ 직렬화된 파일 (JSON)
→ 역직렬화(Deserialization) → Java 객체 (DTO)
- DTO 유효성 검증 (Validation)
✔︎ 프런트 엔드쪽에서 유효성 검증을 진행했더라도, 서버 쪽에서 추가적으로 유효성 검증을 반드시 진행해야 함
✔︎ 프런트 엔드쪽에서의 유효성 검증 프로세스는 사용자 편의성 측면에서 필요한 작업이기 때문
✔︎ 의존 라이브러리 추가
dependencies
항목에 org.springframework.boot:spring-boot-starter-validation
추가✔︎ @NotBlank
: 정보가 비어있는지 검증
✔︎ @Email
: 유효한 이메일 주소인지 검증
✔︎ @Pattern(regexp = "[정규표현식]", message = "[메시지]")
✔︎ @Valid
@RequestBody
애너테이션 앞에 추가@Pathvariable
에 대한 유효성 검증✔︎ @Min(1)
@Pathvariable("")
매개변수 따옴표 안에 사용된 URI path가 1이상의 숫자일 경우에만 유효성 검증 통과✔︎ @Validated
@Validated
애너테이션을 사용하면 쿼리 파라미터(Query Parameter 또는 Query String) 및 @Pathvarible
에 대한 유효성 검증 진행✔︎ 애너테이션 기반 유효성 검증을 위한 표준 스펙
✔︎ Jakarta Bean Validation의 애너테이션을 이용하면 Controller
로직에서 유효성 검증 로직 분리 가능
✔︎ Hibernate Validator : Jakarta Bean Validation 스펙을 구현한 구현체
✔︎ Jakarta Bean Validation에서 빌트인(Built-in)으로 지원하지 않는 애너테이션은 Custom Validator를 통해 Custom Annotation을 구현한 후 적용 가능
✔︎ Custom Validator 구현 절차
☞ Controller, 핸들러 메서드에 이어 DTO와 유효성 검증에 관해 알아봤다. 이번 시간에도 마찬가지로 실습 및 과제와 함께 진행하면서, 직접 코드를 타이핑해보며 몸소 느껴서 좀 더 학습에 도움됐던 것 같다.
이로써, 전체적으로 보면 클라이언트로부터 요청받은 데이터를 API 계층에서 받고 넘겨주는 과정까지를 공부한 것이다. 다음 시간에는 API 계층 밑에 있는 비즈니스 로직을 처리하는 서비스 계층과 API 계층 간의 관계에 대해 공부하게 된다.
이렇게 큰 틀을 계속 생각하며 하나 하나 퍼즐처럼 채워나가며 공부하는 습관을 가지면 내용들이 보다 잘 정리될 것 같다.
・ DI를 통한 API 계층 ↔︎ 서비스 계층 연동
・ 매퍼(Mapper)를 이용한 DTO 클래스 ↔︎ 엔티티(Entity) 클래스 매핑