Skip to content

prgrms-web-devcourse-final-project/WEB5_7_7STARBALL_BE

Repository files navigation

🌊 MarineLeisure - 수상레저 특화 해양 정보 서비스

7성구 팀의 레저 활동자를 위한 위치 기반 맞춤형 해양 정보 제공 플랫폼


📌 프로젝트 소개

MarineLeisure는 낚시, 스쿠버다이빙, 해루질, 서핑 등 수상레저 활동을 즐기는 사용자를 위해 설계된 웹 기반 정보 서비스입니다. 실시간 기상 및 해양 생물 정보를 통해 안전하고 효율적인 레저 활동을 가능하게 합니다.

수온, 조류, 파도, 시야 등 다양한 해양 데이터를 기반으로 레저 최적 장소를 추천하고, 위험 생물 정보를 제공하여 사용자 경험을 향상시킵니다.


👥 팀원 소개

이름 역할 담당 이메일 GitHub 한마디
👨‍💻 조건웅 백엔드 팀장 외부 API 연계 및 지도, 알림 관련 서비스 [email protected] gunwoong1630 Hi
👨‍💻 김명진 백엔드 개발 활동 관련 서비스 [email protected] audwls239 잘 부탁드려요!
👨‍💻 허재원 백엔드 개발 인증 서비스 개발 [email protected] johnhuh619 안녕하세요~~
👩‍💻 이선빈 백엔드 개발 모임 관련 서비스 [email protected] twinkey0201 안녕하십니까

💡 기획 의도

  • 기존 기상·해양 정보는 학술 목적이거나 파편화되어 있어 접근이 어려움
  • 수상레저 활동은 활동별 필요한 정보가 상이
  • 사용자의 위치, 활동 유형에 따라 맞춤 정보 제공이 필요

MarineLeisure는 활동별 맞춤형 지수, 위치 기반 추천, 즐겨찾기, 모임 개설, 위험 생물 알림 등을 통해 보다 개인화된 레저 서비스를 제공합니다.


🎯 주요 기능

기능 설명
📍 위치 기반 추천 현재 위치 기반 가까운 최적의 레저 장소 추천
🌊 활동별 정보 제공 낚시, 해루질, 다이빙, 서핑에 맞춘 기상 및 해양 데이터 제공
🐟 해양 위험 생물 알림 국립수산과학원 데이터 기반 위험 생물 출몰 경고
⭐ 즐겨찾기 & 알림 자주 가는 포인트를 등록하고 조건 만족 시 알림 전송
👥 모임 생성 레저 포인트 기반 모임 개설 및 참여 (선착순 모집)

🛠️ Troubleshooting (문제 해결 사례)

🔸 1. 위치 기반 지점 추천 성능 병목

  • 문제: 사용자의 현재 위치로 주변 지점을 추천할 때, 비회원 포함 전 사용자 요청으로 트래픽 집중. DB 조회가 복잡해 병목 발생.
  • 해결 방법:
    • 행정구역 단위로 프리셋 지점을 미리 정의 및 캐싱
    • 사용자는 좌표만 보내고, 서버는 해당 위치에 맞는 사전 정의 지점 목록을 즉시 반환
  • 효과: 실시간 DB 조회 횟수 감소, 성능 안정성 확보

🔸 2. 카카오 API 사용 중 429 Too Many Requests 발생

  • 문제: 역지오코딩 요청이 많아져 카카오 API의 호출 한도를 초과 → 요청 실패율 증가
  • 해결 방법:
    • Resilience4j 서킷브레이커 적용
    • 일정 실패율 이상일 때 외부 API 호출 차단 + fallback 응답 처리
  • 효과: API 안정성 향상, 시스템 다운 위험 방지

🔸 3. 외부 API 의존 → 자체 역지오코딩 시스템 구축

  • 문제: Kakao Maps API 의존으로 429 에러 지속 발생, 트래픽 증가 시 불안정
  • 해결 방법:
    • 공공 OpenAPI에서 제공하는 시/도 경계 SHP 파일 확보
    • GeoTools 라이브러리를 사용해 좌표 → 행정구역 자체 변환 시스템 구현
  • 효과: 외부 API 의존 제거, 트래픽 급증 시에도 안정적 응답 가능

🔸 4. 위험생물 PDF → JSON 자동화 오류

  • 문제: 국립수산과학원 PDF 양식이 유동적이라 기존 좌표 기반 파싱 방식 실패
  • 해결 방법:
    • OpenAI를 활용해 PDF 내 텍스트 패턴 분석 → JSON으로 직접 변환
    • 불규칙한 표에서도 문맥 기반으로 정보 추출 가능
  • 효과: 자동화 정확도 향상, 비용/속도 최적화 (1,000토큰 ≒ 0.0002달러)

🔸 5. Native Query의 과도한 조인으로 인한 성능 저하

  • 문제: 복잡한 LEFT JOIN으로 인해 불필요한 중복 로우 발생, 결과셋 비대 → 응답 시간 지연
  • 해결 방법:
    • 네이티브 SQL 단순화 및 조회 최적화
    • 필요 데이터만 분리 조회하고 애플리케이션 단에서 가공
  • 효과: p95 응답 시간 개선 (7초 → 1.79초 → 20ms까지)

🔸 6. Hikari 커넥션 풀 과부하 문제

  • 문제: 고트래픽 환경에서 커넥션 풀 병목으로 인해 처리량 제한
  • 해결 방법:
    • maximumPoolSize를 10 → 20 → 30 → 50으로 단계적 조정 후 최적값 도출
    • 최종 권장 설정: maximumPoolSize = 30
  • 효과: 커넥션 안정화, 응답 시간 p95 ≈ 15ms

🔸 7. OAuth2 로그인 보안 취약점

  • 문제: state/code 탈취 공격에 취약 가능성
  • 해결 방법:
    • PKCE(Proof Key for Code Exchange) 적용
    • code_verifier를 클라이언트에 저장, 탈취 시에도 인증 불가
  • 효과: OAuth 보안 강화, 안전한 로그인 플로우 확보

🛠 기술 스택

구분 기술
Frontend React, Next.js, TailwindCSS
Backend Spring Boot, JWT, REST API
DB MySQL, H2 (테스트)
Infra AWS EC2, Docker, GitHub Actions (CI/CD)
API 바다누리 OpenAPI, Open-Meteo, Kakao API, 국립수산과학원
기타 Redis , Geo tools, Apache PDFBox (보고서), GitHub

🧭 사용 흐름 예시

🎣 낚시 유저 A

  • 현재 위치 기준 낚시 포인트 추천
  • → 추천 포인트 3곳 + 해양 정보 제공

🤿 다이버 B

  • 특정 반경 내 다이빙 장소 조회
  • → 추천 포인트 3곳 + 해양 정보 제공

🔗 API 목록

항목 출처 설명
기상/해양 정보 Open-Meteo Marine API 수온, 조류, 파도, 바람 등
해파리 속보 국립수산과학원 해양 위험 생물 정보
위치 서비스 Kakao Map API 위경도 ↔ 행정구역 변환
주소정보 Kakao Geocoding 위치 기반 주소 추정
로그인/OAuth Kakao Oauth 2.0 사용자 로그인 연동

📸 개발 결과물

  • ✅ Postman 테스트 완료 (모든 API 정상 응답)
  • ✅ ERD 및 스키마 설계 완료
  • ✅ GitHub Actions 통한 Docker 빌드 및 배포 자동화
  • ✅ 이메일 알림 연동 완료
  • ✅ 위치 기반 레저 포인트 추천 기능 정상 작동

📅 일정 (WBS 요약)

주차 주요 내용
1주차 기획/요구사항 도출, 외부 API 분석, 공통 코드 작성
2주차 백엔드 API 개발 및 DB 설계
3주차 프론트-백 통합 및 리팩토링, 기능 추가
4주차 배포 및 발표 자료 준비

📎 전체 일정 보기: WBS Notion 링크


🧪 설치 및 실행 방법

  1. .env 파일 작성
  2. Docker 기반 배포
# 빌드 및 실행
docker-compose up --build

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors 6