Skip to content

Features

TAEHEON KIM edited this page Jul 7, 2026 · 2 revisions

Features

1. 인증

  • Kakao OAuth 2.0 로그인
  • JWT Access Token (30분) + Refresh Token (7일, Redis 저장)
  • Refresh Token 재발급 시 기존 토큰 삭제 (RTR 방식)
  • STOMP 연결(CONNECT) 시 StompJwtInterceptor로 WebSocket도 JWT 인증, 메시지 전송(SEND) 시에는 별도 Sliding Window Rate Limiting 적용

2. 스터디 모집 게시글

  • CRUD (기술스택 / 모집상태 필터링, 페이징)
  • Elasticsearch 풀텍스트 검색
    • nori 분석기로 한국어 형태소 분석
    • 동의어 필터 (스프링=spring, 자바=java, 리액트=react 등)
    • 키워드 / 기술스택 / 모집상태 / 최대인원 복합 조건 검색
  • 단건 조회 Redis 캐시 (TTL 10분), 장애 시 DB 폴백
  • Spring Batch 만료 게시글 자동 마감
    • JpaCursorItemReader 스트리밍 조회, Chunk 1,000건 커밋
    • 매일 자정 실행, ES 인덱스도 배치 내 동기화

3. 지원 시스템

  • 지원 / 취소 / 승인 / 거절
  • 비관적 락 (PESSIMISTIC_WRITE) + 락 타임아웃 3초로 동시 지원 레이스컨디션 방지
  • DataIntegrityViolationException catch -> 중복 지원 409 응답
  • 지원 승인 시 스터디팀 자동 생성

4. 댓글

  • 게시글별 댓글 CRUD
  • 댓글 작성 시 게시글 작성자에게 알림 발송
  • @nickname 정규식 파싱 -> 멘션 알림

5. 실시간 채팅

  • WebSocket STOMP + Redis Pub/Sub
  • 지원 승인 시 스터디팀 전용 채팅방 자동 생성
  • Redis Pub/Sub으로 멀티 인스턴스 간 메시지 동기화
  • 채팅 내역 MySQL 저장 + 페이징 조회

6. 실시간 알림

  • Kafka -> Redis Pub/Sub -> SSE 파이프라인
  • Outbox 패턴으로 알림 유실 방지, DLT로 실패 격리

알림 종류

종류 트리거
지원 접수 게시글에 지원 시 작성자에게
지원 승인 / 거절 승인/거절 시 지원자에게
댓글 알림 댓글 작성 시 게시글 작성자에게
멘션 알림 @nickname 작성 시 해당 유저에게
팀 일정 알림 일정 등록 시 팀원 전체에게
D-1 리마인더 매일 오전 9시 다음날 일정 있는 팀원에게
  • 읽음 처리 / 미읽음 카운트 / 전체 읽음

7. 스터디팀 관리

  • 지원 승인 시 팀 자동 생성, 리더/멤버 역할 관리
  • 리더 위임, 멤버 추방, 팀 탈퇴
  • 팀 일정 CRUD
  • 매일 오전 9시 TeamScheduleReminderScheduler로 D-1 리마인더 발송

8. API 보호

Rate Limiting

  • @RateLimit 어노테이션으로 API별 선택적 적용
  • Redis Sorted Set + Lua Script로 Sliding Window 원자적 처리
  • 키 구조: rate:limit:{userId 또는 clientIp}:{endpoint} — 미인증 요청은 클라이언트 IP 기준으로 폴백
  • STOMP CONNECT/SEND에도 별도 키(rate:limit:stomp:{userId}:{destination})로 적용 (10초당 20건)
  • 초과 시 HTTP 429 반환

Idempotency

  • @Idempotent 어노테이션 적용 (지원, 댓글, 게시글, 팀 일정 생성)
  • Idempotency-Key 헤더 기반, Redis에 응답 캐시 (TTL 30분)
  • 처리 중 재요청 -> 409 Conflict, 실패 시 키 삭제로 재시도 허용

9. MDC 기반 요청 추적

  • MdcFilter: 요청마다 requestId, serverInstance, clientIp, method, uri 자동 주입
  • JwtAuthenticationFilter: 인증 성공 시 userId 추가 주입
  • LogstashEncoder로 MDC 값이 JSON 필드로 직렬화 -> Kibana에서 requestId 기반 필터링

Clone this wiki locally