Durcit
팀장 (4인 팀) — 인증·API 설계·DB·S3·AOP 로깅·WebSocket/RabbitMQ·배포 담당
4인
팀 규모
8가지
주요 기능
WebSocket + RabbitMQ
실시간
JWT + OAuth2
인증
TL;DR
Reddit에서 영감을 받은 게임 커뮤니티 플랫폼. JWT + OAuth2 인증, WebSocket + RabbitMQ 실시간 채팅, CachedBodyHttpServletRequest를 활용한 AOP API 로깅, DB 기반 푸시 알림 시스템을 직접 구현했습니다.
📊 핵심 아키텍처
개요
게이머들이 게임 경험과 콘텐츠를 자유롭게 공유할 수 있는 Reddit 스타일 커뮤니티 플랫폼입니다. 태그 기반 피드, 댓글 멘션, 실시간 채팅, 개인화 알림, 관리자 대시보드를 제공하며 AWS에 배포되어 운영되고 있습니다. 인증 시스템은 JWT Stateless 방식으로 설계했으며, ADMIN·MANAGER·MEMBER 역할 기반 접근 제어와 OAuth2 소셜 로그인을 함께 지원합니다. 실시간 채팅은 WebSocket(STOMP) + RabbitMQ 메시지 브로커 구조로 구현했고, AOP 로깅은 HttpServletRequest 바디를 다중 읽기 가능하게 래핑하는 CachedBodyHttpServletRequest 패턴으로 스트림 소모 문제를 해결했습니다.
핵심 성과
- ✓JWT Stateless 인증 + BCrypt 패스워드 인코딩 + OAuth2 소셜 로그인 구현
- ✓Spring Security RBAC — ADMIN / MANAGER / MEMBER 역할별 엔드포인트 접근 제어
- ✓CachedBodyHttpServletRequest 래퍼로 요청 바디 다중 읽기 문제 해결 후 AOP API 로깅 구현
- ✓WebSocket(STOMP) + RabbitMQ AMQP 기반 실시간 채팅 메시지 브로커 구조 구현
- ✓DB 기반 푸시 알림 시스템 — 팔로우 사용자 게시글·댓글·채팅 이벤트별 PushType 분류
- ✓AWS S3 프로필 이미지·게시글 미디어 업로드 연동
- ✓AWS EC2 + RDS + Route 53 + Nginx 리버스 프록시 배포 구성
- ✓관리자 대시보드 — 활동 로그 조회, 역할 관리, 게시물 공개 제어, 사용자 차단
- ✓SpringDoc OpenAPI 기반 Swagger API 문서 자동화
회고
기능을 많이 만들기보다 각 기능이 어떻게 동작하는지 이해하면서 만들려고 했다. AOP 로깅에서 HttpServletRequest 스트림 소모 문제를 만났을 때, 래퍼 클래스로 해결하는 과정이 가장 인상 깊었다.
- —HttpServletRequest 바디는 한 번만 읽을 수 있다. AOP에서 로깅을 위해 읽으면 이후 컨트롤러가 빈 바디를 받는다. CachedBodyHttpServletRequest로 래핑해 바이트 배열에 캐싱해두면 다중 읽기가 가능해진다. 프레임워크의 추상화 뒤에 있는 서블릿 스펙을 직접 다루는 경험이었다.
- —RabbitMQ를 처음 써봤는데, WebSocket만으로 채팅을 구현하면 서버가 직접 모든 클라이언트 연결을 관리해야 한다. 메시지 브로커를 두면 발행과 구독이 분리되어 서버 부담이 줄고 확장도 쉬워진다. 메시지 큐의 필요성을 실제 문제로 이해했다.
- —JWT는 Stateless라는 장점이 있지만, Refresh Token 관리와 강제 로그아웃 처리를 직접 설계해야 한다. 토큰 무효화 전략을 어떻게 구성하느냐에 따라 구현 복잡도가 크게 달라진다는 것을 체감했다.
기술 스택
Spring Boot 3.4 (Java 21)Spring SecurityJWT (JJWT)OAuth2WebSocket / STOMPRabbitMQSpring Data JPAMySQLAWS (S3 · EC2 · RDS · Route 53)NginxReact.jsTailwind CSSTestContainers