본문 바로가기
공부 및 정리/점프 투 스프링부트

점프 투 스프링부트 추가 기능 구현 - 조회수

by 스파이펭귄 2024. 1. 19.
728x90

https://wikidocs.net/162814의 추가 기능 구현 - 조회수

이 글은 점프 투 스프링부트의 3-13까지 구현을 마친것을 전제로 한다.


글의 조회수를 저장하는 기능을 만들어보자. 조회가 가능한 글은 Question 뿐이므로 먼저 Question Table에 조회수를 담을 Column을 추가해야 한다.

나는 views라는 조회수를 저장하는 변수를 Question Entity에 추가하였다. 기본값은 0으로 설정하였다.

public class Question {
        (...생략...)

        @Column(columnDefinition = "integer default 0")
        @NotNull
        private Integer views = 0;
}

 

 

QuestionService 클래스에 id를 받아 조회수를 1 증가시키는 함수를 만들어주자.

@Service
public class QuestionService {
        (...생략...)
      public void viewUp(Integer id) {
        Optional<Question> oq = this.questionRepository.findById(id);
        if (oq.isPresent()) {
            Question question = oq.get();
            question.setViews(question.getViews() + 1);
            this.questionRepository.save(question);
        } else {
            throw new DataNotFoundException("question not found");
        }
    }
}

이제 조회가 되는 부분인 QuestionController의 detail에서 QuestionService의 viewUp을 호출해주자.

public QuestionController(QuestionRepository questionRepository,
                          QuestionService questionService, UserService userService) {
        (...생략...)
        @GetMapping(value = "/detail/{id}")
    public String detail(Model model, @PathVariable("id") Integer id, AnswerForm answerForm) {
        this.questionService.viewUp(id); // 이 부분 추가
        Question question = this.questionService.getQuestion(id);
        model.addAttribute("question", question);
        return "question_detail";
    }
        (...생략...)
}

이제 question_list.html 코드에서 조회수를 표시해주자.

(...생략...)
        <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="${question.id}"></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:if="${question.author != null}" th:text="${question.author.username}"></span></td>
                <td th:text="${#temporals.format(question.createDate, 'yyyy-MM-dd HH:mm')}"></td>
                <td th:text="${question.views}"></td>
            </tr>
        </tbody>
    </table>

글을 보여주는 테이블에서 조회수 컬럼을 추가하고 question의 조회수를 보여주게 변경하였다.

조회수가 잘 표시되는 것을 확인할 수 있다.

 

전체 구현은 깃허브 참조.

728x90