카테고리 없음

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