게시판 5

JIWOO YUN·2024년 4월 22일
0

게시판만들기

목록 보기
5/21
post-custom-banner

질문 등록 기능 추가

  • 질문 등록 버튼을 추가해서 질문을 직접 등록할 수 있게 추가하자.
  • /question/create로 매핑 진행
  • 폼을 활용해서 입력값을 체크 진행
    • Vaildation 라이브러리를 추가

QuestionForm

@Getter
@Setter
public class QuestionForm {

    @NotEmpty(message = "제목은 필수 항목입니다.")
    @Size(max = 50)
    private String subject;


    @NotEmpty(message = "내용은 필수입니다.")
    private String content;
}

questionForm을 이용해서 질문 생성

@PostMapping("/create")
public String questionCreate(@Valid QuestionForm questionForm,
                             BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "question_form";
    }
    questionService.create(questionForm.getSubject(), questionForm.getContent());
    return "redirect:/question/list";
}
  • bindingresult의 경우 valid 매개변수 뒤에 위치하기 -> 어떤 변수가 매개변수인지 체크용도
    • 만약 오류가 있을 경우 다시 돌아가게
    • 오류가 없다면 질문을 추가하고 list로 리다이렉트 진행

마찬가지로 answerForm을 만들고 답변 등록도 추가진행

  • 답변의 경우 Questiondetail에 있기 대문에 AnswerForm을 추가로 detail 부분에 넣어줘야한다.
@GetMapping("/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id,
                     AnswerForm answerForm) {
    Question question = questionService.getQuestion(id);
    model.addAttribute("question", question);
    return "question_detail";
}

페이징 기능 추가

  • JPA 관련 라이브러리에 페이징 패키지들이 들어있다.

페이징을 위한 Testjpa 로 작성

@SpringBootTest
class SbbApplicationTests {

   @Autowired
   private QuestionService questionService;


   @Test
   void testJpa(){

      for(int idx =1; idx <=300;idx++){
         String subject = String.format("테스트 데이터 입니다:[%03d]",idx);
         String content = "내용무";
         questionService.create(subject,content);
      }
   }
}

QuestionRepository 페이징을 위한 findAll 추가

Page<Question> findAll(Pageable pageable);

QuestionService에서 repository에 만들 페이지 전제조회 메서드를 사용해서 페이지 번호를 입력받아 해당 페이지의 page 객체를 리턴하도록 진행.

public Page<Question> getList(int page){
    Pageable pageable = PageRequest.of(page,10);
    return questionRepository.findAll(pageable);
}
  • PageRequest.of(page,10)
    • page : 조회할 페이지의 번호
    • 10 : 한페이지에 보여줄 게시물의 개수
  • 페이징기능부터 진행

페이지 이동 기능 추가 - question_list 부분에 추가

<ul class="pagination justify-content-center">
    <li class="page-item" th:classappend="${!paging.hasPrevious} ? 'disabled'">
        <a class="page-link"
           th:href="@{|?page=${paging.number-1}|}">
            <span>이전</span>
        </a>
    </li>
    <li th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}"
        th:classappend="${page == paging.number} ? 'active'"
        class="page-item">
        <a th:text="${page}" class="page-link" th:href="@{|?page=${page}|}"></a>
    </li>
    <li class="page-item" th:classappend="${!paging.hasNext} ? 'disabled'">
        <a class="page-link" th:href="@{|?page=${paging.number+1}|}">
            <span>다음</span>
        </a>
    </li>
</ul>

최신 날짜 순 정렬 - Sort 함수 이용

public Page<Question> getList(int page){
    List<Sort.Order> sort = new ArrayList<>();
    sort.add(Sort.Order.desc("createDate"));
    Pageable pageable = PageRequest.of(page,10,Sort.by(sort));
    return questionRepository.findAll(pageable);
}

게시물 번호

  • 전체 게시물 개수 - (현재페이지 * 페이지당 게시물 개수) - 나열 인덱스
    • 게시물의 번호 맞춰주기.

답변 개수 표시하기

  • 전에 question 객체에 만들어둔 answerList를 가져와서 표시하는데 사용하자.
  • N+1문제가 발생할 수 있기 때문에 answer에서 question 객체 부분에 LazyLoding을 걸어두고 answerList에는 @JsonIgnore를 걸자.

answer 부분에 manytoone lazy 추가

@ManyToOne(fetch = FetchType.LAZY)
private Question question;
profile
열심히하자
post-custom-banner

0개의 댓글