Skip to content

Commit e816c76

Browse files
authored
Merge e1d51e6 into 5f0b079
2 parents 5f0b079 + e1d51e6 commit e816c76

File tree

2 files changed

+169
-2
lines changed

2 files changed

+169
-2
lines changed

README.md

Lines changed: 167 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,167 @@
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

src/main/java/sevenstar/marineleisure/global/enums/TimePeriod.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public static TimePeriod from(String value) {
1818
return timePeriod;
1919
}
2020
}
21-
throw new IllegalArgumentException("Invalid TimePeriod value: " + value);
21+
return TimePeriod.AM;
22+
// throw new IllegalArgumentException("Invalid TimePeriod value: " + value);
2223
}
2324

2425
}

0 commit comments

Comments
 (0)