728x90
반응형
SMALL

답변 등록 기능에 폼 적용하기

 

앞서 질문 등록 폼에 했던 것처럼 답변 등록 폼에도 적용해보자.

아래 링크 참고

 

[Spring Boot] 16. 폼(Form) 활용하기(1)

만약 질문을 등록할 때 질문 내요을 비어 있는 값으로도 등록할 수 있다.하지만 이건 옳지 않는 방법이므로 아무것도 입력하지 않은 상태에서 질문이 등록될 수 없도록 해야한다.따라서 폼 클래

exuzii.tistory.com

 

/answer/AnswerForm.java

먼저 답변 폼 클래스 작성해보자.

package com.mysite.sbb.answer;

import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;

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

 

/answer/AnswerController.java

답변을 작성할 때 PostMapping된 메서드에서 바인딩 될 수 있도록 컨트롤러를 수정하자.

...
@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);
}
...

 

/templates/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>			
		</div>
		<textarea th:field="*{content}" rows="10" class="form-control"></textarea>
		<input type="submit" value="답변등록" class="btn btn-primary my-2">
	</form>
...

답변 등록 form의 입력 항목과 AnswerForm을 타임리프에 연결하기 위해 th:object 속성을 추가했다.

또 content 항목도 th:field 속성을 사용하도록 수정했다.

 

이제 답변을 작성하고 등록할 때 AnswerForm을 사용하기 위해 템플릿도 수정했으므로

QuestionController의 detail메서드도 수정해야 한다.

 

/qeustion/QuestionController.java

	@GetMapping(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";
	}

 

결과 테스트

먼저 질문 하나를 등록한다.

 

답변에 아무 내용을 입력하지 않고 답변등록을 누르면 오류가 나는 것을 확인할 수 있다.

728x90
반응형
LIST

+ Recent posts