포트폴리오/SPRINGBOOT 옛날

2-11 : Answer Create

서버관리자 페페 2022. 10. 1. 22:02

단 하나의 맥락

: 각 질문 상세페이지 내 답변 등록 form을 설정하고, post된 답변을 표시한다

 


 

Semiflow Bundle

- 등록 form(submit button) 만들기

- AnswerController를 만들고 Post URL 매핑

- AnswerService를 통해 답변 저장하기(컨트롤러에 연결)

- 질문 상세페이지에 답변 표시하기

 


 

자각

 

-

 

질문 create form과 버튼은

- question_detail.html 질문 단 아래에

- <form th:action="@{|/answer/create/${question.id}|}" method="post"></form> 사이에

- <textarea name="content" id="content" rows="15"></textarea>

- <input type="submit" value="답변등록"> 을 넣어 form을 완성한다

 

-

 

답변등록 Post 요청을 처리하기 위해

- AnswerController를 신규 작성

- public String createAnswer() 메소드에

- @PostMapping("/create/{id}") 적용

- signal로는 (Model model, @PathVariable("id") Integer id, @RequestParam String content) 가 필요

- A1 : Question question = this.questionService.getQuestion(id);

- A2 : 서비스에 답변을 만들어 저장하고

- A3 : return String.format("redirect:/question/detail/%s", id); 로 리다이렉팅

 

 

 

 

package com.mysite.sbb.answer;

import com.mysite.sbb.question.Question;
import com.mysite.sbb.question.QuestionService;
import lombok.RequiredArgsConstructor;
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;

@RequestMapping("/answer")
@RequiredArgsConstructor
@Controller
public class AnswerController {

    private final QuestionService questionService;

    @PostMapping("/create/{id}")
    public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam String content) {
        Question question = this.questionService.getQuestion(id);
        // TODO: 답변을 저장한다. 
        return String.format("redirect:/question/detail/%s", id);
    }
}

 

-

 

답변을 저장하기 위해

> AnswerService에 

- public void create()를 작성

- signal로는 (Question question, String content)가 들어가며

- Question은 "import com.mysite.sbb.question.Question;" 으로 P/I 가 필요하다

- A1 : Answer answer = new Answer();

- A2 : answer.setContent(content);

- A3 : answer.setCreateDate(LocalDateTime.now());

- A4 : setQuestion(question);

- A5 : this.answerRepository.save(answer);

 

package com.mysite.sbb.answer;

import com.mysite.sbb.question.Question;
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);
    }
}

 

- 만들어진 서비스를 컨트롤러에 기재한다

- 답변은 QuestionService와 AnswerService 두 가지가 필요하다

 

(... 생략 ...)
public class AnswerController {

    private final QuestionService questionService;
    private final AnswerService answerService;

    @PostMapping("/create/{id}")
    public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam String content) {
        Question question = this.questionService.getQuestion(id);
        this.answerService.create(question, content);
        return String.format("redirect:/question/detail/%s", id);
    }
}

 

Create된 답변을 표시하기 위해

> question_detail.html 에

- 답변은 질문 제목과 내용, 추가 답변 등록 폼 사이에 기재된다

- <h5 th:text="|${#lists.size(question.answerList)}개의 답변이 있습니다.|"></h5>

- <div></div> 공간 안에

- <ul></ul> 리스트를 넣고

- <li th:each="answer : ${question.answerList}" th:text="${answer.content}"></li> 로 답변들을 갯수만큼 표시한다

'포트폴리오 > SPRINGBOOT 옛날' 카테고리의 다른 글

2-13 : BootStrap  (2) 2022.10.02
2-12 : Static Directory and CSS  (1) 2022.10.02
2-10 : 질문 리스트 > 질문 상세  (1) 2022.10.01
2-09 : Service  (4) 2022.10.01
2-08 : redirecting to ROOT URL  (1) 2022.10.01