[Spring] Spring Boot Validation

고지훈·2022년 1월 20일
0

Spring

목록 보기
14/26
post-thumbnail
post-custom-banner

Validation

Validation은 프로그래밍에 있어서 가장 필요한 부분이다. 특히 Java에서는 null값에 대해서 접근하려고 할 때 null pointer exception이 발생함으로써 이러한 부분을 방지하기 위해 미리 검증을 하는 과정을 Validation이라 한다.

  1. 검증해야 할 값이 많은 경우 코드의 길이가 길어진다.
  2. 구현에 따라 달리질 수 있지만 Service Logic과 분리가 필요하다.
  3. 흩어져 있는 경우 어디에서 검증을 하는지 알기 어려우며 재사용의 한계가 있다.
  4. 구현에 따라 달라질 수 있지만, 검증 Logic이 변경되는 경우 테스트 코드 등 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생할 수 있다.

[Validation과 관련된 Annotation]

  • @Size: 문자 길이 측정
  • @NotNull: null 불가
  • @Past: 과거 날짜
  • @PastOrPresent: 오늘이거나 과거 날짜
  • @Pattern: 정규식 적용
  • @Max: 최대값
  • @Min: 최소값
  • @AssertTure/False: 별도 Logic적용
  • @Valid: 해당 Object Validation실행

Validation 예제

[ApiController.java]

@RestController // 해당 Class는 REST API를 처리하는 Controller
@RequestMapping("/api") // RequestMapping은 URI를 지정해주는 Annotation
public class ApiController {

    @PostMapping("/user")
    public Object user(@Valid @RequestBody Usere user, BindingResult bindingResult) {
        // validation에 대한 결과가 bindingResult에 담기게 된다.
        if (bindingResult.hasErrors()) {
            StringBuilder sb = new StringBuilder();
            bindingResult.getAllErrors().forEach(objectError -> {
                FieldError field = (FieldError) objectError;
                String message = objectError.getDefaultMessage();

                // 에러가 발생한 필드와 message에 적힌 내용을 화면에 출력한다.
                System.out.println(field.getField());
                System.out.println(message);

                sb.append("field: " + field.getField());
                sb.append("message: " + message);
            });

            // 응답 body안에 메세지를 전송해준다.
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
        }
        System.out.println(user);
        return user;
    }
}

[user.java]

@Getter
@Setter
@ToString
public class Usere {
    private String name;
    private int age;

    // 이메일에 양식이 맞지 않을 경우 에러를 리턴
    @Email
    private String email;

    // 정규식에 일치하지 않을 경우 에러를 리턴
    @Pattern(regexp = "^\\d{2,3}", message = "핸드폰 번호의 양식과 맞지 않습니다. 01x-xxxx-xxxx")
    private String phoneNumber;
}
profile
"계획에 따르기보다 변화에 대응하기를"
post-custom-banner

0개의 댓글