모여행
개요
여행 일정을 실시간으로 함께 작성하는 협업 서비스
- 기간: 2025. 08. 11. ~ 2025. 09. 15.
- 인원: 8명 (PM 1, PD 2, FE 1, BE 4)
- 역할: 백엔드 개발, 인프라 구축
기술 스택
- Backend:
Java 21,Spring Boot 3.5.4 - Database:
MySQL,Redis - ORM:
Spring Data JPA,QueryDSL - Infra:
Docker,Terraform,AWS(ECS, RDS, ElastiCache) - CI/CD:
GitHub Actions - Monitoring:
Prometheus,Grafana,Alloy,Loki - API Docs:
Swagger
아키텍처
주요 작업
AWS ECS 기반 인프라 구축
- Terraform(IaC)을 사용한 이유
- 인프라가 필요하지 않을 때도 지속적으로 비용이 청구되는 비효율적인 상황을 발견함
- Terraform을 도입하여 개발 기간 중 필요할 때만 인프라를 생성 및 종료하여 비용을 절감함
- 가용성 및 무중단 배포
- 단일 컨테이너 시 발생할 수 있는 단일 장애점(SPOF)을 방지하기 위해 이중화로 구성함
- 배포 시 서비스가 중단되는 것을 방지하기 위해 ECS 롤링 업데이트를 적용함
- 모니터링 환경 구축
- Grafana Alloy를 DAEMON 전략으로 배포하여 EC2 메트릭과 컨테이너 로그를 수집함
- 수집한 데이터를 Prometheus와 Loki로 전송하고 Grafana로 시각화할 수 있는 환경을 구축함
Redis Pub/Sub과 SSE를 활용한 실시간 이벤트 전송 기능
- 실시간 협업을 구현하기 위해 SSE를 선택한 이유
- 채팅처럼 양방향 통신이 계속 발생하는 구조가 아니므로 단방향 통신만으로 충분하다고 판단함
- 표준 HTTP를 그대로 사용하므로 WebSocket 대비 구현 복잡도가 낮은 SSE를 선택함
- 데이터 수정은 REST API로, 변경 알림은 SSE로 역할을 나누어 구현함
- Redis Pub/Sub을 선택한 이유
- 서버 이중화로 인해 SSE 연결(
SseEmitter) 만으로는 특정 서버에서 발생한 이벤트를 다른 서버와 연결된 사용자에게 전달할 수 없는 문제를 발견함 - 서버 간 이벤트 공유가 필요했고 실시간 이벤트는 DB 상태 변경 알림 역할이므로 브로드캐스트에 적합한 Redis Pub/Sub을 선택함
- 서버 이중화로 인해 SSE 연결(





