게시글 상세 페이지 구현중 보여야 하는 정보들을 나열해 보는데 게시글의 조회수가 필요했기 때문에 조회수 기능을 구현해보기로 했다.
처음에는 조회수 기능을 어떻게 구현해야 하지 막막했었는데 생각보다 간단하게 구현할 수 있었다.
조회수 기능 구현 과정
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를 사용하지 않고 파일을 관리하는 최선의 방법을 찾아봐야겠다.
'성장이야기 > TIL' 카테고리의 다른 글
221031 TIL @OneToMany, @ManyToOne (feat. mappedby) (0) | 2022.10.31 |
---|---|
221030 TIL Spring Boot AWS S3 연동해서 파일 업로드 하기 (S3 Bucket 생성부터 연동까지) (0) | 2022.10.30 |
221028 TIL REST API URI설계 (0) | 2022.10.28 |
221027 TIL 게시글 출력하기 (feat. SQL 예약어 Like) (0) | 2022.10.27 |
221026 TIL KiCK OFF (0) | 2022.10.26 |