최근에 개인 프로젝트를 진행하면서 조회수 증가 로직을 해당 게시글을 작성한 유저만 조회수 가 증가하지 않게 설정하였습니다.
하지만 위의 사진에 보이듯이 NullPointException 문제가 발생하였고 당장 기능을 구현하기가 급급해서 굴러가게만 만들어 놨습니다.
그래서 저는 글의 작성자, 다른 유저, 익명 사용자 모두 조회 수를 증가하게 하지만 중복방지를 구현해보고 싶었습니다.
제가 알고 있던 방법은 총 두가지 였습니다
세션 vs 쿠키
1. 세션
우선 세션 방식을 생각 했습니다.
세션의 특징은 사용자 정보를 서버에서 관리하는 것입니다.
장점
1. 사용자 정보를 서버에 둔다는 뜻은 쿠키보다 보안에 좋습니다.
단점
2. 서버에 데이터를 저장한다는 것은 서버의 리소스를 사용하는 것 이기 때문에 세션 양이 많아진다면 서버에 부하가 커집니다. -> 이는 비용, 성능과 직결될 수 있는 문제가 발생 가능합니다.
2. 쿠키
쿠키는 웹사이트에 접속할 때 생성되는 정보를 담은 임시 파일입니다.
쿠키의 데이터 형태는 Key와 Value 로 구성되어이있고 String 형태로 이루어져 있습니다.
장점
1. 서버의 공간이 절약 가능합니다. -> 이는 서버의 비용, 성능 개선에 도움이 됩니다.
단점
1. 개인의 정보가 기록된다면 사생활을 침해할 소지가 있습니다.
2. 서버가 가지고 있는 것이 아니라 사용자에게 저장되기 때문에, 임의로 고치거나 지우는 것이 가능하고, 가로채기도 쉬어 보안에 취약해집니다.
도대체 뭘 골라야 하지...?
전 두개의 방법을 장단점을 비교하며 구현 해보려 했지만 두 개의 방법 중 쿠키가 더 낫다는 생각을 했습니다.
하지만....
최근에 이런 글을 확인했습니다.
물론, 우리가 발급하는 것은 퍼스트파티 쿠키 이기에 문제가 없을 테지만, 최근 동향을 보면 사용자들은 쿠키의 설정을 차단으로 보통 해놓는 추세 인 것 같았습니다.
그래서 저는 다른 방법을 찾다가 Redis 로 조회수 증가의 중복 방지를 구현할 수 있는 글을 확인했습니다.
나의 유일한 희망 Redis
Redis는 Remote Dictionary Server 의 약자로, key-value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스(NoSQL) 관리 시스템입니다. 저장소, 캐시, 메시지 브로커로 자주 사용되며, 보통은 캐시의 용도나 세션 저장소 등의 용도로 많이 쓰이는 소프트웨어입니다.
Redis 로 동시성도 제어가 가능하다고 합니다.
바로 Redis를 활용한 분산 락(Distributed Lock)을 활용하면 됩니다.
분산 락(Distributed Lock)?
이름 그대로 분산된 서버 또는 데이터 베이스 환경에서도 동시성을 제어할 수 있는 방법
사실 반드시 Redis를 활용해서 분산 락을 구현할 필요는 없습니다. MySQL의 네임드 락 등을 통해서도 충분히 구현이 가능합니다.
오히려 이 쪽이 메모리 자원을 추가로 사용할 필요가 없다는 장점을 가집니다.
그러나 기본적으로 디스크를 사용하는 데이터베이스 보다 메모리를 사용하는 Redis 가 더 빠르게 락을 획득 및 해제가 가능하기 때문에, 이번 구현에서는 Redis로 동시성을 제어할 생각입니다.
이번 글에서는 개념만 설명하고 다음 포스팅에서는 구현하는 것 까지 포스팅해서 올리겠습니다
[다음 포스팅] (구현)
https://yooseong12.tistory.com/54
참고 블로그
'오류 > 트러블슈팅' 카테고리의 다른 글
SpringBoot+Redis 를 사용해서 조회수 중복방지 구현해보기 -2(구현) (4) | 2023.09.03 |
---|