모여행

개요

여행 일정을 실시간으로 함께 작성하는 협업 서비스

  • 기간: 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

아키텍처

image

주요 작업

AWS ECS 기반 인프라 구축

  1. Terraform(IaC)을 사용한 이유
    • 인프라가 필요하지 않을 때도 지속적으로 비용이 청구되는 비효율적인 상황을 발견함
    • Terraform을 도입하여 개발 기간 중 필요할 때만 인프라를 생성 및 종료하여 비용을 절감함
  2. 가용성 및 무중단 배포
    • 단일 컨테이너 시 발생할 수 있는 단일 장애점(SPOF)을 방지하기 위해 이중화로 구성함
    • 배포 시 서비스가 중단되는 것을 방지하기 위해 ECS 롤링 업데이트를 적용함
  3. 모니터링 환경 구축
    • Grafana Alloy를 DAEMON 전략으로 배포하여 EC2 메트릭과 컨테이너 로그를 수집함
    • 수집한 데이터를 Prometheus와 Loki로 전송하고 Grafana로 시각화할 수 있는 환경을 구축함

Redis Pub/Sub과 SSE를 활용한 실시간 이벤트 전송 기능

  1. 실시간 협업을 구현하기 위해 SSE를 선택한 이유
    • 채팅처럼 양방향 통신이 계속 발생하는 구조가 아니므로 단방향 통신만으로 충분하다고 판단함
    • 표준 HTTP를 그대로 사용하므로 WebSocket 대비 구현 복잡도가 낮은 SSE를 선택함
    • 데이터 수정은 REST API로, 변경 알림은 SSE로 역할을 나누어 구현함
  2. Redis Pub/Sub을 선택한 이유
    • 서버 이중화로 인해 SSE 연결(SseEmitter) 만으로는 특정 서버에서 발생한 이벤트를 다른 서버와 연결된 사용자에게 전달할 수 없는 문제를 발견함
    • 서버 간 이벤트 공유가 필요했고 실시간 이벤트는 DB 상태 변경 알림 역할이므로 브로드캐스트에 적합한 Redis Pub/Sub을 선택함