1. 코드의 간결함을 유지하기 위해서
클라이언트 요청 데이터가 들어올 때, 파라미터에 @RequestParam
애너테이션을 사용하면 코드 자체가 굉장히 길어지고 복잡해진다.
유효성 검증을 핸들러 메서드 내에 작성하면, 코드가 길고 복잡해진다.
2. 도메인 객체와의 분리를 위해서
3. HTTP 요청의 수를 줄이기 위해서
4. (new!) 순환 참조 문제를 방지하기 위해서 -> 순환 참조에 대한 블로깅
@RequestBody
: JSON 형식의 Request Body를 DTO 클래스의 객체로 변환을 시켜주는 역할을 한다.
@ResponseBody
: DTO 클래스의 객체를 JSON 형식의 Response Body로 변환하는 역할을 한다.
✅ Spring MVC에서는
1) 핸들러 메서드에@ResponseBody
애너테이션이 붙거나
2) 핸들러 메서드의 리턴값이ResponseEntity
인 경우
내부적으로HttpMessageConverter
가 동작하여 응답 객체(DTO)를 JSON 형식으로 바꿔줍니다.
Jakarta Bean Validation
이라는 표준 스펙에서 지원하는 내장 애너테이션들을 사용한다.Hibernate Validator
이다.build.gradle 파일의 dependencies에
org.springframework.boot:spring-boot-starter-validation
을 추가해준다.
@Valid
: 파라미터의 DTO 변수에 붙여 DTO를 검사한다.@Validated
: Controller 클래스에 붙여, 쿼리 파라미터 또는 @PathVariable
로 받아오는 URI 변수를 검사한다.💡
@Validated
가@Valid
기능을 포함하며 실제로도@Valid
대신@Validated
를 사용해도 정상 동작한다!
❓ 하지만 모두
@Validated
로 사용하지 않는 이유가 있을까?
(이유는 아직도 모르겠다.)
@NotNull
: Null
만 허용하지 않는다. (""
나 " "
은 허용)@NotEmpty
: Null
, ""
을 허용하지 않는다. (" "
은 허용)@NotBlank
: Null
, ""
, " "
(공백) 모두 허용하지 않는다.@Pattern
: 정규 표현식에 매치되는 유효한 값인지를 검증@Email
: 유효한 이메일 주소인지 검증한다.@Size
: 문자열의 최소, 최대 길이를 지정할 수 있다.@Min
/ @Max
실습을 하면서, 정규식에 대해서 많이 검색해봤는데 정규식에 대한 모든 것을 외울 순 없다는 생각이 들었다.
기본적인 정규식은 알아야 하지만 결국 많이 써봐야 할 것 같아서 정규식에 대한 정리보다는, 도움이 됐던 블로그를 남겨두겠다.
🚨 주의 🚨
정규식은 문자열이다!
그러므로 정수형에는 적용하지 않는다.
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