Skip to content

suojae/fire-walker-backend

Repository files navigation

Firewalker Backend


서비스 소개

Firewalker는 친구와 실시간으로 걸음 수를 비교하며 건강한 라이프스타일을 유지할 수 있도록 도와주는 애플리케이션입니다.


기능 설명
실시간 걸음 수 랭킹 친구들과 하루 동안 걸은 걸음 수를 비교하고 순위를 확인
소셜 피트니스 친구 요청을 보내고 걸음 목표를 공유하여 동기부여 강화
푸시 알림 시스템 친구 요청 수락 및 랭킹 변화 시 실시간 알림 제공
데이터 시각화 개인 및 그룹별 걸음 통계를 시각적으로 분석 및 제공


Backend Architecture

사용자 관리, 걸음 데이터 처리, 알림 시스템 독립적 운영 위해 분리된 서비스로 설계 및 구현


주요 설계

  • User-MS / Step-Tracker-MS / Notification-MS 역할 분리
  • 네트워크: REST + gRPC
  • 데이터베이스: Redis + MySQL

1. Step-Tracker-MS를 따로 둔 이유

  • 걸음 데이터 각 사용자로부터 실시간으로 데이터가 들어오게됩니다.이러한 걸음데이터 교환은 I/O + CPU 부담이 크다고 판단했습니다
  • 만약 트래픽이 몰리면 유저 로그인과 알람을 책임지는 서비스보다는 병목현상이 일어날 서비스는 Step-Tracker라 판단, 따로 분리하여 EC2에 배포했습니다.

2. gRPC vs WebSocket (실시간 걸음 데이터 처리 방식 비교)

기준 gRPC WebSocket
프로토콜 HTTP/2 기반 TCP 기반
데이터 포맷 Protobuf (바이너리) JSON / 바이너리
메시지 크기 작음 (최적화된 직렬화) 크거나 불필요한 헤더 포함 가능
성능 최적화 멀티플렉싱 및 압축 지원 단일 연결 유지 (Idle Connection 부담)
실시간성 빠름 (RTT 낮음) 연결 유지 필요
  • 걸음 수 데이터는 작은 크기의 패킷을 초당 여러 번 주고받아야 하므로 경량화된 직렬화(ProtoBuf) + HTTP/2 멀티플렉싱 지원이 있는 gRPC가 더 적합하다고 판단했습니다.
  • (WebSocket은 대규모 연결을 유지해야 하므로 부담이 크고, 데이터 크기에 대한 최적화도 부족.)

3. Redis와 MySQL을 함께 사용하는 이유?

목적 MySQL Redis
사용자 정보 영속적 저장 (User Table)
토큰 관리 인증 처리
로그인 보안 (블랙리스트 관리) 만료된 토큰 저장 (로그아웃 상태 유지)
  • MySQL은 영구 저장이 필요한 사용자 및 걸음 데이터 관리 하는데 사용했습니다.
  • Redis는 유저 정보 관리를 위해 활용 했습니다.
  • 특히, Redis에는 로그아웃된 JWT를 블랙리스트에 저장하여 불법 액세스를 차단 및 보안을 강화했습니다.


AWS Architecture

주요 설계

  • AWS ALB + Auto Scaling을 통한 트래픽 처리
  • RDS Multi-AZ 및 Read Replica 활용
  • Redis ElastiCache를 통한 세션 관리
  • S3 + CloudFront로 이미지 파일 저장 최적화
image
로드 밸런서 역할 이유
ALB (Application Load Balancer) HTTP 요청 라우팅 (User-MS, Tracker-MS) 클라이언트에서 오는 REST API 요청을 처리하기 위해 사용했습니다
NLB (Network Load Balancer) gRPC 요청 처리 (Notification-MS) ALB는 gRPC를 지원하지 않기 때문에 NLB를 사용했습니다

NLB 사용 이유

  • ALB는 gRPC를 지원하지 않기 때문에 Notification-MS의 gRPC 트래픽을 처리하기 위해 NLB를 적용했습니다.
  • gRPC는 HTTP/2 기반의 바이너리 프로토콜이므로 TCP 계층에서 처리하는 NLB가 적합하다는 판단을 했습니다.

구성 요소 역할 이유
Bastion Host 내부 서버 접근을 위한 SSH 게이트웨이 프라이빗 서브넷의 EC2 보안을 강화하기 위해 사용했습니다..
NAT Gateway 프라이빗 서브넷에서 인터넷 접근 가능하도록 설정 외부 API 호출 (FCM, DB 패치 등)을 위해 필요했습니다.

Bastion Host를 둔 이유

  • 보안 강화를 위해 프라이빗 서브넷의 EC2 인스턴스에 직접 SSH 접속하는 것을 차단했습니다.
  • 대신, Bastion Host를 거쳐서 접근하도록 구성했습니다.

NAT Gateway를 둔 이유

  • 프라이빗 서브넷의 EC2 인스턴스가 외부 API (FCM, 알림 서비스 등)에 접근해야 했습니다.
  • 프라이빗 서브넷에서는 직접 인터넷에 접근할 수 없기 때문에 NAT Gateway를 통해 인터넷 연결을 제공했습니다.
  • 예를 들어, Notification-MS가 FCM API를 호출할 때 NAT Gateway를 통해 요청을 전송하도록 구성했습니다.


Data Model (ERD)

  • 걸음 데이터(steps): 개별 기록을 저장하는 대신, 날짜별 누적 데이터로 저장하여 Write 부하를 줄였습니다.

  • 친구 관계 모델링: Friendship 테이블을 별도로 두고, 친구 요청 및 수락 상태를 관리했습니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published