question_list ์ ์ง๋ฌธ ๋ฑ๋กํ๊ธฐ ๋ฒํผ ๋ง๋ค๊ธฐ
ํ ์ด๋ธ ์๋์ ์ถ๊ฐํ๊ธฐ


QuestionController
//์ง๋ฌธ ๋ฑ๋กํ๊ธฐ
@GetMapping("/create")
public String questionCreate() {
return "question_form";
}

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout::head"></head>
<body>
<div class="container my-3">
<h5 class="border-bottom pb-2">์ง๋ฌธ๋ฑ๋ก</h5>
<form th:action="@{/question/create}" method="post">
<div class="mb-3">
<label for="subject" class="form-label">์ ๋ชฉ</label>
<input type="text" name="subject" id="subject" class="form-control" />
</div>
<div class="mb-3">
<label for="content" class="form-label">๋ด์ฉ</label>
<textarea
name="content"
id="content"
class="form-control"
rows="10"
></textarea>
</div>
<input type="submit" value="์ ์ฅํ๊ธฐ" class="btn btn-primary my-2" />
</form>
</div>
</body>
</html>

name=conetnet, subject๋ก ๋์ด๊ฐ

QuestionController
//์ง๋ฌธ ๋ฑ๋ก ์ฒ๋ฆฌํ๊ธฐ
@PostMapping("/create")
public String questionCreate(@RequestParam String subject, @RequestParam String content) {
return "redirect:/question/list"; //์ง๋ฌธ ์ ์ฅ ํ ์ง๋ฌธ๋ชฉ๋ก์ผ๋ก ์ด๋
}
ํ๋ผ๋ฏธํฐ ์ ๋์ด์ค๋์ง ํ ์คํธํ๊ธฐ
@RequestParam String subject ์ @RequestParam(" subject ") String subject ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฐ
์ด๋ฆ์ด ๊ฐ์ผ๋ฉด ์๋ต๊ฐ๋ฅํ๋ค.


QuestionService
//์ง๋ฌธ ๋ฑ๋ก ์ฒ๋ฆฌ
public void create(String subject , String content) {
Question q = new Question();
q.setSubject(subject);
q.setContent(content);
q.setCreateDate(LocalDateTime.now());
this.qRepo.save(q);
}
QuestionController ์ ์๋น์ค ์ฐ๊ฒฐ
//์ง๋ฌธ ๋ฑ๋ก ์ฒ๋ฆฌํ๊ธฐ
@PostMapping("/create")
public String questionCreate(@RequestParam String subject,
@RequestParam String content) {
qService.create(subject, content);
return "redirect:/question/list"; //์ง๋ฌธ ์ ์ฅ ํ ์ง๋ฌธ๋ชฉ๋ก์ผ๋ก ์ด๋
}
ํ ์คํธํ๊ธฐ



์ ํจ์ฑ๊ฒ์ฌ
ํ์ฌ๋ ๊ณต๋ฐฑ์ผ๋ก ๋ฃ์ผ๋ฉด ๊ทธ๋๋ก ์์ฑ์ด ์๋ฃ๋๋ค ๊ทธ๋์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ ๊ฒ



โhttps://blog.naver.com/drv982/222921130167
์ง๋ฌธ ๋ฑ๋กํ๊ธฐ, ์ ํจ์ฑ ๊ฒ์ฌ
์ง๋ฌธ ๋ฑ๋ก์ ํ๋ ค๋ฉด ๋จผ์ "์ง๋ฌธ ๋ฑ๋กํ๊ธฐ" ๋ฒํผ์ ๋ง๋ค์ด์ผ ํ๋ค. ๋ค์์ฒ๋ผ ์ง๋ฌธ ๋ชฉ๋ก ํ๋จ์ ๋ฒ...
blog.naver.com
QuestionForm ์์ฑ

package com.mysite.sbb.question;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class QuestionForm {
@NotBlank(message = "์ ๋ชฉ์ ํ์ ์ฌํญ์
๋๋ค.")
@Size(max = 200, message = "์ ๋ชฉ์ 200์ ์ดํ์
๋๋ค.")
private String subject;
@NotBlank(message = "๋ด์ฉ์ ํ์ ํญ๋ชฉ์
๋๋ค.")
@Size(min = 10, message = "๋ด์ฉ์ 10์ ์ด์์
๋๋ค.")
private String content;
}
QuestionController ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ
//์ง๋ฌธ ๋ฑ๋ก ์ฒ๋ฆฌํ๊ธฐ
@PostMapping("/create")
public String questionCreate(@Valid QuestionForm questionForm, BindingResult result) {
if(result.hasErrors()) {
return"question_form"; //์ ํจ์ฑ ๊ฒ์ฌ ์๋ฌ
}
qService.create(questionForm.getSubject(), questionForm.getContent());
return "redirect:/question/list"; //์ง๋ฌธ ์ ์ฅ ํ ์ง๋ฌธ๋ชฉ๋ก์ผ๋ก ์ด๋
}
requestParam์ ๋ง๋ค์ด ๋์ queestionForm ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํจ
question_form.html ์๋ฌ๋ฉ์ธ์ง ์ถ๋ ฅํ๋๋ก form ์์
<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>
๊ฒ์ฆ์ ์คํจํ ๊ฒฝ์ฐ ์ค๋ฅ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ์ ์๋๋ก ์์ ํ๋ค.
#fields.hasAnyErrors๊ฐ true์ธ ๊ฒฝ์ฐ๋ QuestionForm ๊ฒ์ฆ์ด ์คํจํ ๊ฒฝ์ฐ์ด๋ค. QuestionForm์์ ๊ฒ์ฆ์ ์คํจํ ์ค๋ฅ ๋ฉ์์ง๋ #fields.allErrors()๋ก ๊ตฌํ ์ ์๋ค. ๋ถํธ์คํธ๋ฉ์ alert alert-danger ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ ๋ถ์ ์์ผ๋ก ํ์๋๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ค๋ฅ๋ฅผ ํ์ํ๊ธฐ ์ํด์๋ ํ์๋ฆฌํ์ th:object ์์ฑ์ด ๋ฐ๋์ ํ์ํ๋ค. th:object๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ ์์ฑ๋ค์ด QuestionForm์ ์์ฑ๋ค๋ก ๊ตฌ์ฑ๋๋ค๋ ์ ์ ํ์๋ฆฌํ ์์ง์ ์๋ ค์ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ ํ๋ฆฟ์ ์์ ๊ฐ์ด ์์ ํ ๊ฒฝ์ฐ QuestionController์ GetMapping์ผ๋ก ๋งคํํ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํด์ผ ํ๋ค. ์๋ํ๋ฉด question_form.html ํ ํ๋ฆฟ์ "์ง๋ฌธ ๋ฑ๋กํ๊ธฐ" ๋ฒํผ์ ํตํด GET ๋ฐฉ์์ผ๋ก ์์ฒญ๋๋๋ผ๋ th:object์ ์ํด QuestionForm ๊ฐ์ฒด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
https://blog.naver.com/drv982/222921130167
//์ง๋ฌธ ๋ฑ๋กํ๊ธฐ
@GetMapping("/create")
public String questionCreate(QuestionForm questionForm) {
return "question_form";
}
ํ ์คํธํ๊ธฐ

ํ์ฌ ์ํฉ์์๋
๋ง์ฝ ์ ๋ชฉ์ด๋ ๋ด์ฉ ์ค ํ๋๋ง ์ ๋ ฅํ๊ณ ์ ์ฅํ๊ธฐ๋ฅผ ๋๋ ์ ๋
์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๋๋ฉด์ ์ ๋ ฅํ๋ ๋ด์ฉ์ด ์ฌ๋ผ์ง๋ ํ์์ด ์ผ์ด๋๋ค.
๊ทธ๋์ ๊ทธ ๋ด์ฉ์ ์ ์งํ ์ ์๊ฒ input ํ๊ทธ๋ฅผ ์์ ํ ๊ฒ
<input type="text" th:field="*{subject}" class="form-control" />
<textarea th:field="*{content}" class="form-control" rows="10"></textarea>


'BACKEND > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฌ ์ฐฝ , ๋ค๋ธ๋ฐ ๋ชจ๋ํ (2) | 2023.11.09 |
|---|---|
| ๋ต๋ณ(Answer) ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ (0) | 2023.11.09 |
| ๋ถ๋ถ ๋ชจ๋ํ ( th:fragment / th:replace ) (0) | 2023.11.09 |
| ์ง๋ฌธ ๋ชฉ๋ก/์์ธ๋ณด๊ธฐ - ๋ถํธ์คํธ๋ฉ ์ ์ฉ (0) | 2023.11.09 |
| ์คํํฑ ๋๋ ํฐ๋ฆฌ์ ์คํ์ผ์ํธ (0) | 2023.11.09 |