Bean validation에 대해서 알아보자.
BindingResult 포스팅에셔 작성한 검증 로직처럼, 검증 로직을 매번 코드로 작성하는 것은 번거롭다. 만약 과장해서 입력폼이 1000개가 있다면 1000개의 입력폼 값들을 검증하는 로직을 개발해야하는 것이다.
힘들다.
그래서 Bean validation을 잘 활용하면 어노테이션 하나로 검증 로직을 적용시킬 수 있다!
implementation 'org.springframework.boot:spring-boot-starter-validation'
@Data
public class Report {
private Long id;
@NotBlank // 빈값 + 공백은 허용하지 않는다.
private String title; // 독서록 제목
@NotNull //null을 허용하지 않는다.
private String date; // 독서록
@NotNul //null을 허용하지 않는다.
private String content; // 독서록 내용
...
}
@NotBlank(message = "제목을 입력해주세요")
private String title; // 독서록 제목
@NotBlank(message = "작성일을 입력해주세요")
private String date; // 독서록
@NotBlank(message = "내용을 작성해주세요.")
private String content; // 독후감 내용
독서록 작성 컨트롤러
@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를 사용할 수 있지만 생각보다 복잡하고 제약이 많아서 오브젝트 관련 코드는 따로 자바로 처리하는 것이 좋다.
적용결과
수정폼도 동일하다.
타임리프에 에러 메시지가 나오도록 하는 부분은 포스팅을 따로 하지는 않겠다.