경북대 대동제 80주년 웹앱
축제
요약
경북대 80주년 대동제 관람객용 모바일 웹앱. 부스·주막 정보, 온라인 대기열, 실시간 부스 랭킹, 롤링페이퍼, 인스타팅 매칭 제공. 서버 설계·개발, 관리자 콘솔, 축제 기간 운영 담당.
해결한 문제
- 대기열 동시성: 같은 부스의 등록·번호 발급·순서 변경을 부스 단위 비관적 락으로 직렬화. 상태 변경 충돌은 낙관적 락으로 감지, 좋아요 lost update는 원자적 UPDATE로 해결, N+1 쿼리 제거
- 1인 3건 제한 우회 차단: 여러 부스 동시 등록 경쟁 조건을 전화번호 해시 기반 Redis 락으로 차단. IP 단위 등록 속도 제한, Redis 장애 시 메모리 기반으로 대체
- SMS 호출 파이프라인: 트랜잭션 커밋 후 전용 스레드풀에서 비동기 발송, 타임아웃·재시도 설정. 1인 최대 발송 8건을 3건으로 줄여 1인당 문자 비용 62% 절감
- 개인정보: 전화번호는 AES-GCM으로 암호화 저장, 중복 검사는 HMAC 해시로만 수행. 암호화 키가 없으면 서버 기동 차단
- 인스타팅 매칭: 선착순 컷오프 후 교란순열로 짝을 지어 서로를 뽑는 쌍이 생기지 않도록 보장. 신청·매칭·결과 공개 시간창 분리
운영
- 부스 59개 대상 사흘간 운영. 동시접속 500~800명 목표로 설계
- 축제 직전·기간 핫픽스(세션 쿠키, 이미지 404), 5xx 발생 시 Discord 알림, 업로드 이미지 WebP 자동 변환
기술 스택
- 서버: Java 21, Spring Boot 3.5, JPA, MySQL, Redis, SSE
- 클라이언트: React 19, TypeScript, TanStack Query
- 배포: Docker Compose, GitHub Actions
링크
GitHub · server (Spring Boot)GitHub · client (React)