<aside>
📒 1. 프로젝트 개요
- 프로젝트의 목적과 핵심 기능을 간단히 설명해 주세요.
- 프로젝트 목적
- 영화, 드라마, 스포츠 등 다양한 콘텐츠를 큐레이팅하고 공유하며, 실시간 같이 보기 기능까지 제공하는 소셜 서비스로, 사용자들은 자신만의 플레이리스트를 만들고, 다른 사용자와 소통하며 콘텐츠 경험을 확장할 수 있는 서비스
- 핵심 기능
- 사용자 관리 기능
- 콘텐츠 데이터 관리 기능
- 콘텐츠 리뷰 기능
- 실시간 채팅 기능
- 동일한 콘텐츠를 보고있는 사용자끼리 실시간 채팅 기능 제공
- 팔로우 기능
- DM(메시지) 기능
- 실시간 알림 기능 제공
- 플레이리스트 생성 및 구독 기능
- 사용자는 자신만의 플레이리스트를 생성하고 다른 사용자는 플레이리스트를 구독하여 플레이리스트의 업데이트에 따른 알림 기능 제공
</aside>
<aside>
📝 2. 담당한 작업
- 프로젝트 내에서 본인이 맡은 역할과 기여한 부분을 구체적으로 기술해 주세요.
- 리뷰 도메인
- 콘텐츠 평점 및 리뷰 등록·수정·삭제 기능 구현
- 본인이 작성한 리뷰만 수정·삭제할 수 있도록 권한 검증 로직 설계
- 동일 콘텐츠에 대한 중복 리뷰 등록 방지 처리
- QueryDSL 기반 정렬·페이징 조회 기능 구현을 통해 대량 데이터 환경에 대응
- 알림 도메인
- 플레이리스트 구독, 콘텐츠 추가, 팔로우, DM 수신 등 주요 이벤트 발생 시 알림 생성 기능 구현
- 알림 읽음/안 읽음 상태 관리 및 QueryDSL 기반 정렬·페이징 알림 목록 조회 기능 개발
- Server-Sent Events(SSE)를 활용한 실시간 알림 전송 구조 설계 및 구현
- emitter 생명주기 관리와 비정상 종료 emitter 정리 로직을 통해 장시간 연결 안정성 확보
- 이벤트 기반 아키텍처
- Kafka(Confluent Cloud) 기반 이벤트 처리 구조 도입
- 알림 도메인에서 Kafka Consumer를 통한 비동기 알림 생성 로직 구현
- 이벤트 중복 소비 가능성을 고려한 안정적인 처리 로직 설계
- 성능 및 협업 기여
- 리뷰·알림 조회 시 첫 페이지 한정 캐싱 전략 적용으로 응답 속도 개선
- CodeRabbit AI 코드 리뷰어 도입을 담당하여 PR 리뷰 품질 및 코드 안정성 향상에 기여
</aside>
<aside>
📈 3. 기술적 성과
- 프로젝트에서 사용한 기술 스택과 구현한 주요 기능을 설명해 주세요.
- 알림 및 리뷰 도메인에 사용된 기술 스택 및 주요 기능
- 기술 스택:
- Backend :
JAVA, Spring Boot, QueryDSL, Slf4j, Spring Data JPA
- Messaging & Real-time :
Kafka (Confluent Cloud), Server-Sent Events (SSE)
- Cache :
Redis
- Database & Storage :
PostgreSQL, H2
- Testing :
Mockito, JaCoCo
- 주요 기능
- 리뷰 도메인: 콘텐츠 리뷰·평점 등록, 수정, 삭제 및 중복 리뷰 방지 로직 구현
- QueryDSL을 활용한 리뷰·알림 정렬 및 페이징 조회 기능 개발
- 알림 도메인: 구독, 콘텐츠 추가, 팔로우, DM 수신 이벤트에 따른 알림 생성
- SSE 기반 실시간 알림 전송 구조 설계 및 emitter 생명주기 관리
- Kafka Consumer를 통한 비동기 알림 생성 및 이벤트 중복 소비 방지 처리
- 리뷰·알림 조회 시 첫 페이지 한정 캐싱 적용으로 조회 성능 개선
- 협업/품질 관리에 사용된 기술 스택 및 주요 기능
- 기술 스택
- Collaboration & Quality :
GitHub, CodeRabbit AI
- 주요 기능
- Pull Request 생성 시 자동 코드 리뷰 수행 환경 구축
- 예외 처리 누락, null 처리, 경계 조건 등 잠재적 버그 사전 탐지
- 성능 및 설계 개선 포인트에 대한 정적 분석 기반 리뷰 제공
- Critical / Major 등급 리뷰 항목 수정 후 병합 규칙 수립 및 적용
- 코드 리뷰 기준을 자동화하여 팀 내 코드 품질 일관성 유지
</aside>
<aside>
🛠️ 4. 문제점 및 해결 과정
- 프로젝트 진행 중 직면한 기술적 문제와 이를 해결한 과정을 상세히 설명해 주세요.
- SSE 장시간 연결 안정성 문제
- 장기 연결 특성상 끊어진 연결을 서버가 즉시 인지하지 못해 dead emitter가 누적될 수 있었다.
- emitter 생명주기 관리와 ping 기반 정리, Last-Event-ID 재전송 로직을 적용하여 안정성을 확보했다.
- Kafka 이벤트 중복 소비 문제
- Consumer 재시작 및 네트워크 이슈로 동일 이벤트가 재전달될 수 있었다.
- 이벤트 중복을 고려한 방어 로직을 적용해 알림 생성 과정을 멱등적으로 개선했다.
- 캐싱 정합성 문제
- 무분별한 캐싱으로 데이터 최신성이 저하될 수 있었다.
- 조회 빈도가 높은 첫 페이지에만 캐싱을 적용하고, 데이터 변경 시 캐시를 즉시 무효화했다.
- 표준시(UTC/KST) 오차 문제
- LocalDateTime 사용으로 로컬(KST)과 배포(UTC) 환경 간 시간 불일치가 발생했다.
- 시간 기준을 UTC(Instant)로 통일하고 응답 단계에서만 KST로 변환해 해결했다.
</aside>
<aside>
💡 5. 협업 및 피드백
- 팀원들과의 협업 과정에서 느낀 점, 배운 점, 그리고 피드백을 기록해 주세요.
- 도메인 기반으로 역할이 명확히 분리된 구조에서 각 팀원이 담당 영역에 집중하며 개발할 수 있었고, 그로 인해 책임 범위가 분명해져 협업이 수월했다.
- 이벤트 기반 아키텍처를 적용하면서 기능 간 직접적인 의존성이 줄어들었고, 이벤트 발행과 소비가 분리되어 각 도메인이 독립적으로 동작할 수 있었다. 이 덕분에 팀원들과 역할을 명확히 나눠 병렬적으로 개발을 진행할 수 있었다.
- 이번 프로젝트에서는 깃허브에 CodeRabbit AI를 적용하여 코드 리뷰를 추가시켰는데 사람이 놓치기 쉬운 예외 처리 누락이나 경계 조건 오류를 발견할 수 있었고, 이를 통해 이전에는 인지하지 못했던 문제점들을 학습하며 팀 전체의 코드 품질을 함께 개선할 수 있었다.
</aside>
<aside>
</aside>
<aside>
</aside>