728x90
Spring 에서 Controller 로 들어오는 입력값에 대한 유효성 검증을 위해서 Java Bean Validation API 와 Spring Validator 를 사용할 수 있음.
Java Bean Validation
- 어노테이션 기반으로 간단하게 검증할 수 있음.
- 의존성 추가
pom.xml
또는build.gradle
에 의존성을 추가함.
Maven(pom.xml
)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</articatId>
</dependency>
Gradle(build.gradle
)
implementation 'org.springframework.boot:spring-boot-starter-validation'
- DTO 작성
검증이 필요한 입력 데이터에 어노테이션을 활용하여 유효성 검증을 설정함.
public class UserRequest {
@NotBlank(message = "Name is required")
private String name;
@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 100, message = "Age should not be greater than 100")
private int age;
@Email(message = "Invalid email format")
private String email;
//Getter/Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
- Controller 에서 유효성 검증 적용
Controller 메서드에@Valid
와BindingResult
를 사용하여 검증 결과를 처리함.
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@RequestBody @Valid UserRequest userRequest, BindingRequest result){
if(result.hassErrors()) {
return result.getFieldErrors().stream()
.map(fieldError -> fieldError.getField() + ":" + fieldError.getDefaultMessage())
.reduce((message1, message2) -> message1 + ", "+message2)
.orElse("Invalid input");
}
return "User created successfully!";
}
}
Spring Validator Interface
- Custom Validator 구현
@Component
public class UserRequestValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return UserRequest.class.euquals(clazz);
}
@Override
public void validate(Object target, Errros errors) {
UserRequest userRequest = (UserRequest) target;
if(userRequest.getName() == null || userRequest.getName().isBlank()) {
errors.rejectValue("name", "name.required", "Name is required");
}
if(userRequest.getAge() < 18 || userRequest.getAge() > 100){
errors.rejectValue("age", "age.invalid", "Age should be between 18 and 100");
}
if(userRequest.getEmail() == null || !userRequest.getEmail().contains("@")){
errors.rejectValue("email","email.invalid", "Invalid email format");
}
}
}
- Controller 에서 사용
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRequestValidator userRequestValidator;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(userRequestValidator);
}
@PostMapping
public String createUser(@RequestBody UserRequest userRequest, BindingResult result) {
userRequestValidator.validate(userRequest, result);
if (result.hasErrors()) {
return result.getFieldErrors().stream()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
.reduce((message1, message2) -> message1 + ", " + message2)
.orElse("Invalid input");
}
return "User created successfully!";
}
}
728x90
'99클럽 TIL' 카테고리의 다른 글
30일 차 TIL Spring Filter (0) | 2024.05.17 |
---|---|
29일 차 TIL Spring Interceptor (0) | 2024.05.16 |
27일 차 TIL Spring 과 Spring Boot 의 차이점 (0) | 2024.05.14 |
26일차 TIL Spring DL 이란 (0) | 2024.05.13 |
25일차 TIL Spring Container (0) | 2024.05.12 |
Comment