스프링 입문

[스프링 입문] 6.1 Spring Boot Validation

코딩펭귄 2024. 1. 8. 19:23

Validation

- 자바에서 null값에 대해 접근하려고 할 때 null pointer exception 발생 -> 이러한 부분 방지 위해 미리 검증을 하는 과정을 validation 이라고 함

 

[ validation이 필요한 이유 ]
1) 검증해야할 값이 많은 경우 코드의 길이가 길어짐

2) 구현에 따라 Service Logic과의 분리가 필요함

3) 흩어져 있는 경우 어디에서 검증하는지 알기 어렵고, 재사용의 한계가 있음

4) 구현에따라 달라질 수 있지만, 검증 로직이 변경되는 경우 테스트코드등 참조하는 클래스에서 로직이 변경되어야하는 부분이 발생할수 있음

 

자주 사용하는 annotation

@size 문자길이 측정 (Int Type  불가)
@NotNull null 불가
@NotEmpty null, "" 불가
@NotBlank null, "", "  " 불가
@Past 과거날짜
@PastOrPresent 오늘이거나 과거날짜
@Future 미래날짜
@FutureOrPresent 오늘이거나 미래날짜
@Pattern 정규식 적용
@Max 최대값
@Min 최소값
@AssertTrue/False 별도 로직 적용
@ Valid 해당 object validation 실행

 

예제

controller : 요청에 대한 것들 정리

binding result 객체를 통해 새로운 변환값을 받을 수 있고, 만약 이게 없으면 예외처리 하면 됨

스프링부트 validation 사용방법 : annotation 붙여주면 됨

객체를 검사하고 싶은곳에다가는 valid annotaion 붙여주면됨

@RestController
@RequestMapping("/api")
public class ApiController {

    @PostMapping("/user")
    public ResponseEntity user(@Valid @RequestBody User user, BindingResult bindingResult){

        if(bindingResult.hasErrors()){
            StringBuilder sb = new StringBuilder();
            bindingResult.getAllErrors().forEach(objectError -> {
                FieldError field = (FieldError) objectError;
                String message = objectError.getDefaultMessage();

                System.out.println("field : "+field.getField());
                System.out.println(message);

                sb.append("field : "+field.getField());
                sb.append("message : "+message);
            });
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
        }
        return ResponseEntity.ok(user);
    }
}
public class User {
    @NotBlank
    private String name;

    @Max(value = 90)
    private int age;

    @Email
    private String email;

    @Pattern(regexp = "\\d{2,3}-\\d{3,4}-\\d{4}$", message = "핸드폰 번호의 양식과 맞지 않습니다. xxx-xxxx-xxxx")
    private String phoneNumber;

    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;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }
}