동아리움 (대학 동아리 지원 서비스)
대학 동아리 지원서 도메인, 이벤트로 쪼갠 이유
- 기간
- 2025.08 ~ 2026.09 (개발 3개월, 실서비스 10개월)
- 구성
- 팀 프로젝트, 백엔드 3인 + 프론트엔드 3인
- 내 역할
- 지원서 도메인 API, DB 모델링, 통계, 공지, 이메일 알림 전담
- 결과
- GA 기준 누적 이용자 약 4,000여 명, 이벤트 약 13만 건
먼저 볼 글
-
통계 캐시: "스케줄러 필수"라고 써놓고 cache-aside로 뒤집은 이유
이슈에 필수라고 적힌 스케줄러 대신 요청 시점 캐시를 고른 이유 넷과, 그 뒤에 남은 것
-
@Async 리스너에서 터진 LazyInitializationException: 이메일이 조용히 안 나가던 이유
제출은 됐는데 이메일이 조용히 안 나가던 장애. 원인은 이틀 전 내가 되돌린 트랜잭션, 해법은 엔티티 대신 값 넘기기
대학 동아리 모집과 지원자 관리 서비스. 카카오테크캠퍼스 팀 프로젝트로 시작해 3개월 개발 후 10개월간 실서비스로 운영했습니다. 지원서 도메인의 API 설계, DB 모델링을 맡았고 통계, 공지, 이메일 알림은 처음부터 끝까지 구현했습니다.
기술적 의사결정
도메인 API 설계, DB 모델링 지원서 제출 도메인을 맡아 API 계약과 스키마를 먼저 고정. 3인 팀이 병렬로 움직일 기준선.
이벤트 기반 비동기 이메일 발송 지연이 사용자 응답을 막지 않도록 이벤트로 분리. 실패는 재시도 가능/불가로 분류해 대응.
join fetch, 프로젝션 지원서 목록 조회의 N+1과 불필요한 컬럼 로딩을 제거해 쿼리 수를 감축.
Prometheus, Grafana, Loki 스택 구축은 팀 공동 작업. 그 위에 비즈니스 지표를 등록하고 Discord 알림까지 연결해 장애를 지표, 로그로 추적.
계층별 테스트 290개 10개월 운영 중 기능 추가, 리팩터링의 회귀를 막는 안전망. 계층 분리로 실패 지점을 즉시 특정.
결과
10개월 실서비스 운영, 팀 프로젝트(백엔드 3 + 프론트엔드 3), 카카오테크캠퍼스, GA 기준 누적 이용자 약 4,000여 명, 이벤트 약 13만 건
참고
이 프로젝트 관련 글 (3편)
-
통계 캐시: "스케줄러 필수"라고 써놓고 cache-aside로 뒤집은 이유
이슈에 필수라고 적힌 스케줄러 대신 요청 시점 캐시를 고른 이유 넷과, 그 뒤에 남은 것
-
우리 마스킹은 총합에만 조건이 걸려있는데
항목별로 가리면 뺄셈으로 복원된다. 지원자 3명 미만이면 분포를 통째로 감추기로 한 이유와 그 구현이 틀렸던 자리
-
@Async 리스너에서 터진 LazyInitializationException: 이메일이 조용히 안 나가던 이유
제출은 됐는데 이메일이 조용히 안 나가던 장애. 원인은 이틀 전 내가 되돌린 트랜잭션, 해법은 엔티티 대신 값 넘기기