1. Status

2. Context

프로젝트 상세 조회 API(GET /api/projects/{id})에 조회수를 도입하면서 다음과 같은 문제가 예상되었다.

따라서 단순한 API 요청 횟수가 아니라, 일정 시간 동안 사용자의 중복 조회를 제외한 ‘의미 있는 조회’만 집계해야 했다.

또한 프로젝트에서 이미 Redis를 사용하고 있었기 때문에, Redis를 활용해 중복 조회를 빠르게 판별하고 DB 접근을 줄이는 방식으로 설계했다.

3. Problem

  1. 로그인 여부와 관계없이 동일 브라우저의 반복 조회를 어떻게 식별할 것인가?
  2. 중복 조회로 인한 불필요한 DB 쓰기를 어떻게 줄일 것인가?
  3. 동일 프로젝트에 대한 동시 요청에서도 조회수가 중복 증가하지 않도록 제어할 수 있는가?

4. Decision

다음과 같은 방식으로 프로젝트 조회수 증가 로직을 설계한다.

  1. Redis에 브라우저와 프로젝트별 조회 이력을 일정 시간 동안 기록한다.
  2. 동일 브라우저가 동일 프로젝트를 조회한 경우 30분에 최대 1회만 조회수를 증가시킨다.
  3. Redis의 SET NX EX 명령을 사용해 중복 조회 여부를 원자적으로 판단한다.
  4. Redis 키 등록에 성공한 요청에 한해 DB 조회수를 1 증가시킨다.

5. Rationale