SpringBoot · intelliJ · OracleDB · Thymeleaf
카테고리를 만들어보자.
1.질문 엔티티에 카테고리 컬럼 추가하기
Question.java
private String category; /*카테고리값 저장컬럼*/
2. form태그 안에 select option으로 선택박스 생성하기
question_form.html
<div>
<select th:field="*{category}" class="form-select">
<option value="">카테고리를선택해주세요</option> <!--선택안한 비어있는값-->
<option value="제로웨이스트">제로웨이스트</option>
<option value="리사이클링">리사이클링</option>
<option value="동물식물">동물·식물</option>
<option value="친환경정책">친환경정책</option>
<option value="자유게시판">자유게시판</option>
</select>
</div>
value값으로 테이블에 저장이됩니다. option태그 사이에는 화면에 보여지는 텍스트를 입력합니다.
*{...}
선택변수
th:field="*{}"
· th:object속성과 함께 th:field를 이용해서 HTML 태그에 멤버 변수를 매핑할 수 있다.
· th:field을 이용한 사용자 입력 필드는 id, name, value 속성 값이 자동으로 매핑된다.
· th:object와 th:field는 Controller에서 특정 클래스의 객체를 전달 받은 경우에만 사용 가능하다.
2. QuestionForm에 category 메서드 추가
QuestionForm.java
package com.gosari.repick_project.question;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@Setter
@Getter
public class QuestionForm {
@NotEmpty(message = "제목은 필수항목입니다.") /*Null허용치않음*/
@Size(max=200) /*최대길이200byte*/
private String subject;
@NotEmpty(message = "내용은 필수항목입니다.")
private String content;
/*카테고리메세지*/
@NotBlank(message = "카테고리선택은 필수항목입니다.")
private String category;
}
NotBlank로 공백을 포함한 빈값을 체크해, 카테고리 선택을 안한 빈값일 경우 메세지가 뜨게 만들었다.
@NotNull : Null 값 체크
@NotEmpty : Null, "" 체크
@NotBlank : Null, "", 공백을 포함한 빈값 체크
3. QuestionService 에 카테고리 추가
QuestionService.java
/*질문데이터를 저장하는 create메서드*/
public void create(String subject, String content, SiteUser user, String category){ /*카테고리추가*/
Question q = new Question();
q.setSubject(subject);
q.setContent(content);
q.setCreateDate(new Date());
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(new Date());
question.setCategory(category); //카테고리수정
this.questionRepository.save(question);
}
String category로 매개변수값을 추가하고,
q.setCategory(category); 도 추가해 값을 저장해줍니다.
질문을 만들고 저장하는 메서드인 create와 수정하는 메서드인 modify둘다 수정해줍니다.
3. QuestionController 에 카테고리 추가
QuestionController.java
/*질문등록하기*/
@PreAuthorize("isAuthenticated()") //추가
@GetMapping("/create")
public String questionCreate(QuestionForm questionForm) {
return "question_form";
}
/*질문등록하기*/
@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";
}
/*질문 수정하기 GET*/
@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.setCategory(question.getCategory());
return "question_form";
}
/*질문 수정하기 POST*/
@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);
}
questionCreate 에서 추가한부분 ↓
this.questionService.create(questionForm.getSubject(), questionForm.getContent(), siteUser,
questionForm.getCategory() );
questionModify(get매핑) 에서 추가한부분 ↓
questionForm.setCategory(question.getCategory());
questionModify(post매핑)에서 추가한부분 ↓
this.questionService.modify(question, questionForm.getSubject(), questionForm.getContent(), questionForm.getCategory() );
추가한 questionForm의 카테고리를 컨트롤러의 질문생성부분과 수정부분에 넣어줍시다.
4. 리스트화면과 상세화면(수정화면)에 카테고리값 출력
question_detail.html
<!--카테고리추가-->
<div class="p-1 bg-dark text-white" th:text="${question.category}"></div>
question_list.html
<!--카테고리값 텍스트로출력-->
<td><span th:text="${question.category}"></span></td>
'Follow Work > SpringbootBoard' 카테고리의 다른 글
[Springboot] 닉네임 만들기 [31] (0) | 2022.08.25 |
---|---|
[Springboot] 이전글 다음글 만들기 [30] (0) | 2022.08.25 |
[StringBoot] 조회수 만들기 [28] (2) | 2022.08.23 |
[StringBoot] 게시판 검색 (27) (0) | 2022.08.18 |
[StringBoot] 마크다운 (26) (0) | 2022.08.18 |