๋ฐ์ํ
Validation
Spring Boot์์๋ Validation์ ํตํด ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ์ ์กํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
์ Validation์ ์ฌ์ฉํ ๊น
- ์ฃผ๋ก Controller์์ ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ์ ์ก๋ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํจ
- ์ ํจ์ฑ ๊ฒ์ฆ ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํ ์ ์์ผ๋, request์ ๋ค์ด์ค๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์ฆ ์ฝ๋๋ก ์ธํด ์ฝ๋์ ์์ด ๋ง์ ์ง ์ ์์ผ๋ฉฐ ์๋น์ค ๋ก์ง์ ๋ฐฉํด๋ ์ ์์
- ์์ฒญ ํญ๋ชฉ์ด ๋ง์์ง ์๋ก ๊ฒ์ฆ ๊ณผ์ ์ด ๊ธธ์ด์ง
- ์ฌ๋ฌ๋ช ์ ๊ฐ๋ฐ์๊ฐ ๊ฒ์ฆ ๋ก์ง์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ด ์์ด์ง ์ ์์
- Validation์ ์ฌ์ฉํ๋ฉด ๊ฒ์ฆ ๋ก์ง์ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํํ ์ ์์
- Validation์ ์ฌ์ฉํด์ ๊ฒ์ฆ ๋ก์ง์ ๋จ์ํ ์ํฌ ์ ์์
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-validation'
Spring Boot์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ์ ์ํ ์์กด์ฑ๋ค์ด ํฌํจ๋์ด ์๋ค.
Validation ์ข ๋ฅ
์ด๋ ธํ ์ด์ | ์ค๋ช | ํน์ง |
@Size | ๋ฌธ์์ด ๊ธธ์ด ๊ฒ์ฆ | int ํ์ ์์ ์ฌ์ฉ ๋ถ๊ฐ |
@NotNull | null ๋ถ๊ฐ | |
@NotEmpty | null, ""(๋น ๋ฌธ์์ด) ๋ถ๊ฐ | |
@NotBlank | null, ""(๋น ๋ฌธ์์ด), " "(๊ณต๋ฐฑ ๋ฌธ์์ด) ๋ถ๊ฐ | |
@Pattern | ์ ๊ท์ ๊ฒ์ฆ | |
@Max | ์ต๋๊ฐ | |
@Min | ์ต์๊ฐ | |
@Past | ๊ณผ๊ฑฐ ๋ ์ง์ธ์ง ๊ฒ์ฆ | Date ํ์ ์์ ์ฌ์ฉ. request ์ ์ก์ "yyyy-MM-dd" ํ์์ผ๋ก ์ฌ์ฉ |
- Validation์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์คํ์ jakarta ๋ฌธ์์์ ํ์ธ ๊ฐ๋ฅ
- Built-In Constraint definitions ์น์ ํ์ธ
์์์ฝ๋
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRegisterRequest {
@NotBlank(message = "username์ ๋น ๊ฐ์ด ๋ ์ ์์ต๋๋ค.")
@Size(min = 4, max = 10, message = "username์ 4~10์๋ฆฌ์ฌ์ผ ํฉ๋๋ค.")
private String username;
private String password;
@Min(value = 19, message = "age๋ 19์ด ์ด์ ๋ถํฐ ๊ฐ๋ฅํฉ๋๋ค.")
private Integer age;
@Past(message = "์๋
์์ผ์ ๊ณผ๊ฑฐ์ ๋ ์ง์ฌ์ผ ํฉ๋๋ค.")
private Date birth;
@Pattern(regexp = "^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$", message = "์ ํจํ ํด๋ํฐ ํ์์ด ์๋๋๋ค.")
private String phoneNumber;
public User toEntity() {
return User.builder()
.username(username)
.password(password)
.role(Role.MEMBER)
.build();
}
}
- request ๋ฐ์ดํฐ์ ๋ํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ฏ๋ก ์ฃผ๋ก entity๊ฐ ์๋ dto์ validation annotation์ ์ถ๊ฐ
RequestBody
@PostMapping
public String register(@Valid @RequestBody UserRegisterRequest request) {
log.info("init : {}", request);
return request.toString();
}
- @Valid ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์ ํจ์ฑ์ ๊ฒ์ฆ
RequestParam
@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/user")
@Validated // ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ต ๊ฐ๋ฅ
class UserApiController {
@GetMapping(path = "/book")
public String queryParam(
@RequestParam("category") @Size(min = 2) String category,
@RequestParam("issued-day") @Past @DateTimeFormat(pattern = "yyyy-MM-dd") Date issuedDay
) {
return category + " " + issuedDay;
}
}
http://localhost:8080/api/book?category=fiction&issued-day=2020-01-01 |
PathVariable
@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/user")
@Validated // ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ต ๊ฐ๋ฅ
class UserApiController {
@GetMapping(path = "/book/{category}/{issued-day}")
public String queryParam(
@PathVariable("category") @Size(min = 2) String category,
@PathVariable("issued-day") @Past @DateTimeFormat(pattern = "yyyy-MM-dd") Date issuedDay
) {
return category + " " + issuedDay;
}
}
http://localhost:8080/api/book/fiction/2020-01-01 |
๊ธฐ์กด์๋ RequestParam, PathVariable ์ฌ์ฉ์ @Validated ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ผ ํ์ผ๋ ์คํ๋ง๋ถํธ 3.2์์ ์ ๋ ธํ ์ด์ ์ด ์์ด๋ ์๋์ผ๋ก ์ธ์ํ๋๋ก ์ ๋ฐ์ดํธ ๋จ (์๋ ์ฐธ๊ณ ์ฌ์ดํธ ์ฐธ๊ณ )
์ฐธ๊ณ ์ฌ์ดํธ
https://mangkyu.tistory.com/379
728x90
๋ฐ์ํ
'BE > ๐ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] RestControllerAdvice๋ก Validation Exception ํธ๋ค๋งํ๊ธฐ (1) | 2024.11.09 |
---|---|
[Spring Boot] Validation์ ๋ฐ์ํ ์ ์๋ ์๋ฌ ์์๋ณด๊ธฐ (0) | 2024.11.08 |
[Spring Boot] Controller์ RestController ์ฐจ์ด์ ResponseBody (2) | 2024.09.22 |
Spring boot ํ๋ก์ ํธ์ SSL ์ธ์ฆ์ ์ ์ฉํ๊ธฐ (0) | 2024.07.15 |
[Spring Boot JPA ๊ฒ์ํ ๋ง๋ค๊ธฐ] 3. Entity ์์ฑ (0) | 2024.05.08 |
๋๊ธ