sm 기술 블로그

[스프링부트] 입력 값 검증, 에러 메시지 표시 본문

스프링부트

[스프링부트] 입력 값 검증, 에러 메시지 표시

sm_hope 2022. 9. 8. 23:21

Form

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;

@Getter
@Setter
public class QuestionForm {
    @NotEmpty(message = "제목은 필수항목 입니다.")
    @Size(max = 200)
    private String subject;

    @NotEmpty(message = "내용은 필수항목 입니다.")
    private String content;
}

유효성 검사를 진행해 준다.

제목과 내용이 비어있다면, 에러를 발생시킬 것이다.
문자열에는 notempty를 , 정수형에는  notnull을 작성해야 한다.

 

Controller

import com.mysite.shoppingMall.Ut.IsLogined;
import com.mysite.shoppingMall.Entity.Question;
import com.mysite.shoppingMall.Form.QuestionForm;
import com.mysite.shoppingMall.Repository.QuestionRepository;
import com.mysite.shoppingMall.Repository.UserRepository;
import com.mysite.shoppingMall.Service.QuestionService;
import com.mysite.shoppingMall.Ut.Ut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

@Controller
@RequestMapping("/question")
public class QuestionController {
    @Autowired
    private QuestionService questionService;

    //C qna 게시글 생성 ==============================================
    @GetMapping("/doWrite")
    public String doWrite(QuestionForm questionForm){

        return "QnA/write.html";
    }

    @PostMapping("/doWrite")
    public String doWrite(@Valid QuestionForm questionForm, BindingResult bindingResult, HttpSession session, Model model){
        if(bindingResult.hasErrors()){
            return "QnA/write.html";
        }

        this.questionService.doWrite(questionForm.getSubject(), questionForm.getContent(), session); // 글 작성
        return "QnA/list.html";
    }
 }

 

코드가 길지만 궁극적으로는 PostMapping만 보면 된다.

 

@Valid를 통해 유효성 검사를 진행한다.

위에서 Form에서 제한사항을 어기면 message를 담고 bingingResult에 에러를 담는다.

 

HTML

<form th:action="@{/question/doWrite}" th:object="${questionForm}" method="post">
        <!-- userId input -->

        <div>제목</div>
        <p th:if="${#fields.hasErrors('subject')}" th:errors="*{subject}" class="text-base text-red-500">제목은 필수항목 입니다.</p>
        <input type="text" name="subject" placeholder="제목을 입력해주세요." />
        
        <!-- Password input -->

        <div>내용</div>
        <p th:if="${#fields.hasErrors('content')}" th:errors="*{content}" class="text-base text-red-500">내용은 필수항목 입니다.</p>
        <textarea name="content" id="content" cols="30" rows="15" th:value="${questionForm.getContent()}" placeholder="내용을 입력해주세요."></textarea>
</form>

th:errors="*{content}" 를 통해 에러를 가져오고

th:if="${#fields.hasErrors('content')}" 를 통해 에러가 있는지 없는지에 따라 태그를 표시하거나 표시하지 않는다.

Comments