본문 바로가기
개발 수업/Spring Boot

[SpringBoot] 게시판 상세조회 댓글 수/댓글 출력

by 오늘 하루s 2023. 8. 27.
728x90
더보기

Day82. 230825

 

AnswerController>

package com.mycom.app.answer.controller;

import com.mycom.app.answer.service.AnswerService;
import com.mycom.app.question.entity.Question;
import com.mycom.app.question.service.QuestionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
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;
    private final AnswerService answerService;

    /*요청방식
    요청주소 /answer/add/10 질문번호*/
    //답변등록처리
    @PostMapping("/add/{id}")
    public String addAnswer(@PathVariable("id") Integer id,@RequestParam("content") String content){
        //1.파라미터받기-id:질문번호,content-답변내용
        //2.비지니스로직
        //특정글번호의 질문상세 가져오기=>Answer테이블의 fk에 해당하는 질문객체
        /*Answer 엔티티의 속성으로 @ManyToOne private Question question 존재*/
        Question question= questionService.getQuestion(id); //특정글번호의 질문상세조회
        answerService.add(question,content);
        //3.Model
        //4.View
        return String.format("redirect:/question/detail/%d",id); //question_detail
    }
}

String.format("redirect:/question/detaill/%s",id) : id를 문자열화

 

 

AnswerService>

package com.mycom.app.answer.service;

import com.mycom.app.answer.entity.Answer;
import com.mycom.app.answer.repository.AnswerRepository;
import com.mycom.app.question.entity.Question;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@RequiredArgsConstructor
@Service
public class AnswerService {
    private final AnswerRepository answerRepository;

    //답변등록처리
    public void add(Question question,String content){
        Answer answer = new Answer();
        answer.setContent(content);
        answer.setCreateDate(LocalDateTime.now());
        answer.setQuestion(question); //fk격에 해당하는 질문 객체
        answerRepository.save(answer);
    }

}

 

AnswerRepository>

package com.mycom.app.answer.repository;

import com.mycom.app.answer.entity.Answer;
import org.springframework.data.jpa.repository.JpaRepository;

//Repository는 Entity에 의하여 생성된 db에 접근하여 작업하는 여러 메서드들로 구성된 interface이다.
//=>CRUD

//JpaRepository인터페이스를 상속하고 있다.
//<Repository의 대상이 되는 Entity타입,Entity타입의 PK타입>
//여기에서는 <Question,Integer> Repository의 대상이 되는 Answer의 PK는 Integer
public interface AnswerRepository extends JpaRepository<Answer,Integer> {
}

 

question_detail.html>

<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
    <!--질문-->
    <h2 class="border-bottom py-2" th:text="${question.subject}"></h2>
    <div class="card my-3">
        <div class="card-body">
            <div class="card-text" style="white-space:pre-line;" th:text="${question.content}"></div>
            <div class="d-flax justify-content-end">
                <div class="badge bg-light text-dark p-2 text-start" th:text="${#temporals.format(question.createDate,'yyyy-MM-dd HH:mm')}"></div>
            </div>
        </div>
    </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 id="answerForm" class="my-3" th:action="@{|/answer/add/${question.id}|}" method="post" >
        <!--에러출력영역-->
        <div>에러출력영역</div>
        <textarea name="content" rows="8" class="form control"></textarea>
        <input type="submit" value="답변등록" class="btn btn-primary my-2"/>
    </form>

</div>

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

대답목록의 리스트들을 불러옴.( #lists를 #list로 쓰면 오류가 뜨므로 주의)

728x90