1. 프로젝트 개요
제목 : 덕후감
부제 : 도서 이미지 OCR 및 ISBN 매칭 서비스
소개 : 책 읽는 즐거움을 공유하고, 지식과 감상을 나누는 책 덕후들의 커뮤니티 서비스
기술 스택
2. 담당한 작업
대시보드 관리
인기 도서
기간 별(일간, 주간, 월간, 역대) 인기 도서 순위를 구합니다.
연산은 매일 배치로 수행합니다.
도서의 점수는 해당 기간의 리뷰수, 평점을 기준으로 적절히 연산합니다.
인기 리뷰
기간 별(일간, 주간, 월간, 역대) 인기 리뷰 순위를 구합니다.
연산은 매일 배치로 수행합니다.
리뷰의 점수는 해당 기간의 좋아요 수, 댓글 수를 기준으로 적절히 연산합니다.
파워 유저
기간 별(일간, 주간, 월간, 역대) 활동 점수에 따른 파워 유저 순위를 구합니다.
연산은 매일 배치로 수행합니다.
유저의 활동 점수는 해당 기간에 작성한 리뷰의 인기 점수, 참여한 좋아요 수, 댓글 수를 기준으로 적절히 연산합니다.
추가 기능: spring batch, Redis 캐싱을 이용한 대시보드 최적화
3. 기술적 성과
응답 속도 75% 단축
: 실시간 DB 집계 방식에서
Redis 캐싱 및 사전 계산(Pre-computing)
방식으로 전환하여, 대시보드 조회 Latency를
20.3ms에서 4.9ms로 개선
함.
가중치 기반 랭킹 알고리즘 구현
: 리뷰 수, 평점, 좋아요, 댓글 수 등 도메인별 특성을 고려한
가중치 모델
을 설계하여 객관적인 인기 지표 산출 로직을 구축함.
시스템 관측성(Observability) 확보
:
Micrometer
를 도입하여 배치 작업의 수행 시간, 성공/실패 횟수를 메트릭화함으로써 운영 단계의 모니터링 기반을 마련함.
비동기 알림 시스템 연동
:
Kafka
를 활용하여 인기 리뷰어 선정 시 작성자에게 축하 알림을 비동기로 발송, 배치 프로세스의 안정성과 사용자 경험을 동시에 강화함.
4. 문제점 및 해결 과정
문제점: 대규모 데이터 집계 시 DB 부하 및 응답 지연 발생
현상
: 랭킹 산출을 위해 매 요청마다 PostgreSQL에서 복잡한
WINDOW FUNCTION
과
GROUP BY
연산을 실행하여 동시 접속 시 서버 리소스 급증 및 응답 속도 저하 확인.
해결
:
Spring Batch
를 도입하여 사용자 접속이 적은 새벽 1시(KST)에 랭킹을 미리 계산하도록 설계함. 계산된 결과는
Redis
에 적재하고, API는 메모리에서 즉시 서빙하는
Look-Aside
패턴을 적용하여 DB 부하를 원천 차단함.
문제점: 배치 갱신 시점과 캐시 데이터 간의 불일치(Inconsistency)
현상
: 배치가 돌아 DB 데이터가 바뀌어도 Redis에 기존 캐시가 남아있어 사용자가 과거의 랭킹을 보는 문제 발생.
해결
:
@CacheEvict
어노테이션을 활용하여 배치 Job이 성공적으로 완료되는 시점에 관련 캐시 키를 즉시 무효화(Invalidation)하도록 로직을 개선하여 데이터 정합성을 확보함.