현재 재직중인 회사에서는 B2B 솔루션이 대부분이다 보니 대용량 트래픽 프로젝트를 경험해볼 기회가 부족하여, 이전에 사용해보고 싶었던 기술 스택들도 사용하면서 공부하고자 해당 프로젝트를 진행하고자 한다.
뉴스 포털, 커뮤니티, 쇼핑몰 등 다양한 온라인 서비스에서는 "실시간 인기 콘텐츠" 기능이 핵심 UX 요소로 자리잡고 있습니다.
예를 들어, 다음과 같은 사례에서 이 기능이 유용하게 사용됩니다:
이처럼 사용자의 행동(조회, 클릭 등)을 수집하고, 실시간으로 인기 콘텐츠를 집계하여 제공하는 서비스는 트래픽이 많을수록 구조적 설계가 중요해집니다.
hot-board는 이러한 실시간 콘텐츠 집계 시스템을 직접 만들어보는 프로젝트입니다.
기술적 목표는 단순한 구현을 넘어 확장성, 실시간성, 안정성을 고려한 구조를 설계하고, 실무에 가까운 경험을 쌓는 데 있습니다.
시스템이 가져야 할 주요 요구사항은 다음과 같습니다:
| 분류 | 요구사항 | 설명 |
|---|---|---|
| 기능 | 콘텐츠 조회 기록 수집 | 사용자가 콘텐츠를 조회할 때 이벤트를 수집 |
| 기능 | 실시간 집계 처리 | 짧은 주기로 인기 콘텐츠를 재계산 |
| 기능 | 인기 콘텐츠 제공 API | 시간대별 인기 콘텐츠를 REST API로 제공 |
| 기능 | 콘텐츠 메타데이터 관리 | 콘텐츠 ID, 제목, URL 등의 정보 관리 |
| 비기능 | 확장성 | 트래픽 증가에 따라 수평 확장이 가능해야 함 |
| 비기능 | 고가용성 | 일부 컴포넌트 장애 시에도 서비스 유지 |
| 비기능 | 실시간성 | 수집부터 API 응답까지 1분 이내 지연 목표 |
| 비기능 | 모니터링 | 시스템 지표 수집 및 대시보드 구성 |
| 기술 | 선정 이유 |
|---|---|
| Java 21 + Spring Boot | 최신 LTS 버전으로 성능 개선 (가비지 컬렉션, 레코드 등) + 안정성과 생태계 지원 |
| Redis | 빠른 읽기/쓰기, TTL 기반 캐싱, 실시간 순위 계산에 적합 (ZSET 활용) |
| Kafka | 비동기 이벤트 스트리밍 처리, 조회 이벤트 분산 처리에 유리 |
| PostgreSQL | 복잡한 집계, JSONB, CTE 등 고급 쿼리 지원에 유리 |
| MySQL | 단순한 트랜잭션 처리나 운영 경험이 많은 환경에 적합 |
| → 선택 기준 | PostgreSQL은 복합 집계 쿼리에 강하고, MySQL은 간단한 구조에 강점. 이 프로젝트에서는 PostgreSQL 위주로 진행 예정 |
| Docker | 개발-운영 환경 일관성 확보 |
| GitHub Actions | 테스트/빌드/배포 자동화 |
| Prometheus + Grafana | 메트릭 수집 및 시각화, 알람 설정 |
| k6 | 실제 트래픽 시뮬레이션을 통한 부하 테스트 |
| Testcontainers, RestAssured | 통합 테스트 및 API 테스트 자동화 |
✏️ PostgreSQL vs MySQL은 직접 성능 비교 후 일부 기능에 대해 선택적으로 병행할 계획입니다.
| 단계 | 주요 목표 | 학습 포인트 |
|---|---|---|
| 1단계 | 요구사항 정의 및 기술 설계 | - 요구사항 도출 과정 정리 - 기술 스택 및 아키텍처 결정 |
| 2단계 | 모놀리식 구조 MVP 개발 | - API 설계 및 이벤트 수집 로직 구현 - Redis를 활용한 실시간 집계 구조 구성 |
| 3단계 | Kafka 도입 및 이벤트 구조 전환 | - Kafka 토픽 설계 및 컨슈머 구현 - 조회 로그 스트리밍 처리 학습 |
| 4단계 | 성능 개선 및 관측 시스템 구축 | - Prometheus + Grafana 대시보드 구성 - 부하 테스트(k6) 및 병목 지점 분석 |
| 5단계 | MSA 구조로 리팩토링 | - 서비스 모듈 분리 및 컨테이너화 - 데이터 공유 구조 고민 (DB 분리 여부 등) |
| 6단계 | 문서화 및 회고 | - 블로그 기록 정리 - 학습 내용 아카이빙 및 발표 자료화 |
초기에는 모놀리식 기반으로 MVP를 구성하고, 점차 이벤트 기반 구조 및 MSA로 확장할 예정입니다.
API 서버 (Spring Boot)
→ 인기 콘텐츠 조회 API 제공, Redis 캐시 연동
이벤트 수집기 (Kafka Producer)
→ 사용자 조회 로그 전송
집계 배치 서버 (Spring Batch)
→ Kafka에서 이벤트를 수신하여 점수 계산 및 DB 업데이트
DB 계층
모니터링 및 로깅
→ Prometheus + Grafana로 실시간 모니터링
🧩 전체 시스템 아키텍처 다이어그램은 개발 후 [draw.io / Whimsical] 기반 시각 자료로 별도 정리할 예정입니다.
이 프로젝트를 통해 다음과 같은 실무형 학습을 경험하고자 합니다:
1단계에서는 전체 구조와 방향성을 고민하며 요구사항과 시스템 구성을 설계해보았습니다.
다음 글에서는 실제로 MVP 구조에서 Redis와 Kafka를 활용한 실시간 집계 구조를 구현해보고, 성능 및 구조적 고려사항을 중심으로 정리해보겠습니다.
읽어주셔서 감사합니다 🙌
다음 글에서 뵙겠습니다!