Spring의 Bean validation

zwon·2023년 8월 31일
0

개발일지

목록 보기
8/23

Bean validation에 대해서 알아보자.
BindingResult 포스팅에셔 작성한 검증 로직처럼, 검증 로직을 매번 코드로 작성하는 것은 번거롭다. 만약 과장해서 입력폼이 1000개가 있다면 1000개의 입력폼 값들을 검증하는 로직을 개발해야하는 것이다.
힘들다.

그래서 Bean validation을 잘 활용하면 어노테이션 하나로 검증 로직을 적용시킬 수 있다!

Bean validation

  • 구현체가 아닌 Bean validation은 기술 표준이다.
  • 스프링 부트는 아래와 같은 의존관계를 추가해주면 자동으로 Bean validator를 인지한다.
  • 검증 시 @Valid, @Validated와 같은 어노테이션들을 그냥 사용하면된다.
  • @Validated는 groups기능이 있는데 이는 객체마다 검증을 다르게 하고싶을 때 사용할 수 있다.
  • @Valid를 사용하려면 build.gradle에 다음과 같은 의존관계를 설정해줘야 사용할 수 있다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
  • bean validation을 적용시킨 report 객체이고 주석에 각 어노테이션에 대한 설명을 작성해놨다.
@Data
public class Report {
  
  private Long id;

  @NotBlank // 빈값 + 공백은 허용하지 않는다.
  private String title; // 독서록 제목

  @NotNull //null을 허용하지 않는다.
  private String date; // 독서록

  @NotNul //null을 허용하지 않는다.
  private String content; // 독서록 내용

  ...
}
  • 이뿐만 아니라 범위를 정할 수 있는 @Range, 최대값을 정할 수 있는 @Max 등이 있다.
    (우선 여기서는 보여주기 위해 @NotNull도 사용했지만 @NotBlank로 다 수정했다.)
  • 그리고 message속성을 줘서 에러 메시지를 정할 수도 있고 따로 에러 코드로 정할 수도 있는데 여기서는 message속성을 이용하겠다.
  @NotBlank(message = "제목을 입력해주세요")
  private String title; // 독서록 제목

  @NotBlank(message = "작성일을 입력해주세요")
  private String date; // 독서록

  @NotBlank(message = "내용을 작성해주세요.")
  private String content; // 독후감 내용
  • 아래 코드는 컨트롤러에 @Validated와 BindingResult를 사용해서 구현한 검증로직이다.
  • 간단하게 bindingResult가 Error를 가지고있는지만 확인해주면 된다.
  • 참고로 바인딩에 성공한 필드만 Bean validation이 적용된다.
독서록 작성 컨트롤러
 @PostMapping("/{reportId}/write")
  public String addReport(@PathVariable Long reportId, @Validated @ModelAttribute Report report, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
      // 에러를 가지고 있으면 다시 작성폼 보여주기
      return "report/writeForm";
    }
    report.setId(reportId);
    reportService.save(report);
    return "redirect:/library";
  }
독서록 수정 컨트롤러
@PostMapping("{reportId}/edit")
  public String update(@PathVariable Long reportId, @Validated @ModelAttribute Report report, BindingResult bindingResult){
    if (bindingResult.hasErrors()) {
      // 에러를 가지고있으면 다시 수정 폼 보여주기
      return "report/editForm";
    }
    reportService.update(reportId, report);
    return "redirect:/library";
  }

필드에러는 위처럼 처리가 가능하지만 오브젝트 관련 오류같은 경우는 @ScriptAssert를 사용할 수 있지만 생각보다 복잡하고 제약이 많아서 오브젝트 관련 코드는 따로 자바로 처리하는 것이 좋다.


적용결과

수정폼도 동일하다.
타임리프에 에러 메시지가 나오도록 하는 부분은 포스팅을 따로 하지는 않겠다.

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글