1. 프로젝트 개요
2. 담당한 작업
- 알림
- SSE 통신을 통해 알림 전송
- 커서 페이지네이션을 통해 사용자 편의성 높은 시스템 구성
- 각 서비스 도메인 로직에서 Event 를 통해 알림 전송 가능
- 팔로우
- 개인 간 팔로우, 팔로잉 시스템 구현
- 팔로잉, 팔로잉 취소 등의 로직은 상대 유저에게 알림이 전송됨
- DM
- 팔로잉이 되어있는 사람과 DM 방 생성 가능
- 개인 간 WebSocket 통신을 통해 실시간으로 채팅 시스템 구현
- DM 읽은 사람을 판단하고 해당 DM을 읽지 않은 사람을 판별해주는 로직 구현
- DM을 받은 유저는 알림을 통해서 실시간으로 확인 가능
3. 기술적 성과
- SSE(Server-Sent Events) 통신 구현
- 서버에서 클라이언트로 실시간 알림 전송을 위해 SSE 기반 단방향 스트리밍 통신 도입
- 클라이언트가 별도의 추가 요청 없이, 이벤트가 발생할 때마다 서버에서 즉시 데이터를 Push
- WebSocket 양방향 통신 구현
- 실시간 DM 및 채팅방(입장/퇴장/재입장) 기능에 WebSocket 기반의 양방향 통신 구조 적용
- 사용자의 메시지 송수신, 채팅방 상태 변동 등 모든 실시간 이벤트를 신속하게 처리하여 “지연 없는 사용자 경험” 보장
- Event 기반 아키텍처 적용
- Spring의 도메인 이벤트(
@TransactionalEventListener
) 패턴을 도입
- 플레이리스트 업데이트, 팔로우, 구독 등 주요 액션에 대해 이벤트 객체를 발행하고, 전용 리스너에서 별도로 알림 로직 처리
- 비즈니스 로직과 알림/후처리 로직을 명확히 분리하여 유지보수성과 확장성을 크게 향상
- 비동기(Async) 처리 적용
- 주요 이벤트 처리 및 알림 전송 로직에
@Async
적용
- 알림/이벤트 전송이 메인 트랜잭션과 분리되어 사용자 응답 속도 저하 없이, 대량 이벤트도 효율적으로 처리
- 서비스 장애나 대량 요청 상황에서도 서비스 응답성과 안정성을 동시 확보
4. 문제점 및 해결 과정
S (Situation) - 상황
- 알림을 많은 서비스 도메인에서 사용하다보니 다양한 곳에서 의존성을 가지는 문제 발생
T (Task) - 과제
- 서비스 도메인들이 알림 서비스를 이용하면서도 의존성이 느슨해지도록 유도해야 합니다.