본문 바로가기
[Spring Boot]

[스프링부트] 게시판 만들기 - 카테고리 추가하기

by 슬쨩! 2024. 1. 23.

[구현 화면]

 

 

 

 

[수정할 부분 요약]

1. Question에 category 추가하기

2. QuestionForm에서 category 추가하기

3. QuestionService에서 category 추가하기

4. QuestionController에서 create - category 및 modiefy-category 추가

5. question_form.html 카테고리 셀렉트 추가

6. question_list.html 카테고리 추가하기

 

 

[1단계 : Question에 category 추가하기 ]

 

private String category;

 

[2단계 : QuestionForm에 category 추가하기 ]

@NotBlank(message="선택해주세요")

private String category;

 

 

[3단계 : QuestionService에서 category 추가하기 ]

*2가지 영역에 추가하기

*DB에 저장함

public void create(String subject, String content, SiteUser user, String category){

Question q=new Question();

q.setSubject(subject);

q.setContent(content);

q.setCreateDate(LocalDateTime.now());

q.setAuthor(user);

q.setCategory(category);

this.questionRepository.save(q);

 

}

 

public void modify(Question question, String subject, String content, String category) {

question.setSubject(subject);

question.setContent(content);

question.setModifyDate(LocalDateTime.now());

question.setCategory(category);

this.questionRepository.save(question);

}

 

[4단계 : QuestionConroller에 category 추가하기 ]

* 총 3개의 영역을 추가해야한다.

@PreAuthorize("isAuthenticated()")

@PostMapping("/create")

public String questionCreate(@Valid QuestionForm questionForm, BindingResult bindingResult, Principal principal) {

if (bindingResult.hasErrors()) {

return "question_form";

}

SiteUser siteUser=this.userService.getUser(principal.getName());

this.questionService.create(questionForm.getSubject(), questionForm.getContent(), siteUser, questionForm.getCategory());

return "redirect:/question/list";

}

 

 

@PreAuthorize("isAuthenticated()")

@GetMapping("/modify/{id}")

public String questionModify(QuestionForm questionForm, @PathVariable("id") Integer id, Principal principal) {

Question question=this.questionService.getQuestion(id);

if(!question.getAuthor().getUsername().equals(principal.getName())) {

throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");

}

questionForm.setSubject(question.getSubject());

questionForm.setContent(question.getContent());

questionForm.setContent(question.getCategory());

return "question_form";

}

 

 

@PreAuthorize("isAuthenticated()")

@PostMapping("/modify/{id}")

public String questionModify(@Valid QuestionForm questionForm, BindingResult bindingResult,

Principal principal, @PathVariable("id") Integer id) {

if (bindingResult.hasErrors()) {

return "question_form";

}

Question question = this.questionService.getQuestion(id);

if (!question.getAuthor().getUsername().equals(principal.getName())) {

throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");

}

this.questionService.modify(question, questionForm.getSubject(), questionForm.getContent(), questionForm.getCategory());

return String.format("redirect:/question/detail/%s", id);

}

 

 

[5단계 : qustion_form.html 파일에 category 추가하기 ]

*셀렉트를 사용하여 카테고리를 생성하였다.

<div class="mb-3">

<select th:field="*{category}" class="form-select">

<option value="">카테고리를 선택해주세요</option>

<option value="가입인사">가입인사</option>

<option value="등업요청">등업요청</option>

<option value="자유게시판">자유게시판</option>

</select>

</div>

 

제목위에 추가

 

[6단계 : qustion_list.html 파일에 category 추가하기 ]

질문 리스트에서 카테고리 열과 데이터를 보여줄 행을 추가하였다.

table class="table">

<thead class="table-dark">

<tr class="text-center">

<th>번호</th>

<th style="width:50%">제목</th>

<th>카테고리</th>

<th>글쓴이</th>

<th>작성일시</th>

</tr>

</thead>

<tbody>

<tr class="text-center" th:each="question, loop : ${paging}">

<td th:text="${paging.getTotalElements - (paging.number * paging.size) - loop.index}"></td>

<td class="text-start">

<a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>

<span class="text-danger small ms-2"

th:if="${#lists.size(question.answerList) > 0}"

th:text="${#lists.size(question.answerList)}">

</span>

</td>

<td><span th:text="${question.getCategory()}"></span></td>

<td><span th:if="${question.author != null}" th:text="${question.author.username}"></span></td>

<td th:text="${#temporals.format(question.createDate, 'yyyy-MM-dd HH:mm')}"></td>

</tr>

</tbody>

</table>

 

 

[완성]

 

 

[게시판  동작 순서]