카테고리 없음
Basic 프로젝트 - DAY2
아놀드금자
2023. 7. 1. 18:11
728x90
Spring Boot Validation
form 화면에서 전달받은 입력값 검중
build.gradle에 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
springboot validation 애너테이션
@Size | 문자 길이를 제한한다. |
@NotNull | Null 비허용 |
@NotEmpty | Null 또는 빈 문자열("") 비허용 |
@Past | 과거 날짜만 가능 |
@Future | 미래 날짜만 가능 |
@FutureOrPresent | 미래 또는 오늘날짜만 가능 |
@Max | 최대값 |
@Min | 최소값 |
@Pattern | 정규식으로 검증 |
@PostMapping("/create")
// @Valid 애너테이션 붙여야 검증기능 작동
public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) { //입력값 검증
return "question_form";
}
BindingResult 매개변수는 항상 @Valid 매개변수 바로 뒤에 있어야 함
만약 2개의 매개변수의 위치가 정확하지 않다면 @Valid만 적용이 되어 입력값 검증 실패 시 400 오류가 발생
bindResult.hasErrors()를 호출하여
오류있으면-> 다시 폼을 작성하는 화면
오류없으면 -> 질문등록
오류를 표시하기 위해서는 타임리프의 th:object 속성이 반드시 필요
th:object를 사용하여 폼의 속성들이 QuestionForm의 속성들로 구성된다는 점을 타임리프 엔진에 알려줘야 하기 때문
<form th:action="@{/question/create}" th:object="${questionForm}" method="post">
<div class="alert alert-danger" role="alert" th:if="${#fields.hasAnyErrors()}">
<div th:each="err : ${#fields.allErrors()}" th:text="${err}" />
</div>
QuestionForm과 같이 매개변수로 바인딩한 객체는 Model 객체로 전달하지 않아도 템플릿에서 사용이 가능
@GetMapping("/create") public String questionCreate(QuestionForm questionForm) { return "question_form"; }
th:replace 속성으로 공통 템플릿을 템플릿 내에 삽입가능
<div th:replace="~{form_errors :: formErrorsFragment}"></div>
div 엘리먼트를
form_errors.html 파일의 th:fragment 속성명이 formErrorsFragment인 엘리먼트로 교체하라는 뜻
728x90