티스토리 뷰
사용자 입력 값을 프론트에서도 검증할 수 있지만 백엔드에서도 검증 할 필요가 있는 것 같아서 @Valid 를 써봄.
초반에 적용이 안되서 여러가지를 찾아보고 별짓 다함
show kotlin bytecode 로 변환해서 보는데 적용이 안되는 이유가 부모 생성자가 가장 먼저 실행되야하는게 부모 생성자 호출 전 notBlank 설정 코드가 있어서 적용이 안됨,, ㅠ 근데 또 잘 작동하길래 정리해봄ㅋ
@Valid 를 사용하기 위해 필요한 라이브러리 (build.gradle에 추가)
implementation("org.springframework.boot:spring-boot-starter-validation")
RequestDto
data class BoardRequest(
@field:NotBlank
val title: String,
@field:NotBlank
val content: String,
@field:NotNull
val id: Long
)
title, content 에는 공백이 올 수 없고 id 는 Long 타입이기 때문에 NotBlank를 적용할 수 없었다. (NotBlank 는 String 에만 적용할 수 있음 ㅋ) Long 타입의 ID 에는 Notblank 대신 NotNull 을 사용하였다.
RequestDto 를 사용하는 Controller
@PostMapping("/create")
fun createBoard(@RequestBody @Valid request: BoardRequest): BoardResponse {
println(request.toString())
println(request.id)
return boardService.createBoard(request)
}
결과
title과 content 에 공백을 넣어 요청하면 400 bad Request 가 발생한다. @NotBlank를 통해 공백을 허용하지 않았기 때문이다.
콘솔에 찍힌 로그를 보면 MethodArgumentNotValidException 가 발생한 것을 볼 수 있다. 사용자의 requestbody 를 보면 title 과 content가 @NotBlank 를 만족시키지 않기 때문에 해당 에러가 발생했다.
@Valid 종류
1. 문자열 검증
Annotation | null | "" (빈 문자열) | " " 공백 | 적용 타입 |
@NotNull | X | O | O | 전부 가능 |
@NotEmpty | X | X | O | charseq, 배열, 리스트 |
@NotBlank | X | X | X | 문자열 |
2. 최대 최소 검증
Annotation | 설명 |
@DecimalMax(value = "10") | 지정한 value 와 같거나 작아야함 (value 문자열 설정) |
@DecimalMin(value = "10") | 지정한 value 와 같거나 커야함 (value 문자열 설정) |
@Max(value = 10) | 지정한 value 와 같거나 작아야함 (value 정수로 설정) |
@Min(value = 10) | 지정한 value 와 같거나 커야함 (value 정수로 설정) |
3. 범위 검증
Annotation | 설명 |
@Positive | 양수 |
@PositiveOrZero | 0이거나 양수 |
@Negative | 음수 |
@NegativeOrZero | 0이거나 음수 |
4. 날짜/시간 검증
Annotation | 설명 |
@Future | 현재보다 미래의 날짜 및 시간 |
@FutureOrPresent | 현재거나 미래의 날짜 및 시간 |
@Past | 현재보다 과거의 날짜 및 시간 |
@PastOrPresent | 현재거나 과거의 날짜 및 시간 |
5. Boolean 검증
Annotation | 설명 |
@AssertTrue | 항상 True |
@AssertFalse | 항상 False |
6. 크기 검증
Annotation | 설명 |
@Size(max = 10, min = 5) | min과 같거나 크고 max와 같거나 작아야 한다 |
'1일 1삽질' 카테고리의 다른 글
Spring의 순환참조 (The dependencies of some of the beans in the application context form a cycle) (0) | 2022.09.03 |
---|---|
[Mysql] this is incompatible with sql_mode=only_full_group_by 해결 방법 (0) | 2022.08.13 |
JPAN+1 예제 (0) | 2022.07.24 |
JPA OneToMany, ManyToOne 양방향 관계에서 ToString StackOverflow 해결 방법 (0) | 2022.07.23 |
[JUnit5] unsatisfied dependency mockmvc (0) | 2022.06.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ci/cd
- Oracle
- spring
- AWS
- 인덱스
- Java
- nginx
- ORA-27125
- graphql
- SpringGraphQL
- 네이버클라우드
- level0
- ddl-auto
- db
- EC2
- 파일업로드설정
- 기술면접
- SpringSecurity
- Til
- Travis CI
- OS
- 람다식
- 프로그래머스
- 트랜잭션
- N+1
- TCP
- JPA
- CodeDeploy
- 트랜잭션격리성
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
글 보관함