|
1 | | -# WEB5_7_7STARBALL_BE |
| 1 | +# 🌊 MarineLeisure - 수상레저 특화 해양 정보 서비스 |
| 2 | + |
| 3 | +> **7성구 팀**의 레저 활동자를 위한 위치 기반 맞춤형 해양 정보 제공 플랫폼 |
| 4 | +
|
| 5 | +--- |
| 6 | + |
| 7 | +## 📌 프로젝트 소개 |
| 8 | + |
| 9 | +**MarineLeisure**는 낚시, 스쿠버다이빙, 해루질, 서핑 등 수상레저 활동을 즐기는 사용자를 위해 설계된 웹 기반 정보 서비스입니다. 실시간 기상 및 해양 생물 정보를 통해 **안전하고 효율적인 레저 활동**을 가능하게 합니다. |
| 10 | + |
| 11 | +> 수온, 조류, 파도, 시야 등 다양한 해양 데이터를 기반으로 레저 최적 장소를 추천하고, 위험 생물 정보를 제공하여 사용자 경험을 향상시킵니다. |
| 12 | +
|
| 13 | +--- |
| 14 | + |
| 15 | +## 👥 팀원 소개 |
| 16 | + |
| 17 | +| 이름 | 역할 | 담당 | 이메일 | GitHub | 한마디 | |
| 18 | +|------|------|------|--------|--------|--------| |
| 19 | +| 👨💻 조건웅 | 백엔드 팀장 | 외부 API 연계 및 지도, 알림 관련 서비스 | [email protected] | [gunwoong1630 ](https://github.com/gunwoong1630?tab=repositories) | Hi | |
| 20 | +| 👨💻 김명진 | 백엔드 개발 | 활동 관련 서비스 | [email protected] | [audwls239 ](https://github.com/audwls239?tab=repositories) | 잘 부탁드려요! | |
| 21 | +| 👨💻 허재원 | 백엔드 개발 | 인증 서비스 개발 | [email protected] | [johnhuh619 ](https://github.com/johnhuh619) | 안녕하세요 ~~ | |
| 22 | +| 👩💻 이선빈 | 백엔드 개발 | 모임 관련 서비스 | [email protected] | [twinkey0201 ](https://github.com/](https://github.com/garusitell)) | 안녕하십니까 | |
| 23 | + |
| 24 | +--- |
| 25 | + |
| 26 | +## 💡 기획 의도 |
| 27 | + |
| 28 | +- 기존 기상·해양 정보는 **학술 목적**이거나 **파편화**되어 있어 접근이 어려움 |
| 29 | +- 수상레저 활동은 **활동별 필요한 정보가 상이** |
| 30 | +- **사용자의 위치, 활동 유형에 따라 맞춤 정보 제공**이 필요 |
| 31 | + |
| 32 | +> MarineLeisure는 활동별 맞춤형 지수, 위치 기반 추천, 즐겨찾기, 모임 개설, 위험 생물 알림 등을 통해 보다 **개인화된 레저 서비스**를 제공합니다. |
| 33 | +
|
| 34 | +--- |
| 35 | + |
| 36 | +## 🎯 주요 기능 |
| 37 | + |
| 38 | +| 기능 | 설명 | |
| 39 | +|------|------| |
| 40 | +| 📍 위치 기반 추천 | 현재 위치 기반 가까운 최적의 레저 장소 추천 | |
| 41 | +| 🌊 활동별 정보 제공 | 낚시, 해루질, 다이빙, 서핑에 맞춘 기상 및 해양 데이터 제공 | |
| 42 | +| 🐟 해양 위험 생물 알림 | 국립수산과학원 데이터 기반 위험 생물 출몰 경고 | |
| 43 | +| ⭐ 즐겨찾기 & 알림 | 자주 가는 포인트를 등록하고 조건 만족 시 알림 전송 | |
| 44 | +| 👥 모임 생성 | 레저 포인트 기반 모임 개설 및 참여 (선착순 모집) | |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 🛠️ Troubleshooting (문제 해결 사례) |
| 49 | + |
| 50 | +### 🔸 1. 위치 기반 지점 추천 성능 병목 |
| 51 | +- **문제**: 사용자의 현재 위치로 주변 지점을 추천할 때, 비회원 포함 전 사용자 요청으로 트래픽 집중. DB 조회가 복잡해 병목 발생. |
| 52 | +- **해결 방법**: |
| 53 | + - 행정구역 단위로 프리셋 지점을 미리 정의 및 캐싱 |
| 54 | + - 사용자는 좌표만 보내고, 서버는 해당 위치에 맞는 사전 정의 지점 목록을 즉시 반환 |
| 55 | +- ✅ **효과**: 실시간 DB 조회 횟수 감소, 성능 안정성 확보 |
| 56 | + |
| 57 | +### 🔸 2. 카카오 API 사용 중 429 Too Many Requests 발생 |
| 58 | +- **문제**: 역지오코딩 요청이 많아져 카카오 API의 호출 한도를 초과 → 요청 실패율 증가 |
| 59 | +- **해결 방법**: |
| 60 | + - Resilience4j 서킷브레이커 적용 |
| 61 | + - 일정 실패율 이상일 때 외부 API 호출 차단 + fallback 응답 처리 |
| 62 | +- ✅ **효과**: API 안정성 향상, 시스템 다운 위험 방지 |
| 63 | + |
| 64 | +### 🔸 3. 외부 API 의존 → 자체 역지오코딩 시스템 구축 |
| 65 | +- **문제**: Kakao Maps API 의존으로 429 에러 지속 발생, 트래픽 증가 시 불안정 |
| 66 | +- **해결 방법**: |
| 67 | + - 공공 OpenAPI에서 제공하는 시/도 경계 SHP 파일 확보 |
| 68 | + - GeoTools 라이브러리를 사용해 좌표 → 행정구역 자체 변환 시스템 구현 |
| 69 | +- ✅ **효과**: 외부 API 의존 제거, 트래픽 급증 시에도 안정적 응답 가능 |
| 70 | + |
| 71 | +### 🔸 4. 위험생물 PDF → JSON 자동화 오류 |
| 72 | +- **문제**: 국립수산과학원 PDF 양식이 유동적이라 기존 좌표 기반 파싱 방식 실패 |
| 73 | +- **해결 방법**: |
| 74 | + - OpenAI를 활용해 PDF 내 텍스트 패턴 분석 → JSON으로 직접 변환 |
| 75 | + - 불규칙한 표에서도 문맥 기반으로 정보 추출 가능 |
| 76 | +- ✅ **효과**: 자동화 정확도 향상, 비용/속도 최적화 (1,000토큰 ≒ 0.0002달러) |
| 77 | + |
| 78 | +### 🔸 5. Native Query의 과도한 조인으로 인한 성능 저하 |
| 79 | +- **문제**: 복잡한 LEFT JOIN으로 인해 불필요한 중복 로우 발생, 결과셋 비대 → 응답 시간 지연 |
| 80 | +- **해결 방법**: |
| 81 | + - 네이티브 SQL 단순화 및 조회 최적화 |
| 82 | + - 필요 데이터만 분리 조회하고 애플리케이션 단에서 가공 |
| 83 | +- ✅ **효과**: p95 응답 시간 개선 (7초 → 1.79초 → 20ms까지) |
| 84 | + |
| 85 | +### 🔸 6. Hikari 커넥션 풀 과부하 문제 |
| 86 | +- **문제**: 고트래픽 환경에서 커넥션 풀 병목으로 인해 처리량 제한 |
| 87 | +- **해결 방법**: |
| 88 | + - `maximumPoolSize`를 10 → 20 → 30 → 50으로 단계적 조정 후 최적값 도출 |
| 89 | + - 최종 권장 설정: **maximumPoolSize = 30** |
| 90 | +- ✅ **효과**: 커넥션 안정화, 응답 시간 p95 ≈ 15ms |
| 91 | + |
| 92 | +### 🔸 7. OAuth2 로그인 보안 취약점 |
| 93 | +- **문제**: state/code 탈취 공격에 취약 가능성 |
| 94 | +- **해결 방법**: |
| 95 | + - **PKCE(Proof Key for Code Exchange)** 적용 |
| 96 | + - code_verifier를 클라이언트에 저장, 탈취 시에도 인증 불가 |
| 97 | +- ✅ **효과**: OAuth 보안 강화, 안전한 로그인 플로우 확보 |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## 🛠 기술 스택 |
| 102 | + |
| 103 | +| 구분 | 기술 | |
| 104 | +|------|------| |
| 105 | +| **Frontend** | React, Next.js, TailwindCSS | |
| 106 | +| **Backend** | Spring Boot, JWT, REST API | |
| 107 | +| **DB** | MySQL, H2 (테스트) | |
| 108 | +| **Infra** | AWS EC2, Docker, GitHub Actions (CI/CD) | |
| 109 | +| **API** | 바다누리 OpenAPI, Open-Meteo, Kakao API, 국립수산과학원 | |
| 110 | +| **기타** | Redis , Geo tools, Apache PDFBox (보고서), GitHub | |
| 111 | + |
| 112 | +--- |
| 113 | + |
| 114 | +## 🧭 사용 흐름 예시 |
| 115 | + |
| 116 | +### 🎣 낚시 유저 A |
| 117 | +- 현재 위치 기준 **낚시 포인트 추천** |
| 118 | +- → 추천 포인트 3곳 + 해양 정보 제공 |
| 119 | + |
| 120 | +### 🤿 다이버 B |
| 121 | +- 특정 반경 내 **다이빙 장소 조회** |
| 122 | +- → 추천 포인트 3곳 + 해양 정보 제공 |
| 123 | + |
| 124 | +--- |
| 125 | + |
| 126 | +## 🔗 API 목록 |
| 127 | + |
| 128 | +| 항목 | 출처 | 설명 | |
| 129 | +|------|------|------| |
| 130 | +| 기상/해양 정보 | [Open-Meteo Marine API](https://open-meteo.com/) | 수온, 조류, 파도, 바람 등 | |
| 131 | +| 해파리 속보 | [국립수산과학원](https://www.nifs.go.kr/) | 해양 위험 생물 정보 | |
| 132 | +| 위치 서비스 | Kakao Map API | 위경도 ↔ 행정구역 변환 | |
| 133 | +| 주소정보 | Kakao Geocoding | 위치 기반 주소 추정 | |
| 134 | +| 로그인/OAuth | Kakao Oauth 2.0 | 사용자 로그인 연동 | |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## 📸 개발 결과물 |
| 139 | + |
| 140 | +- ✅ Postman 테스트 완료 (모든 API 정상 응답) |
| 141 | +- ✅ ERD 및 스키마 설계 완료 |
| 142 | +- ✅ GitHub Actions 통한 Docker 빌드 및 배포 자동화 |
| 143 | +- ✅ 이메일 알림 연동 완료 |
| 144 | +- ✅ 위치 기반 레저 포인트 추천 기능 정상 작동 |
| 145 | + |
| 146 | +--- |
| 147 | + |
| 148 | +## 📅 일정 (WBS 요약) |
| 149 | + |
| 150 | +| 주차 | 주요 내용 | |
| 151 | +|------|----------| |
| 152 | +| 1주차 | 기획/요구사항 도출, 외부 API 분석, 공통 코드 작성 | |
| 153 | +| 2주차 | 백엔드 API 개발 및 DB 설계 | |
| 154 | +| 3주차 | 프론트-백 통합 및 리팩토링, 기능 추가 | |
| 155 | +| 4주차 | 배포 및 발표 자료 준비 | |
| 156 | + |
| 157 | +📎 전체 일정 보기: [WBS Notion 링크](https://www.notion.so/WBS-21e15a01205481a59984c28195e49260?pvs=21) |
| 158 | + |
| 159 | +--- |
| 160 | + |
| 161 | +## 🧪 설치 및 실행 방법 |
| 162 | + |
| 163 | +1. `.env` 파일 작성 |
| 164 | +2. Docker 기반 배포 |
| 165 | +```bash |
| 166 | +# 빌드 및 실행 |
| 167 | +docker-compose up --build |
0 commit comments