7성구 팀의 레저 활동자를 위한 위치 기반 맞춤형 해양 정보 제공 플랫폼
MarineLeisure는 낚시, 스쿠버다이빙, 해루질, 서핑 등 수상레저 활동을 즐기는 사용자를 위해 설계된 웹 기반 정보 서비스입니다. 실시간 기상 및 해양 생물 정보를 통해 안전하고 효율적인 레저 활동을 가능하게 합니다.
수온, 조류, 파도, 시야 등 다양한 해양 데이터를 기반으로 레저 최적 장소를 추천하고, 위험 생물 정보를 제공하여 사용자 경험을 향상시킵니다.
이름 | 역할 | 담당 | 이메일 | GitHub | 한마디 |
---|---|---|---|---|---|
👨💻 조건웅 | 백엔드 팀장 | 외부 API 연계 및 지도, 알림 관련 서비스 | [email protected] | gunwoong1630 | Hi |
👨💻 김명진 | 백엔드 개발 | 활동 관련 서비스 | [email protected] | audwls239 | 잘 부탁드려요! |
👨💻 허재원 | 백엔드 개발 | 인증 서비스 개발 | [email protected] | johnhuh619 | 안녕하세요~~ |
👩💻 이선빈 | 백엔드 개발 | 모임 관련 서비스 | [email protected] | twinkey0201 | 안녕하십니까 |
- 기존 기상·해양 정보는 학술 목적이거나 파편화되어 있어 접근이 어려움
- 수상레저 활동은 활동별 필요한 정보가 상이
- 사용자의 위치, 활동 유형에 따라 맞춤 정보 제공이 필요
MarineLeisure는 활동별 맞춤형 지수, 위치 기반 추천, 즐겨찾기, 모임 개설, 위험 생물 알림 등을 통해 보다 개인화된 레저 서비스를 제공합니다.
기능 | 설명 |
---|---|
📍 위치 기반 추천 | 현재 위치 기반 가까운 최적의 레저 장소 추천 |
🌊 활동별 정보 제공 | 낚시, 해루질, 다이빙, 서핑에 맞춘 기상 및 해양 데이터 제공 |
🐟 해양 위험 생물 알림 | 국립수산과학원 데이터 기반 위험 생물 출몰 경고 |
⭐ 즐겨찾기 & 알림 | 자주 가는 포인트를 등록하고 조건 만족 시 알림 전송 |
👥 모임 생성 | 레저 포인트 기반 모임 개설 및 참여 (선착순 모집) |
- 문제: 사용자의 현재 위치로 주변 지점을 추천할 때, 비회원 포함 전 사용자 요청으로 트래픽 집중. DB 조회가 복잡해 병목 발생.
- 해결 방법:
- 행정구역 단위로 프리셋 지점을 미리 정의 및 캐싱
- 사용자는 좌표만 보내고, 서버는 해당 위치에 맞는 사전 정의 지점 목록을 즉시 반환
- ✅ 효과: 실시간 DB 조회 횟수 감소, 성능 안정성 확보
- 문제: 역지오코딩 요청이 많아져 카카오 API의 호출 한도를 초과 → 요청 실패율 증가
- 해결 방법:
- Resilience4j 서킷브레이커 적용
- 일정 실패율 이상일 때 외부 API 호출 차단 + fallback 응답 처리
- ✅ 효과: API 안정성 향상, 시스템 다운 위험 방지
- 문제: Kakao Maps API 의존으로 429 에러 지속 발생, 트래픽 증가 시 불안정
- 해결 방법:
- 공공 OpenAPI에서 제공하는 시/도 경계 SHP 파일 확보
- GeoTools 라이브러리를 사용해 좌표 → 행정구역 자체 변환 시스템 구현
- ✅ 효과: 외부 API 의존 제거, 트래픽 급증 시에도 안정적 응답 가능
- 문제: 국립수산과학원 PDF 양식이 유동적이라 기존 좌표 기반 파싱 방식 실패
- 해결 방법:
- OpenAI를 활용해 PDF 내 텍스트 패턴 분석 → JSON으로 직접 변환
- 불규칙한 표에서도 문맥 기반으로 정보 추출 가능
- ✅ 효과: 자동화 정확도 향상, 비용/속도 최적화 (1,000토큰 ≒ 0.0002달러)
- 문제: 복잡한 LEFT JOIN으로 인해 불필요한 중복 로우 발생, 결과셋 비대 → 응답 시간 지연
- 해결 방법:
- 네이티브 SQL 단순화 및 조회 최적화
- 필요 데이터만 분리 조회하고 애플리케이션 단에서 가공
- ✅ 효과: p95 응답 시간 개선 (7초 → 1.79초 → 20ms까지)
- 문제: 고트래픽 환경에서 커넥션 풀 병목으로 인해 처리량 제한
- 해결 방법:
maximumPoolSize
를 10 → 20 → 30 → 50으로 단계적 조정 후 최적값 도출- 최종 권장 설정: maximumPoolSize = 30
- ✅ 효과: 커넥션 안정화, 응답 시간 p95 ≈ 15ms
- 문제: 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 |
- 현재 위치 기준 낚시 포인트 추천
- → 추천 포인트 3곳 + 해양 정보 제공
- 특정 반경 내 다이빙 장소 조회
- → 추천 포인트 3곳 + 해양 정보 제공
항목 | 출처 | 설명 |
---|---|---|
기상/해양 정보 | Open-Meteo Marine API | 수온, 조류, 파도, 바람 등 |
해파리 속보 | 국립수산과학원 | 해양 위험 생물 정보 |
위치 서비스 | Kakao Map API | 위경도 ↔ 행정구역 변환 |
주소정보 | Kakao Geocoding | 위치 기반 주소 추정 |
로그인/OAuth | Kakao Oauth 2.0 | 사용자 로그인 연동 |
- ✅ Postman 테스트 완료 (모든 API 정상 응답)
- ✅ ERD 및 스키마 설계 완료
- ✅ GitHub Actions 통한 Docker 빌드 및 배포 자동화
- ✅ 이메일 알림 연동 완료
- ✅ 위치 기반 레저 포인트 추천 기능 정상 작동
주차 | 주요 내용 |
---|---|
1주차 | 기획/요구사항 도출, 외부 API 분석, 공통 코드 작성 |
2주차 | 백엔드 API 개발 및 DB 설계 |
3주차 | 프론트-백 통합 및 리팩토링, 기능 추가 |
4주차 | 배포 및 발표 자료 준비 |
📎 전체 일정 보기: WBS Notion 링크
.env
파일 작성- Docker 기반 배포
# 빌드 및 실행
docker-compose up --build