점프 투 스프링부트를 참고하여 학습,작성하였습니다.
1.답변 텍스트란, 버튼 제작
question_detail.html에 다음 폼을 추가한다.
th:action="@{|/answer/create/${question.id}|}": Thymeleaf 속성으로, 폼이 제출될 URL을 지정한다.
method="post": 폼 제출 방식이 POST임을 지정합니다. 이는 서버에 데이터를 제출할 때 사용된다.
<form th:action="@{|/answer/create/${question.id}|}" method="post">
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변등록">
</form>
2.답변 Controller 제작
@PostMapping("/create/{id}"): /create/{id} 경로로 오는 POST 요청을 처리한다.
@PathVariable("id") Integer id: URL 경로에서 {id} 값을 추출하여 id 변수에 할당한다.
@RequestParam(value="content") String content: 요청 파라미터에서 content 값을 추출하여 content 변수에 할당한다.
package com.example.controller;
import com.example.model.*;
import com.example.service.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import lombok.RequiredArgsConstructor;
@RequestMapping("/answer")
@RequiredArgsConstructor
@Controller
public class AnswerController {
private final QuestionService questionService;
@PostMapping("/create/{id}")
public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam(value="content") String content) {
Question question = this.questionService.getQuestion(id);
return String.format("redirect:/question/detail/%s", id);
}
}
3.답변 서비스 제작
AnswerService 클래스는 사용자가 질문에 답변을 달 때 호출된다.. create 메서드는 새로운 Answer 객체를 생성하고, 답변 내용, 생성 날짜, 질문 정보를 설정한 후, AnswerRepository를 사용하여 데이터베이스에 저장한다.
package com.example.service;
import com.example.model.*;
import com.example.repository.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@RequiredArgsConstructor
@Service
public class AnswerService {
private final AnswerRepository answerRepository;
public void create(Question question, String content) {
Answer answer = new Answer();
answer.setContent(content);
answer.setCreateDate(LocalDateTime.now());
answer.setQuestion(question);
this.answerRepository.save(answer);
}
}
컨드롤러에 서비스를 사용한다.
package com.example.controller;
import com.example.model.*;
import com.example.service.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import lombok.RequiredArgsConstructor;
@RequestMapping("/answer")
@RequiredArgsConstructor
@Controller
public class AnswerController {
private final AnswerService answerService;
private final QuestionService questionService;
@PostMapping("/create/{id}")
public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam(value="content") String content) {
Question question = this.questionService.getQuestion(id);
this.answerService.create(question, content);
return String.format("redirect:/question/detail/%s", id);
}
}
4.답변표시
Thymeleaf 템플릿 코드는 질문에 달린 답변을 리스트로 표시하고,
제목 부분에서는 총 답변 개수를 표시하고, ul 리스트 내부에서 각 답변(li)을 출력한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
<h5 th:text="|${#lists.size(question.answerList)}개의 답변이 있습니다.|"></h5>
<div>
<ul>
<li th:each="answer : ${question.answerList}" th:text="${answer.content}"></li>
</ul>
</div>
<form th:action="@{|/answer/create/${question.id}|}" method="post">
<textarea name="content" id="content" rows="15"></textarea>
<input type="submit" value="답변등록">
</form>
</body>
</html>
'BackEnd > SpringBoot' 카테고리의 다른 글
[Spring Boot] 표준 HTML 구조 상속 (0) | 2024.07.03 |
---|---|
[Spring Boot] URL 프리픽스 생략 RequestMapping (0) | 2024.07.01 |
[SpringBoot] 상세 페이지제작 (0) | 2024.07.01 |