DeadlineMate
팀 프로젝트

DeadlineMate

2026.03 ~ 2026.04
백엔드 개발
Spring BootJava 21MySQLJPAQueryDSLJWTOAuthSpring Event

스터디·프로젝트 모임을 개설하고 주간 Todo와 달성률을 팀 단위로 관리하는 서비스입니다. FESI 13기 팀 프로젝트로 11개 도메인을 설계했습니다. @TransactionalEventListener 기반 이벤트 알림, QueryDSL Exists Subquery 동적 필터링, 목록 조회 N+1 제거, PESSIMISTIC_WRITE 동시성 제어 등을 직접 구현했습니다.

역할별 수행 내용

모임 & 검색

  • QueryDSL BooleanBuilder + Exists Subquery로 다대다 관계(모임↔카테고리·태그) 동적 필터링 — IN 대신 EXISTS로 불필요한 조인 제거
  • 목록 조회 N+1 제거 — 모임 ID 배치 수집 후 태그·이미지·리더 정보를 IN 쿼리로 각 1회 조회, LinkedHashMap으로 순서 보장
  • CQRS 분리 — GatheringService(생성·수정·삭제)·GatheringQueryService(목록·상세 조회) 책임 분리, 스케줄러로 일일 RECRUITING→IN_PROGRESS 상태 자동 전환 및 이벤트 발행
  • PESSIMISTIC_WRITE 락으로 동시 신청 시 maxMembers 초과 방지, Batch UPDATE로 currentMembers 원자적 증감 처리

이벤트 기반 알림

  • @TransactionalEventListener(AFTER_COMMIT)으로 모임 생성·시작·완료·찌르기·평가 5종 이벤트 발행 — 트랜잭션 커밋 후에만 외부 호출하여 데이터 일관성 보장
  • 평판 시스템 이벤트 분리 — 평가 데이터 저장과 userClient 평판 점수 업데이트를 이벤트로 분리해 외부 서비스 실패 시에도 평가 데이터 유실 없는 fault tolerance 확보

인증

  • OAuthClientFactory 패턴으로 Kakao·Google 멀티 프로바이더 통합 — OAuthClient 인터페이스 구현체를 Map으로 관리해 새 제공자 추가 시 클래스 1개만 등록
  • LoginAttemptService로 로그인 시도 횟수 추적, 임계치 초과 시 잠금 처리로 브루트포스 방어

주요 성과

  • 목록 조회 N+1 제거 — 모임·태그·이미지·리더 4개 테이블을 각 1회 IN 쿼리로 일괄 처리
  • 이벤트 기반 알림으로 모임 도메인과 알림 로직 완전 분리, 평가 실패 시에도 모임 데이터 보존
  • PESSIMISTIC_WRITE + Batch UPDATE로 동시 신청 경쟁 조건 해소

관련 자료