티스토리 뷰

Project 댕린이집

[게시판] 조회수

xoo | 수진 2024. 6. 27. 09:38

게시판의 기본 CRUD 기능은 끝났으니 이제 부가적인 기능을 넣어보겠습니다.

부가적인 기능으로는 조회수, 좋아요, 댓글, 대댓글 정도를 구현해 볼 생각이구요.

먼저 조회수 기능부터 추가해보겠습니다.

 


 

 [ 클라이언트 ] 

BoardList.js 

 

BoardView.js

 

조회수를 출력해줄수있는 부분을 작성해줍니다.

 

 


 

 

 [ 서버 ]  

BoardEntity.java

  • columnDefinition = "integer default 0”
    조회수의 기본값은 0 이라는 코드를 추가해줍니다.

BoardDTO.java

추가 X

 

BoardRepository.java

package com.example.demo.repository;

import com.example.demo.entity.BoardEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {

    @Modifying
    @Transactional
    @Query("update board b set b.views = b.views + 1 where b.id = :id")
    int updateView(@Param("id") Long id);

}

이 메서드는 JpaRepository 인터페이스에 정의된 기본 메서드가 아니므로 직접 구현해줍니다.

  • @Modifying: 이 어노테이션은 해당 쿼리가 데이터를 수정하는 작업임을 나타냅니다. Spring Data JPA는 기본적으로 읽기 전용 쿼리를 실행하므로, 데이터를 수정하는 작업에는 @Modifying 어노테이션을 추가해야 합니다.
  • @Transactional: 이 어노테이션은 해당 메서드가 트랜잭션 내에서 실행됨을 나타냅니다. JPA의 경우 데이터베이스 트랜잭션 내에서 쿼리를 실행해야 합니다. 
  • @Query("update board b set b.views = b.views + 1 where b.id = :id"): 이 어노테이션은 JPQL(Java Persistence Query Language) 쿼리를 사용하여 데이터베이스 엔티티를 업데이트하는 쿼리를 정의합니다. 여기서 update 키워드를 사용하여 board 엔티티의 views 필드를 1씩 증가시키는 쿼리를 정의하고 있습니다. 
  • int updateView(@Param("id") Long id)@Query 어노테이션에 정의된 JPQL 쿼리를 실행합니다. 이 메서드는 주어진 게시글 ID에 해당하는 게시글의 조회수를 1 증가시키는 쿼리를 실행합니다.

 

BoardService.java

	// 조회수
	public int updateView(Long id) {
		return boardRepository.updateView(id);
	}

BoardRepository 인터페이스의 updateView 메서드를 호출하여 조회수를 업데이트합니다.

 

BoardController.java

	/**
	 기능 : 게시글 목록 및 상세보기
	 url : /board
	 request data : id (optional)
	 response data : 게시글 목록 또는 특정 게시글 상세정보
	 */
	@GetMapping("/board")
	public Object board(@RequestParam(name = "id", required = false) Long id) {
		if (id == null) {
			// 게시글 목록 반환
			return boardService.board();
		} else {
			// 특정 게시글 상세 정보 반환 및 조회수 증가
			boardService.updateView(id);
			return boardService.boardDetail(id);
		}
	}
  • boardService.updateView(id);
    특정 게시글을 상세조회 했을 때 서비스단의 updateView 메서드를 실행하여 조회수가 업데이트 될 수 있도록 합니다.

 


💻 [ 결과 ]  

특정 게시글을 조회했을 때 조회수가 증가는 되지만, +1 이 아닌 +2씩 되는 문제점이 있습니다.

 

 


 

 

💣 [ 트러블 슈팅 ]  조회수가 +2씩 증가되는 이슈 

문제

 

특정 게시글을 조회했을 때 조회수가 +2씩 증가되는 문제가 있습니다.

콘솔창을 보니 애초에 두번씩 렌더링 되는 것을 확인할 수 있었습니다.

 

원인

먼저 useEffect가 몇 번씩 호출되나 확인해보려고 로그를 찍어봤습니다.

 

확인해본 결과 useEffect는 한 번씩 잘 호출되고 있습니다.

그럼 무엇이 원인일까요..

구글링을 하여 해결할 수 있었는데 원인은 React Strict Mode 였습니다!

React Strict Mode는 개발 중에 잠재적인 문제를 발견하기 위해 일부 라이프사이클 메서드를 두 번 호출합니다. 이를 해결하기 위해 Strict Mode를 제거하거나, 배포 환경에서 확인할 수 있다고 합니다.

 

해결

  • Strict Mode 비활성화: Strict Mode를 제거하여 두 번 렌더링되는 문제를 해결할 수 있습니다.
  • 배포 환경에서 확인: 배포 환경에서는 Strict Mode가 비활성화되므로, 두 번 호출되는 문제가 발생하지 않습니다.

일단 개발 모드이기 때문에 index.js에서 Strict Mode를 주석처리 해주었습니다.

 

 

💻 [ 결과 ]  

+1 씩 증가되는 것을 확인할 수 있습니다.

'Project 댕린이집' 카테고리의 다른 글

[게시판] 댓글  (0) 2024.06.29
[게시판] 좋아요  (0) 2024.06.28
[게시판] 게시글 삭제  (0) 2024.06.26
PUT vs POST  (0) 2024.06.25
[게시판] 게시글 수정(2)  (0) 2024.06.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함