본문 바로가기

Spring

[Spring]Spring 시작해보기(13) - 답변 등록 오류

이전 글 처럼 답변 작성에 form이 비어있을 경우, 오류창을 띄우는 방법을 알아보자.

 

1. AnswerForm class를 만든다.

answer의 내용을 적는 form이 비어있는지, 아닌지에 대해서 검증하기 위해 사용하는 AnswerForm 객체를 만든다.

@Getter
@Setter
public class AnswerForm {
    @NotEmpty(message = "내용은 필수항목입니다.")
    private String content;
}

 

 

2. Controller 수정

@PostMapping("/create/{id}")
public String createAnswer(Model model, @PathVariable("id") Integer id, 
        @Valid AnswerForm answerForm, BindingResult bindingResult) {
    Question question = this.questionService.getQuestion(id);
    if (bindingResult.hasErrors()) {
        model.addAttribute("question", question);
        return "question_detail";
    }
    this.answerService.create(question, answerForm.getContent());
    return String.format("redirect:/question/detail/%s", id);
}

QuestionForm과 마찬가지로 @Valid 어노테이션과 BindingResult 객체를 사용해 검증을 진행한다.

 

3. question_detail.html 수정

question_detail에 댓글 입력에 오류가 발생하면 오류 메시지를 출력시킬 수 있도록 html파일을 수정한다.

<form th:action="@{|/answer/create/${question.id}|}" th:object="${answerForm}" method="post" class="my-3">
    <div class="alert alert-danger" role="alert" th:if="${#fields.hasAnyErrors()}">
        <div th:each="err : ${#fields.allErrors()}" th:text="${err}" />
    </div>
    <textarea th:field="*{content}" rows="10" class="form-control"></textarea>
    <input type="submit" value="답변등록" class="btn btn-primary my-2">
</form>

 

 

4. QuestionController 수정

question_detail에서 AnswerForm 객체를 사용하기 때문에 QuestionController의 detail에서 AnswerForm으로 교체하여 준다.

@RequestMapping(value = "/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id, AnswerForm answerForm) {
    Question question = this.questionService.getQuestion(id);
    model.addAttribute("question", question);
    return "question_detail";
}

결과화면