1- # SEMOSAN_BE
1+ # SEMOSAN - 세모산 Backend
22
3- 세모산 백엔드 레포지토리입니다.
3+ <img src =" assets/screenshots/semosan.png " alt =" 세모산 앱 소개 " width =" 100% " />
4+
5+ <br />
6+
7+ > 등산이 처음이어도 괜찮아요.
8+ > 내 체력과 취향에 맞는 코스를 찾고, 실시간 안내와 기록, 후기까지
9+ > 더 가볍고 안전한 등산을 세모산과 함께 시작하세요.
10+
11+ <br />
12+
13+ ## Architecture
14+
15+ ``` mermaid
16+ flowchart LR
17+ APP[React Native App] --> API[Spring Boot API]
18+
19+ API --> DB[(PostgreSQL + PostGIS)]
20+ API --> REDIS[(Redis Stream)]
21+ API --> MINIO[(MinIO)]
22+
23+ API --> KAKAO[Kakao OAuth]
24+ API --> FCM[Firebase FCM]
25+
26+ PROM[Prometheus] -->|Scrape /actuator/prometheus| API
27+ ```
28+
29+ <br />
30+
31+ ## API Docs
32+
33+ | 구분 | URL |
34+ | ------| -----|
35+ | Swagger UI | ` http://localhost:8080/swagger-ui.html ` |
36+ | Health Check | ` http://localhost:9090/actuator/health ` |
37+ | Prometheus | ` http://localhost:9090/actuator/prometheus ` |
38+
39+ <br />
40+
41+ ## 주요 기능
42+
43+ <table >
44+ <tr >
45+ <td align="center" width="33%">
46+ <img src="assets/screenshots/home-feed.png" alt="정복 지도" width="220" />
47+ <br /><br />
48+ <b>정복 지도</b>
49+ <br />
50+ <sub>사용자의 등산 기록과 정복한 산 데이터 제공</sub>
51+ </td>
52+ <td align="center" width="33%">
53+ <img src="assets/screenshots/semofeed.png" alt="세모피드" width="220" />
54+ <br /><br />
55+ <b>세모피드</b>
56+ <br />
57+ <sub>등산 후기 피드, 이모지 반응, 알림 API 제공</sub>
58+ </td>
59+ <td align="center" width="33%">
60+ <img src="assets/screenshots/mountains.png" alt="산 탐색" width="220" />
61+ <br /><br />
62+ <b>산 목록</b>
63+ <br />
64+ <sub>산/코스 조회, 거리, 고도, 소요 시간 데이터 제공</sub>
65+ </td>
66+ </tr >
67+ <tr >
68+ <td align="center" width="33%">
69+ <img src="assets/screenshots/tracking.png" alt="GPS 트래킹" width="220" />
70+ <br /><br />
71+ <b>실시간 GPS 트래킹</b>
72+ <br />
73+ <sub>WebSocket 기반 위치 수집 및 트래킹 세션 관리</sub>
74+ </td>
75+ <td align="center" width="33%">
76+ <img src="assets/screenshots/community.png" alt="커뮤니티" width="220" />
77+ <br /><br />
78+ <b>커뮤니티</b>
79+ <br />
80+ <sub>게시글, 댓글, 좋아요, 신고, 차단 기능 제공</sub>
81+ </td>
82+ <td align="center" width="33%">
83+ <img src="assets/screenshots/mypage.png" alt="내 기록" width="220" />
84+ <br /><br />
85+ <b>마이페이지</b>
86+ <br />
87+ <sub>회원 정보, 등산 이력, 난이도 피드백 관리</sub>
88+ </td>
89+ </tr >
90+ </table >
91+
92+ <br />
493
594## 기술 스택
695
96+ ### Backend
97+ - ** Java 21**
98+ - ** Spring Boot 3.5.13**
99+ - ** Spring Web MVC** - REST API
100+ - ** Spring Security** - 인증/인가
101+ - ** Spring Data JPA** - ORM
102+ - ** Spring Validation** - 요청 검증
103+
104+ ### Database & Storage
105+ - ** PostgreSQL**
106+ - ** PostGIS** - 위치/공간 데이터 처리
107+ - ** Flyway** - DB 마이그레이션
108+ - ** Redis** - 캐시 및 트래킹 스트림
109+ - ** MinIO** - 이미지 객체 스토리지
110+
111+ ### 인증 & 외부 연동
112+ - ** Kakao OAuth**
113+ - ** JWT** (` jjwt ` )
114+ - ** Firebase Admin SDK** - FCM 푸시 알림
115+ - ** Spring WebFlux WebClient** - 외부 API 호출
116+
117+ ### 실시간 & 모니터링
118+ - ** Spring WebSocket** + ** STOMP** - 실시간 GPS 데이터 수신
119+ - ** Spring Boot Actuator**
120+ - ** Prometheus**
121+ - ** Logstash Logback Encoder** - Loki 연동용 JSON 로그
122+
123+ ### API 문서
124+ - ** Springdoc OpenAPI / Swagger UI**
125+
126+ <br />
127+
128+ ## 프로젝트 구조
129+
130+ ``` text
131+ src/main/java/com/semosan/api/
132+ ApiApplication.java
133+ common/ # 공통 설정, 응답, 예외, JWT, FCM
134+ domain/
135+ appversion/ # 앱 버전 관리
136+ auth/ # 인증, 회원 탈퇴 정리
137+ oauth/ # 카카오 OAuth 연동
138+ user/ # 회원, 온보딩, 차단
139+ mountain/ # 산/코스 조회, 코스 좋아요
140+ tracking/ # GPS 트래킹, WebSocket, 스케줄러
141+ hiking/ # 등산 기록, 난이도 피드백
142+ semofeed/ # 세모피드, 이모지, 알림
143+ community/ # 게시글, 댓글, 좋아요, 신고, 알림
144+ notification/ # 앱 알림
145+ image/ # 이미지 업로드
146+ review/ # 리뷰 도메인
147+
148+ src/main/resources/
149+ application.yaml # 공통 설정
150+ application-local.yaml # 로컬 프로필 설정
151+ application-prod.yaml # 운영 프로필 설정
152+ db/migration/ # Flyway 마이그레이션
153+ firebase/ # Firebase 서비스 계정 파일
154+
155+ k8s/ # Kubernetes 배포 리소스
156+ .github/workflows/ # GitHub Actions
157+ ```
158+
159+ <br />
160+
161+ ## 시작하기
162+
163+ ### 요구사항
164+
7165- Java 21
8- - Spring Boot 3.5.13
9166- PostgreSQL + PostGIS
10167- Redis
168+ - MinIO
169+ - Gradle Wrapper 사용 권장
11170
12- ---
171+ ### 설치
13172
14- ## 브랜치 전략
173+ ``` bash
174+ git clone https://github.com/SEMOSAN/SEMOSAN_BE.git
175+ cd SEMOSAN_BE
176+ ```
177+
178+ ### 로컬 실행
179+
180+ 로컬 프로필은 기본값으로 활성화됩니다.
181+
182+ ``` bash
183+ ./gradlew bootRun
184+ ```
185+
186+ ### 테스트
187+
188+ ``` bash
189+ ./gradlew test
190+ ```
191+
192+ 특정 테스트만 실행할 때는 다음 형식을 사용합니다.
15193
194+ ``` bash
195+ ./gradlew test --tests com.semosan.api.domain.mountain.service.MountainServiceTest
16196```
197+
198+ <br />
199+
200+ ## 개발 규칙
201+
202+ - Java 21, Spring Boot 3.5.x 기준으로 개발합니다.
203+ - 기능은 기존 ` domain/* ` 패키지 구조를 따릅니다.
204+ - 공통 응답, 예외, 상태 코드는 ` common/ ` 의 기존 규칙을 우선 사용합니다.
205+ - DB 스키마 변경은 ` src/main/resources/db/migration/ ` 에 Flyway 마이그레이션으로 추가합니다.
206+ - 비즈니스 규칙, payload 생성, 검증 로직을 중복 작성하지 않습니다.
207+ - 좁은 변경은 관련 테스트를 먼저 실행하고, 필요 시 전체 테스트를 실행합니다.
208+ - 민감한 값은 커밋하지 않고 환경 변수 또는 배포 Secret으로 관리합니다.
209+
210+ <br />
211+
212+ ## 브랜치 전략
213+
214+ ``` text
17215feat/#이슈번호-기능명
18216fix/#이슈번호-버그명
19217```
20218
21- ** 예시**
22- ```
219+ 예시:
220+
221+ ``` text
23222feat/#12-mountain-search
24223fix/#34-trail-query-bug
25224```
26225
27- ---
226+ < br />
28227
29228## 커밋 컨벤션
30229
@@ -37,50 +236,16 @@ fix/#34-trail-query-bug
37236| ` test ` | 테스트 코드 |
38237| ` chore ` | 빌드, 설정 변경 |
39238
40- ** 예시**
41- ```
239+ 예시:
240+
241+ ``` text
42242feat: 산 검색 API 추가
43243fix: 등산로 조회 쿼리 오류 수정
44244```
45245
46- ---
246+ < br />
47247
48248## PR 규칙
49249
50250- 리뷰어: 본인 제외 ** 2명 전원 승인** 후 머지
51251- 셀프 머지 금지
52-
53- ---
54-
55- ## Claude Code 사용 가이드
56-
57- ### 팀 공유 스킬 위치
58-
59- 팀에서 공유하는 커스텀 명령어(스킬)는 ` .claude/commands/ ` 폴더에서 관리합니다.
60-
61- ```
62- .claude/
63- └── commands/
64- └── {스킬명}.md
65- ```
66-
67- ### 스킬 추가하는 법
68-
69- 1 . ` .claude/commands/ ` 폴더에 ` 스킬명.md ` 파일 생성
70- 2 . 파일 안에 프롬프트 작성
71- 3 . git에 커밋 후 push → 팀원들이 pull하면 자동으로 공유됨
72-
73- ** 예시** ` .claude/commands/review.md `
74- ``` markdown
75- 이 PR의 코드를 리뷰해줘.
76- - 보안 취약점 확인
77- - 네이밍 컨벤션 확인
78- - 불필요한 코드 확인
79- ```
80-
81- 터미널에서 ` /review ` 로 호출 가능.
82-
83- ### CLAUDE.md 관리
84-
85- 프로젝트 루트의 ` CLAUDE.md ` 는 Claude Code가 자동으로 읽는 팀 공통 가이드입니다.
86- 기술 스택, 컨벤션, 주의사항 등 Claude에게 알려줄 내용을 여기에 작성합니다.
0 commit comments