병원 환자 실내 위치 추적 시스템의 iOS 클라이언트 — Apple Developer Academy @ POSTECH 6기 챌린지 프로젝트.
ESP32-C6 비콘으로부터 수집된 위치 데이터를 의료진/관리자가 실시간으로 확인할 수 있는 SwiftUI 기반 iOS 앱.
| 컴포넌트 | 역할 | 레포 |
|---|---|---|
| Findew (이 레포) | iOS 클라이언트 — 환자/디바이스/실내맵 모니터링 | ADA6-IoT/SwiftUIApp |
| ESP32-C6 펌웨어 | FTM/ESP-NOW 기반 위치 비콘·게이트웨이 | ADA6-IoT/SwiftEmbedded |
| Vapor 백엔드 | REST API + JWT 인증 + PostgreSQL + S3 | ADA6-IoT/VaporServer |
- 로그인 인증 — JWT 토큰 + 자동 갱신 (TokenRefresh)
- 환자 관리 탭 — 환자별 현재 위치/상태 모니터링
- 디바이스 관리 탭 — 비콘/게이트웨이 디바이스 등록·관리
- 실내 지도(IndoorMap) — Apple IMDF (Indoor Mapping Data Format) 기반 시각화
- 부서/병실 관리 — 병원 행정 단위 매핑
- Language / UI: Swift, SwiftUI
- Min iOS: 26.0
- Architecture: AppFlow + DIContainer (의존성 주입), Clean Architecture (Network: UseCase → Service → Router)
- Auth: JWT + Keychain 저장 + 토큰 자동 갱신
- Map: IMDF (Apple Indoor Maps)
- Networking: URLSession + Router 패턴
- macOS + Xcode 26 이상
- iOS 26.0 시뮬레이터 또는 실기기
- 백엔드(
VaporServer) 실행 중
git clone https://github.com/ADA6-IoT/SwiftUIApp.git
cd SwiftUIApp/Findew
open Findew.xcodeprojXcode에서:
Findewscheme 선택- 시뮬레이터/디바이스 선택
- ⌘R 빌드+실행
Findew/Core/Secret/ 또는 Findew/Resources/Environment/에 환경 설정 (백엔드 주소).
Findew/Findew/
├── App/ # @main FindewApp + AppDelegate
├── Common/ # 공용 컴포넌트
├── Core/
│ └── Secret/ # API 키/시크릿
├── Model/
│ ├── DTO/ # 네트워크 응답 모델
│ ├── Domain/ # 비즈니스 도메인 모델
│ └── IMDF/ # Indoor Mapping Data Format
├── Network/
│ ├── Common/ # 공통 응답 처리
│ ├── Protocol/ # 네트워크 프로토콜
│ ├── Router/ # Auth/Department/Device/Hospital/Patient/Room
│ ├── Service/ # 도메인별 서비스
│ ├── TokenRefresh/ # JWT 토큰 갱신
│ └── UseCase/ # 유스케이스 레이어
├── Present/
│ ├── AppFlow/ # 앱 상태 머신 (splash/login/home)
│ └── Tab/ # FindUTab + Devices/IndoorMap/Patients/ToolBar
└── Resources/
├── Assets/, Fonts/, Static/
├── Extension/, Modifier/
├── Keychain/ # Keychain 래퍼
└── Environment/ # 환경 변수
main- 제품 출시 브랜치develop- 출시를 위해 개발하는 브랜치feat/xx- 기능 단위로 독립적인 개발 환경을 위해 작성refac/xx- 개발된 기능을 리팩토링 하기 위해 작성hotfix/xx- 출시 버전에서 발생한 버그를 수정하는 브랜치chore/xx- 빌드 작업, 패키지 매니저 설정 등design/xx- 디자인 변경bugfix/xx- 버그 수정
- 파라미터 이름을 기준으로 줄바꿈 한다.
let actionSheet = UIActionSheet(
title: "정말 계정을 삭제하실 건가요?",
delegate: self,
cancelButtonTitle: "취소",
destructiveButtonTitle: "삭제해주세요"
)if let구문이 길 경우 줄바꿈 한다.
if let user = self.veryLongFunctionNameWhichReturnsOptionalUser(),
let name = user.veryLongFunctionNameWhichReturnsOptionalName(),
user.gender == .female {
// ...
}- 추가 작업 부분:
// TODO: - xxx - 코드 섹션 분리:
// MARK: - xxx - 함수에는 액션을 알 수 있는 주석 작성
PR 시 템플릿이 등장한다. 작성 항목:
- PR 유형 작성 —
[]사이에x입력하여 체크 - 작업 내용 작성 — 자세하게
- 추후 진행할 작업 — PR 이후 작업 내용
- 리뷰 포인트 — 본인 PR에서 확인이 꼭 필요한 부분
| 태그 | 설명 |
|---|---|
[Feat] |
새로운 기능 추가 |
[Fix] |
버그 수정 |
[Refactor] |
코드 리팩토링 (기능 변경 없이 구조 개선) |
[Style] |
코드 포맷팅, 들여쓰기 수정 등 |
[Docs] |
README, 문서 수정 |
[Test] |
테스트 코드 추가 및 수정 |
[Chore] |
패키지 매니저, 빌드 설정 등 |
[Design] |
UI, 레이아웃 등 디자인 관련 수정 |
[Hotfix] |
운영 중 긴급 수정 |
[CI/CD] |
배포·워크플로우 관련 |
| 아이콘 | 용도 | 아이콘 | 용도 | |
|---|---|---|---|---|
| 🎉 | 프로젝트 시작 | 📝 | 문서 추가/수정 | |
| ✨ | 새 기능 | 🐛 | 버그 수정 | |
| 💄 | UI/스타일 | ♻️ | 리팩토링 | |
| 🔧 | 설정 변경 | 🚑 | 긴급 수정 | |
| 🔥 | 코드/파일 삭제 | ⚡️ | 성능 개선 | |
| ➕ | 의존성 추가 | 🙈 | .gitignore |
🎉 [Chore] 프로젝트 초기 세팅 ✨ [Feat] 환자 위치 추적 화면 구현 🐛 [Fix] 토큰 갱신 시 무한 루프 수정 💄 [Design] 로그인 화면 레이아웃 조정 📝 [Docs] README 환경 설정 섹션 추가
ADA6-IoT — Apple Developer Academy @ POSTECH 6기
MIT License — 자세한 내용은 LICENSE 참고.