Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 47 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
# 오름
> 한국의 산 정보를 제공하고, 등산 기록을 측정/관리하는 iOS 앱
> [앱스토어](https://apps.apple.com/kr/app/%EC%98%A4%EB%A6%84-%EB%82%98%EC%9D%98-%EB%93%B1%EC%82%B0-%EA%B8%B0%EB%A1%9D/id6753770017)
> 현재 버전: 1.3.0
> 현재 버전: 1.4.1

<br>

## 📌 프로젝트 소개
> 프로젝트 기간: 2025/09/21 ~ 2025/10/09
> 업데이트 기간: 2025/10/10 ~ 현재
> 개인 프로젝트

**오름**은 등산 기록 및 관리 앱입니다.
- Restful API를 통해 한국의 산 정보를 제공하고
- Healthkit을 활용하여 등산 활동을 추적하며
- Realm DB를 통해 사진, 후기 등의 기록을 관리할 수 있습니다.
- 한국의 산 정보를 제공하고
- 등산 활동을 추적해 통계를 제공하며
- 사진, 후기, 별점으로 등산 기록을 관리할 수 있습니다.

<br>

Expand All @@ -25,18 +26,34 @@

<br>

## 📌 기술스택
## 📌 기술스택

**Architecture**
- Tuist를 활용해 Clean Architecture 계층을 모듈화하여 의존성 관리 및 빌드 효율 향상
- MVVM-C와 Combine 기반 구조체 Input/Output 패턴으로 명확한 데이터 흐름과 반응형 프로그래밍 구현
- DI Container를 적용해 서비스/개발 환경별 Repository 주입 분리 및 테스트 용이성 확보
- Alamofire와 Router 패턴으로 API 통신 구조 표준화, NWPathMonitor로 네트워크 상태 감지, 응답 값 기반 에러 처리

**Network**
- NSCache와 FileManager를 활용한 캐싱 구현으로 데이터 접근 속도 개선 및 네트워크 단절 상황 대응
- NWPathMonitor로 네트워크 상태를 감지해 단절/재연결 배너를 상단 표기
- Alamofire와 Router 패턴으로 API 통신 구조 표준화, 응답 값 기반 에러 처리

**Data**
- Realm을 활용한 1:N 관계형 DB 설계, 양방향 관계 설정으로 데이터 무결성 보장
- 지도 줌 레벨 기반 Grid 클러스터링으로 시각적 가독성 개선
- HealthKit을 활용해 앱 종료 중에도 데이터 수집
- HealthKit을 활용해 앱이 종료된 상태에서의 데이터 수집, 휴리스틱 필터와 칼만 필터로 데이터 보정
- WidgetKit으로 측정 중 정보 표기
- 로컬 Push 알림으로 등산 완료 시 앱에서도 측정 종료 유도
- Quad-Tree 알고리즘 클러스터링으로 지도의 시각적 가독성과 효율성 개선
- 기기 크기에 따른 이미지 리사이징으로 저장 공간 절감 및 성능 향상

**CI / CD**
- DI Container를 적용해 서비스/개발 환경별 Repository 주입 분리 및 테스트 용이성 확보
- Github Actions와 Fastlane으로 자동화된 테스트와 배포 시스템 구현

**Mornitoring**
- Firebase Analytics와 Crashlytics로 사용자 행동 및 안정성 모니터링
- UIKit(code base, +SwiftUI), Combine, MapKit, CoreLocation, HealthKit, Charts, NWPathMonitor, Tuist, Realm, Alamofire, Kingfisher, SnapKit, Toast, Firebase Analytics, Firebase Crashlytics

**Frameworks**
- UIKit(code base, +SwiftUI), Combine, MapKit, CoreLocation, HealthKit, Charts, NWPathMonitor, Tuist, Realm, Alamofire,XMLCoder, Kingfisher, SnapKit, Toast, Firebase Analytics, Firebase Crashlytics

<br>

Expand All @@ -49,53 +66,41 @@
<th><code>검색/산 정보 보기</code></th>
</tr>
<tr>
<td><img src="https://github.com/user-attachments/assets/1762f489-375d-4618-bab2-b3ea5321a3e4" alt="등산 기록 관리"></td>
<td><img src="https://github.com/user-attachments/assets/2f6702ff-343e-436f-ae56-9bd441e7aa29" alt="기록 측정/통계"></td>
<td><img src="https://github.com/user-attachments/assets/271e8ae8-a1f4-4c54-8095-c8dfd655e045" alt="명산 지도"></td>
<td><img src="https://github.com/user-attachments/assets/983f0037-04ed-42fe-a890-b89de42ac4ea" alt="검색/산 정보 보기"></td>
<td><img src="https://github.com/user-attachments/assets/3ab1071c-5414-4ae0-8568-7e07af5934c8" alt="등산 기록 관리"></td>
<td><img src="https://github.com/user-attachments/assets/0c59b980-e1ca-4e7e-855c-c0155386e2f4" alt="기록 측정/통계"></td>
<td><img src="https://github.com/user-attachments/assets/8e370234-45c3-4acd-91bb-edaf2616d867" alt="명산 지도"></td>
<td><img src="https://github.com/user-attachments/assets/cf01e639-e6b6-4780-baa9-5a5020253dfb" alt="검색/산 정보 보기"></td>
</tr>
</table>

<details>
<summary><b>등산 기록 관리</b></summary>

- Realm DB를 활용하여 등산 기록을 로컬에 저장하고 관리
**등산 기록 관리**
- 등산 기록을 저장하고 관리
- 등산 중 촬영한 사진과 후기, 별점과 측정 정보 등을 함께 저장
- 디바이스 크기에 따른 이미지 Resizing으로 저장 공간 관리
- 수정/삭제, 검색/북마크 기능 지원

</details>

<details>
<summary><b>기록 측정/통계</b></summary>

- HealthKit을 활용하여 앱이 실행 중이 아니더라도 걸음 수와 이동 거리 측정
- 실시간으로 등산 진행 상황을 확인
**기록 측정/통계**
- 등산 중 걸음 수와 이동 거리 측정
- 실제 측정 기록과 유사하도록 측정 데이터 보정(휴리스틱 필터, 칼만 필터)
- 운동 시간, 휴식 시간 분석 및 걸음 수, 이동 거리 통계 정보 제공
- Charts를 활용한 시간 별 걸음 수/이동 거리 시각화
- 시간 별 걸음 수/이동 거리, 평균 대비 기록을 차트로 시각화
- 위젯으로 등산 측정 진행 상황을 표기(산 이름, 경과 시간)
- 측정 시작 3시간 이후 1시간마다 측정 중인지 확인하는 로컬 Push 알림

</details>

<details>
<summary><b>명산 지도</b></summary>

- MapKit을 사용하여 전국의 명산 위치를 지도에 표시
- 줌 레벨에 따른 Grid 기반 Clustering
**명산 지도**
- 전국의 명산 위치를 지도에 표시
- 현재 위치 기반으로 주변 산 탐색
- 지도에서 산을 선택하여 상세 정보 확인 가능

</details>
- 밀집된 영역은 묶어서 개수로 함께 표기
- 산을 선택하여 상세 정보 확인 가능

<details>
<summary><b>검색/산 정보 보기</b></summary>

**검색/산 정보 보기**
- 전국 산 정보 검색
- 검색 결과에서 산을 선택하여 상세 페이지로 이동
- Geocoding과 기상청 API를 연결해 날씨 정보 제공
- 국토교통부와 기상청 API를 연결해 날씨 정보 제공
- 산 이름, 위치, 높이 등의 기본 정보 제공
- Realm DB를 통한 최근 검색어 기능 지원

</details>
- 최근 검색어 기능 지원

<br>

Expand Down Expand Up @@ -148,7 +153,7 @@ tuist generate


### Try
- **API 복구 이후에는 더 풍부한 데이터를 활용해 로직을 단순화하고, 제공 정보를 확장할 예정입니다.**
- **API 복구 이후에는 더 풍부한 데이터를 활용해 로직을 단순화하고, 제공 정보를 확장할 예정입니다. (업데이트 완료)**
- **Clean Architecture, Coordinator, DIContainer 등 이론적으로 학습했던 개념을 직접 적용해보며 많은 인사이트를 얻었습니다.**
앞으로도 다양한 설계 개념을 지속적으로 학습하고 적용하여, 보다 완성도 높은 구조와 코드 품질을 구현할 수 있도록 노력하겠습니다.

Expand Down