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
'개발 수업 > Spring Boot' 카테고리의 다른 글
[SpringBoot] Thymeleaf(타임리프) 사용(유효성검사, 네비게이션바) (0) | 2023.08.28 |
---|---|
[SpringBoot] QnA게시판 질문 등록 (0) | 2023.08.27 |
[SpringBoot] 부트스트랩5 적용 (0) | 2023.08.24 |
[SpringBoot] thymeleaf 타입별 사용법/thymeleaf 템플릿 기능 (0) | 2023.08.24 |
[SpringBoot] 목록조회, 상세조회 (0) | 2023.08.24 |