221029 TIL 게시판 조회수 기능 구현하기

게시글 상세 페이지 구현중 보여야 하는 정보들을 나열해 보는데 게시글의 조회수가 필요했기 때문에 조회수 기능을 구현해보기로 했다.

처음에는 조회수 기능을 어떻게 구현해야 하지 막막했었는데 생각보다 간단하게 구현할 수 있었다.

 

조회수 기능 구현 과정

1. Post Entity

 

조회수를 위한 hit를 Long 타입으로 설정해주었다. 처음에는 조회수를 나타내는 건 자연수이기 때문에 int타입을 사용했었는데 생각해보니 id값도 자연수인데 Long타입을 사용하고 있었다.

원시 타입이 아닌 참조 타입을 사용하는 이유는 null값을 담기 위해서이다. 원시 타입인 int를 사용하면 값이 없을 때 0이 설정된다. 반면에 참조 타입인 Long은 값이 없으면 null을 담는다. 만일 값이 없을 때 0을 담게 되면 값이 들어간 것으로 착각할 수 있기 때문에 null로 표현한다.

그리고 Integer 타입이 아닌 Long타입을 사용하는 이유는 Long타입이 표현범위가 훨씬 크기 때문이다. 만일 표현하려는 범위가 작다면 Integer를 사용해도 괜찮지만 큰 게 좋으니 Long으로 하자

 

이러한 이유 때문에 조회수는 Long타입으로 설정 주었다. 근데 이렇게 하면 글을 작성할때 조회수가 null값으로 존재하지 않기 때문에 게시글을 클릭할때 마다 조회수를 늘리기 위해서는 +1을 해줘야 하는데 null에다 +1을 해줄 수가 없기 때문에 기본값으로 0을 설정해주어야 했다.

 

2. service

 

그 방법으로 약간 꼼수지만 글을 작성할때 조회수를 0으로 설정해주었다. 

근데 위에서 0을 담지 않기 위해 Long타입을 사용해놓고 왜 기본값을 0으로 했는지 이유는 밑에서 설명하겠다.

아무튼 글을 작성할때 조회수를 0으로 설정해주면 이제 연산이 가능해진다.

 

 조회수는 해당 게시글을 클릭했을 때 늘어나니까 해당 게시글을 GET 요청했을 때 조회수도 +1 해주면 되겠다 생각했다.

 

해당 게시글을 클릭했을때 받아온 게시글의 고유 id로 postRepository에서 게시글을 찾아온 다음 그 게시글의 조회수를 +1 하는 로직이다.

아까 조회수의 기본값을 0으로 해놓은 이유가 프론트엔드에서 게시글을 작성했을 때 바로 그 게시글의 상세페이지로 이동하게 해 놨기 때문에 작성하자마자 조회수는 1 카운트가 된다. 

기본값으로 1을 해놨을시 글 작성하자마자 조회수가 2가 되는 이상한 현상을 피하기 위해서였다.

 

사실 오늘 이미지 업로드 기능을 먼저 구현하려고 했다. 계획은 S3 스토리지에 이미지 업로드하고 관리하려고 하기 위해 아마존에 가입을 했는데 가입은 된 거 같은데 IAM 서비스에 접근이 되지 않는 상황이다.. 

IAM 서비스에 접근하면 계정이 등록이 완료되지 않았다고 메일을 확인하라는데 메일  온 게 없고.. 그래서 다른 계정도 만들어서 해봤는데 똑같아서 일단은 포기하고 이미지 업로드하는 다른 방법을 알아봤다.

DB에 직접 이미지를 저장하는 방법과 로컬 파일에 이미지를 저장하는 방법 등등 여러 가지 방법이 있었다. 내일은 한 번 더 아마존 사용을 시도해보고 안되면 s3를 사용하지 않고 파일을 관리하는 최선의 방법을 찾아봐야겠다.