Skip to content

yereumi/dapanda-backend

 
 

Repository files navigation

🐼 모두가 참여할 수 있는 무선데이터 공유 플랫폼, DAPANDA

readme-main

🧾 프로젝트 개요

  • 프로젝트명: DaPanDa
  • 팀명: 다판다
  • 개발 기간: 2025.06.30 (월) ~ 2025.08.07 (목)

💡 기획 배경

가족·지인 간 통신 데이터를 비공식적으로 나누는 현실은 번거롭고 불투명하며, 사용하지 못한 데이터는 소멸되기 쉽습니다.

DaPanDa는 이러한 문제를 해결하고 데이터를 자산처럼 자유롭게 사고팔 수 있는 공식 거래 플랫폼을 구축하고자 시작되었습니다.

단순한 거래를 넘어 데이터, 핫스팟, 와이파이 등 다양한 네트워크 자산을 등록·판매할 수 있도록 하여, 개인부터 소상공인까지 참여 가능한 디지털 공유 생태계를 지향합니다.

✨ 핵심 기능 요약

  • SpringSecurity, OAuth2, JWT 기반 인증/인가 시스템
  • 데이터 / 와이파이 상품 등록 및 실시간 거래
  • 실시간 채팅 기능 및 거래 알림
  • PG 연동 결제 + 캐시 충전 및 환불
  • 리뷰 등록 / 신고 접수
  • 시스템 모니터링

기획에 대한 자세한 내용은 팀 README.md를 확인해주세요 😊

⚙️ 기술 스택

Category Technologies
Backend Java Spring Boot Spring Security OAuth2 JWT MySQL QueryDSL Redis WebSocket JUnit 5 Mockito Jacoco Spring REST Docs JMeter
Infra / DevOps GitHub Actions AWS Vercel
Monitoring Prometheus Grafana Loki
Collaboration Jira Slack Notion GitHub

🛠️ 시스템 아키텍처

시스템 아키텍처

🧱 ERD

ERD

🔁 시퀀스 다이어그램

데이터 상품


데이터 상품 시퀀스 다이어그램

와이파이 상품


와이파이 상품 시퀀스 다이어그램

✨ 개발 성과

1. 시스템 아키텍처 설계

Auto Scaling Group

  • ALB(애플리케이션 로드밸런서)와 연동하여 트래픽 증감에 따라 EC2 인스턴스 수를 자동으로 조절
  • 사용량 급증 시 확장, 사용량 감소 시 축소를 통해 비용 효율 및 확장성 확보

무중단(Zero-Downtime) 배포

  • AWS CodeDeploy의 Blue/Green 전략 적용
  • 신규(그린) 환경으로 트래픽을 전환해 배포 중에도 기존(블루) 환경 서비스가 중단되지 않도록 보장

2. 비관락 도입으로 상품 구매, 캐시 결제 동시성 처리

문제 분석

한정된 재고를 판매하는 서비스에서는 고객이 거의 동시에 구매 버튼을 누를 때 재고 오버셀링, 이중 결제 등의 심각한 오류가 발생할 수 있음

개선 방법

구매나 결제 로직은 데이터 일관성 확보가 최우선이라 판단 → 비관적 락 적용

성과 및 결과

  • 락을 적용하기 전에는 100건의 동시 요청에서 2건의 구매 발생
  • 락을 적용한 후에는 100건의 동시 요청에서 1건의 구매 발생

결론

락 대기 시간이 일부 늘어났지만, 평균 응답 시간은 200ms 이내로 유지되었고 서비스 안정성 확보라는 목표 달성

3. 캐싱을 통한 조회 성능 개선

문제 분석

  • 기존 구조에서는 모든 조회 요청마다 DB를 직접 호출하는 방식으로 동작
  • 특히 상품 목록은 사용자 진입 시마다 반복적으로 호출되며 결과적으로 다음 문제가 발생
    • DB 쿼리 부하 증가
    • 응답 지연(Latency)
  • 실사용자 테스트 당시 약 70명의 사용자, 50개의 상품 게시물이 존재하던 상황에서 모바일 데이터 상품과 와이파이 상품 각각 최대 780ms, 2.39s 의 응답 지연이 발생
  • 또한 거리 기준 오름차순 정렬 결과는 사용자의 위도/경도에 따라 매번 달라지기 때문에 일반적인 의미에서의 캐싱(“모든 사용자에 대해 한 번만 계산 후 계속 재사용”)은 읽기 비용(네트워크+메모리 접근)조차 더 크거나 같을 수 있다고 판단

개선 방법

  • 캐싱 전략 중 Cache-Aside 패턴 도입
  • 와이파이 상품의 거리 기준 오름차순 정렬은 “동일 사용자” 정도의 짧은 시간(10~30초) 내 재요청을 대비해 캐시해두고 TTL(5분)이 지나면 자동 만료되도록 설정
  • 기본 TTL은 30분, 와이파이 상품의 거리 정렬 캐시는 5분으로 설정

성과 및 결과

결론

모바일 데이터 상품과 와이파이 상품 모두 평균 응답 시간, TPS 개선 확인

4. 채팅 시스템 개발

문제 분석

  • 1차 개발에서 단일 서버 환경에서 인메모리 방식의 WebSocket STOMP 기반 채팅 시스템 구현

    → 오토스케일링에 의해 스케일 아웃 시, 서로 다른 서버로 트래픽이 나뉘어 사용자들 간의 채팅이 불가능한 문제 발생

개선 방법

Redis Pub/Sub 기능을 활용하여 통신 불가능 문제 해결

추후 고도화 방안

  • 채팅 서버와 비즈니스 서버 분리
  • 서버 간의 중계를 위한 Key-Value 방식 도입
  • NoSQL 기반의 메시지 저장 방식, 인스턴수 증가에 따른 메시지 큐 도입 등 고려

5. 자투리 구매 알고리즘

개요

  • 사용자가 원하는 dataAmount 만큼의 모바일 데이터를 최저 가격으로 구매하도록 하는 탐색 알고리즘
  • 그리디 알고리즘을 변형하여 적용
    • 기존 그리디 알고리즘은 한 번의 순회로 조합 결정
    • 데이터 자투리 구매 알고리즘은 여러 그리디 경로를 비교해 더 나은 조합을 찾음
  • 0.1 GB 단위로 최대 2.0 GB까지 존재하는 여러 개의 상품(Data Scrap) 중에서 조합을 찾아냄
  • 최대 후보 조합 개수는 5개로 제한하여 성능 최적화

6. 모니터링 시스템 도입

문제 분석

  • 분산된 로그·메트릭 수집으로 장애 탐지 지연
  • 수작업 로그 확인으로 운영 부담 증가

개선 방법

모니터링과 알림 시스템을 도입하여 시스템 장애를 사전에 감지하고 자동화된 알림으로 즉각 대응할 수 있는 신속·안정적 운영 체계를 확보

성과 및 결과

  • 모니터링 포털에서 실시간 메트릭·로그 동시 조회 가능
  • Slack 자동 알림으로 SSH 접속 없이도 이상 징후 즉시 인지

7. 테스트 커버리지 80% 달성

API 명세 도구로 Spring REST Docs를 채택함으로써 테스트 코드 작성 강제

→ 테스트 커버리지 80% 달성

Image

📄 API 명세서

🔗 Spring REST Docs

더 자세한 내용은 Github Wiki를 확인해주세요 ☺️

🧑🏻‍💻 역할 분담




  • 상품 시스템
  • 거래 시스템
  • 결제 시스템
  • 모니터링 시스템
  • 채팅 시스템
  • 거래 시스템
  • 리뷰 시스템
  • 신고 시스템
  • 인프라, CI/CD 구성
  • 인증/인가 시스템
  • 회원 시스템
  • 상품 시스템
  • 알림 시스템

About

유레카 최종융합프로젝트 3조 백엔드

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.5%
  • Shell 0.5%