"논쟁을 게임으로, AI 기반 게이미피케이션 토론 플랫폼"
일상 속 논쟁거리를 밸런스 게임처럼 즐기고, AI 판사(ChatGPT)와 배심원(유저)이 함께 판결을 내리는 참여형 커뮤니티 서비스입니다.
Tech Stack
•
Backend: Java 17, Spring Boot 3.5.6, Spring Data JPA
•
Database & Cache: MySQL, Redis (ZSet ranking)
•
AI & Async: OpenAI API (GPT-4o), Spring Async, SSE
•
Infra & DevOps: AWS (EC2, RDS, S3), GitHub Actions, Swagger
•
Collaboration: Slack Webhook
My Contributions
1. OpenAI API 응답 지연 해결을 위한 비동기 아키텍처
•
문제: ChatGPT API의 평균 응답 시간(5.2초) 동안 메인 스레드가 차단되어 사용자 경험 저하.
•
해결: 판결 요청을 @Async 비동기 스레드로 분리하고, 클라이언트에는 SSE를 연결하여 "판결 진행 중" 상태와 최종 결과를 실시간 스트리밍으로 전송.
•
성과: 평균 응답 시간을 5.22s → 0.11s로 약 97% 단축하여 즉각적인 사용자 피드백 구현.
2. Redis ZSet 기반 실시간 랭킹
•
구현: 단순 조회수가 아닌, 참여도(투표, 댓글)와 시간 경과에 따른 감산 로직을 결합한 자체 알고리즘 적용.
•
기술: Redis Sorted Set (ZSet)을 활용하여 O(log N)의 시간 복잡도로 고성능 실시간 랭킹 산출 및 조회 구현.
3. 이벤트 기반 업적 시스템
•
로직: '댓글 100개 작성', '연승 달성' 등 다양한 업적 조건을 비즈니스 로직과 분리.
•
구현: ApplicationEventPublisher를 활용하여 조건 달성 시 이벤트를 발행하고, 리스너가 이를 비동기로 처리하여 업적을 부여하도록 설계하여 서비스 간 결합도 최소화.
4. 자동화된 재판 생애주기 관리 (Scheduler)
•
유저가 판결을 확정하지 않거나 판례가 변경될 경우를 대비해, Spring Scheduler를 활용하여 '좋아요 순 자동 채택' 및 '판결 갱신' 로직 자동화.
Trouble Shooting & Deep Dive
[성능 최적화] Spring AOP Self-Invocation 문제 해결과 성능 5.6배 향상
•
배경: @Async를 적용했음에도 비동기 처리가 동작하지 않고 여전히 5초대의 지연이 발생하는 현상 확인.
•
원인 분석 (Deep Dive):
◦
Spring AOP는 프록시(Proxy) 패턴으로 동작하는데, 같은 클래스(JudgeFacade) 내부에서 비동기 메서드를 호출(this.method())할 경우 프록시를 거치지 않고 원본 객체를 직접 호출하는 'Self-Invocation' 문제가 발생함을 파악.
•
해결 (Refactoring):
◦
비동기 로직을 수행하는 JudgmentAsyncExecutor 클래스를 별도 빈으로 분리하고, Facade 패턴을 적용하여 책임을 명확히 함.
•
검증 (k6 Load Test):
◦
아키텍처 변경 전후 부하 테스트 진행 결과, 압도적인 성능 개선 입증.
◦
평균 응답 시간: 5.22s → 0.11s (97% 단축)
◦
초당 처리량(RPS): 0.78 → 4.42 (5.6배 향상)
Award
•
2025 신촌 연합 SW 창업 경진대회 인기상 수상 (2025.11)

