반응형
⚠️ 이 프로젝트는 KBO 공식 API가 아닌 스포키 웹사이트의 공개 화면 요청화면을 분석해 데이터를 수집하였으며, 비상업적 목적의 학습용/포트폴리오 용도로만 사용됩니다.
데이터의 소유권은 KBO 및 스포츠투아이㈜, 스포키에 있으며, 해당 정보는 상업적으로 사용되지 않습니다.
1️⃣ 서비스 개요
| 항목 | 설명 |
| 서비스명 | 오늘의 크보 (Today’s KBO) |
| 기간 | 2025년 06월 ~ 2025년 8월 |
| 인원 | 총 2명 ( 프론트앤드 개발자 1명, 백앤드 개발자 1명 ) |
| 주요기능 | KBO 경기 정보 요약, 팀/선수 정보, 실시간 순위, 커뮤니티 |
2️⃣ 핵심 기술 스택
| 계층 | 주요 기술 |
| Frontend | React Native (Expo), Axios, i18n |
| Backend | Spring Boot, JPA, MySQL, JWT, Swagger |
| 크롤링/배치 | Python (BeautifulSoup/Selenium), Spring Scheduler / Batch |
| 데이터 처리 | Kafka |
| CI/CD & 배포 | Cloudtype, GitHub Actions, (후에 EC2 + Nginx + Docker) |
| Storage | Cloudinary (하이라이트) |
| 문서화 | Swagger + Notion |
3️⃣ 주요 목표
1. DB 스키마 직접 설계 및 ERD 작성
2. 실시간 외부 데이터 크롤링 후 스케줄링 저장
3. API 명세 -> Swagger 자동화
4. JWT 기반 인증 구현
5. 프론트/백앤드 협업을 위한 Git Flow 체계 적용
6. WebSocket 또는 Kafka로 실시간 경기 상황 중계 및 반영
7. 클라우드 배포 자동화 구성
4️⃣ 백엔드 구성 흐름
[사용자 앱 (React Native)]
│
▼ REST API 요청 (GET/POST)
[Spring Boot 서버 (Cloudtype 배포)]
├────────────┬─────────────────────────────┬────────────────────┐
│ │ │ │
▼ ▼ ▼ ▼
[MySQL] [크롤링 모듈] [Kafka Producer] [Kafka Consumer]
(영속 저장) (Selenium/BS4) (Spring or Python) (Spring)
사용자/경기/ └─ Spring Batch ┌───────────────┐ ┌─────────────┐
커뮤니티 등 (매일 00:00) ▼ ▼ ▼ ▼
정보 저장 경기정보 크롤링 → Kafka Topic: games → Game 저장 알림/썸네일 생성
(도커 컨테이너) Highlight 저장 등
5️⃣ 시스템 구성도

사용자 앱 (React Native)
- 사용자는 모바일 앱을 통해 REST API로 서버에 요청을 보냄
- 예: /api/v1/games/today 요청
Spring Boot 서버
- 클라우드 플랫폼인 Cloudtype에 배포되어 있는 Spring Boot 앱이 API 요청을 처리함
- 주요 기능:
- REST API 제공
- 정기 크롤링을 위한 스케줄링 (Spring Batch)
- Kafka 메시지 프로듀서 & 컨슈머 역할 수행
크롤링 모듈 (내부 포함)
- Selenium, BeautifulSoup 등을 활용해 경기 정보를 크롤링
- 매일 00:00에 Spring Batch가 실행되어 최신 경기 데이터를 수집
Kafka Producer
- 크롤링된 경기 정보를 Kafka Topic에 메시지로 전송
Kafka
- 도커 컨테이너로 실행
Kafka Consumer (Spring Boot 내부)
- Spring Boot에 내장된 Kafka Consumer가 메시지를 받아 처리함
- 메시지를 받아서 다음 작업을 수행함:
- Game/Highlight 정보 MySQL에 저장
- 기존: JpaRepository 사용하여 동기 처리
- 변경: LinkedBlockingQueue로 바꿔서 비동기 DB 처리 해보기
- 알림 전송 준비 (썸네일 이미지 처리 포함 가능)
- Game/Highlight 정보 MySQL에 저장
DB (MySQL)
- 사용자, 경기 정보, 커뮤니티 게시물 등의 모든 데이터가 저장됨
- /api/v1/games/today 같은 API에서 필요한 데이터를 조회함
배포 플랫폼: Cloudtype
- 초기에는 Cloudtype을 사용해 Spring Boot 서버와 MySQL 컨테이너를 함께 구성 가능
- Kafka는 별도 도커 컨테이너로 로컬 또는 클라우드에서 동작
역할 요약
| 구성 요소 | 설명 |
| React Native 앱 | 사용자 인터페이스, REST API로 백엔드 통신 |
| Spring Boot | 메인 서버: API 처리, Kafka 통신, 배치 실행 등 |
| MySQL | 사용자, 경기 기록, 게시글 등 영속 데이터 저장 |
| 크롤링 모듈 | Selenium/BeautifulSoup 기반 경기 정보 수집 |
| Spring Batch | 매일 정해진 시간에 크롤링 자동 실행 |
| Kafka Producer | 크롤링된 경기 데이터를 Kafka 메시지로 전송 |
| Kafka (Docker) | 메시지 중계자 역할, 도커 컨테이너로 구동 |
| Kafka Consumer | Spring Boot에서 메시지 수신 후 DB 저장 또는 추가 처리 |
| Cloudtype | Spring Boot 앱을 배포하는 플랫폼 (MySQL 컨테이너 포함 가능) |
구성 아키텍처
[크롤러 (Python + Selenium, 스케줄링)]
│
▼ Kafka Producer
│
▼
[Kafka Topic: games] ← 도커 컨테이너로 실행 중
│
▼ Kafka Consumer (@KafkaListener)
[Spring Boot 서비스 계층]
│
▼ JPA
[MySQL 저장소]
│
▼
[API 컨트롤러: /api/v1/games/today]
6️⃣ 도메인 구성 요약
| 도메인 | 설명 |
| User | 로그인, 마이팀, 커뮤니티 활동자 |
| Team | KBO 구단 정보 |
| Game | 경기 결과 |
| GameSchedule | 경기 일정 |
| Player | 선수 기본 정보 |
| PlayerStat | 개인 기록 |
| TeamStat | 팀 순위 |
| Post / Comment / Like | 커뮤니티 게시글/댓글/좋아요 |
| Highlight | 하이라이트 영상 |
7️⃣ 개발 일정 및 흐름
| 주차 | 작업 내용 |
| 1주차 | ERD 설계, 프로젝트 세팅, Git 브랜치 전략 수립 |
| 2~3주차 | 로그인, 팀/선수 정보 API, React Native 연동 |
| 4~5주차 | 경기 일정/결과 크롤링 및 API 구현 |
| 6주차 | 커뮤니티 기능, 하이라이트 영상 연동 |
| 7주차 | 통합 테스트, 예외처리, Swagger 문서 정리 |
| 8주차 | 배포 → 발표용 준비 & 회고 작성 |
반응형
댓글