@Valid와 rejectValue()로 유연하게 유효성 검증하기

2024. 7. 2. 10:48Language/Java

@Valid 어노테이션과 BindingResult 객체를 통해 검증을 수행하면, 태그 하나당 글자 길이나 각 필드 값을 서로 비교해야 하는 상대적으로 복잡한 검증이 필요할 때 유용하다.

 

@Valid 어노테이션

  • 주로 Controller 또는 Service 계층에서 사용자로부터 받은 데이터 처리 시 사용
  • DTO나 Form 클래스에 적용하여 요청 파라미터의 유효성을 검사
  • @NotBlank, @Size, @Pattern 등 다양한 검증용 어노테이션 제공
  • 단점은 복잡한 비교 검증 시 유연성 부족, 별도의 Validator클래스 또는 수동 검증 로직 필요
public class Board {
    @NotBlank(message = "제목을 입력하세요")
    @Size(max = 100, message = "100자 이하로 작성하세요")
    private String title;
}

public class BoardController {
    @PostMapping("/p")
    public String postBoard(@Valid Board board, BindingResult error) {
        if (error.hasErrors()) {
            return "/";
        }
        return "redirect:/success";
    }
}

 

 

rejectValue() 메소드

  • Srping Framework에서 제공하는 유효성 오류 등록 메서드
  • 직접 검증 로직을 구현하여 오류를 발생시킬 경우 사용
  • 파라미터
    • fileName : 오류가 발생한 필드 이름
    • errorCode : 오류 코드
    • defaultMessage : 오류 코드에 해당하는 메시지가 없는 경우 사용하는 기본 메시지

 

혼용법

 

비교 검증 등 단순한 필드 단위로 유효성 검사를 수행할 수 없을 때, 직접 검사 로직을 구현하고 rejectValue() 메소드를 사용하여 오류를 등록

@Controller
public class BoardController {

    @Autowired
    private BoardService boardService;

    @PostMapping("/boards")
    public ResponseEntity<Board> createBoard(@Valid @RequestBody Board board, BindingResult error) {
        if (error.hasErrors()) {
            return ResponseEntity.badRequest().body(null);
        }

        // 게시글 제목과 내용의 길이 비교 검증
        if (board.getTitle().length() > board.getContent().length()) {
            error.rejectValue("content", "content.length", "내용 길이는 제목 길이보다 커야 합니다.");
            return ResponseEntity.badRequest().body(null);
        }

        Board createdBoard = boardService.createBoard(board);
        return ResponseEntity.ok(createdBoard);
    }
}