3/28 TIL - 리팩토링 및 기능 추가

큰모래·2023년 3월 28일
0

점프투스프링부트 리팩토링 및 기능추가


N+1 문제

  • 질문 목록 페이지를 조회할 때, 질문 엔티티의 수만큼 답변 엔티티를 조회하는 쿼리 발생
  • 2번째 사진의 쿼리처럼, 질문 엔티티가 참조하는 답변 엔티티를 질문 개수만큼 조회한다. (사진에는 짤렸지만 아래 조회 쿼리가 더 있다.)

해결방법

  • application.properties 에 아래 라인을 추가했다.
  • 해당 구문은, 상위 엔티티의 조회 개수 만큼 하위 엔티티를 묶어서 조회하게 만들어준다.(최대 1000개까지 묶을 수 있다.)
  • 쿼리를 보면 in절을 통해 묶어서 쿼리를 생성한 것을 확인할 수 있다.
  • 이를 통해 DB 접근 횟수를 줄이고, 최적화할 수 있다.
spring.jpa.properties.hibernate.default_batch_fetch_size=1000

javascript - confirm

  • 기존에 자바스크립트 코드를 통해 구현했던 것을 간략화했다.
  //기존코드
  <a href="javascript:void(0);" class="recommend btn btn-sm btn-outline-secondary"
	th:data-uri="@{|/question/delete/${question.id}|}">

  <script layout:fragment="script" type='text/javascript'>
      const delete_elements = document.getElementsByClassName("delete");
      Array.from(delete_elements).forEach(function(element) {
          element.addEventListener('click', function() {
              if(confirm("정말로 삭제하시겠습니까?")) {
                  location.href = this.dataset.uri;
              };
          });
      });
  </script>
    
  //수정코드
   <a onclick="return confirm('정말로 삭제하시겠습니까?');" class="recommend btn btn-sm btn-outline-secondary"
    	th:href="@{|/question/delete/${question.id}|}">
    

3-15 (3) 카테고리

Category

  • 카테고리 분류를 enum 클래스로 해보기로 결정했다.(뭔가 간단할 것 같은 느낌??)
  • 카테고리는 FREE(자유)와 IT 카테고리 두 개가 있다.
  • 질문 글을 올릴 때 카테고리를 선택하게 만들 것!
public enum Category {
    FREE, IT
}

Question - 추가

  • @Enumerated(EnumType.STRING)
    • enum 타입 필드를 문자열로 매핑한다.
 	@Enumerated(EnumType.STRING)
    private Category category;

QuestionForm - 추가

  • 컨트롤러와 뷰사이에서 데이터를 전송하는 QuestionForm 에도 category 를 추가
private Category category;

QuestionService - 추가

  • questionRepository에 저장할 때 category도 세팅해야한다.
  • category 매개변수는 당연히 컨트롤러로부터 받아옴
	public void create(String subject, String content, Category category,
    					SiteUser author) {
        Question question = new Question();
        question.setSubject(subject);
        question.setContent(content);
        question.setCreateData(LocalDateTime.now());
        question.setAuthor(author);
        question.setCategory(category);

        questionRepository.save(question);
    }

QuestionController - 추가

  • 질문글 작성버튼을 눌렀을 때 작성하는 post 메서드
  • 폼으로 부터 받아온 category를 매개변수로 questionService.create()에 넘겨준다.
questionService.create(questionForm.getSubject(), questionForm.getContent(), 
						questionForm.getCategory(), user);

question_form - 추가

업로드중..

	<h6 class=" ">카테고리 선택</h6>
    <div class="border-bottom pb-2">
      <select th:field="*{category}">
        <option th:each="cat : ${T(com.mysite.sbb.category.Category).values()}"
                th:value="${cat}" th:text="${cat}"></option>
      </select>
    </div>

    <div class="my-3 mb-3">
  • 게시글 목록도 아래 캡처와 같이 분류(카테고리)를 넣었음

profile
큰모래

0개의 댓글