우리 가족만의 취향, 우리 가족만의 시간
KIRI는 가족이 서로의 취향과 생각을 알아가고, 함께할 활동을 발견하고 기록할 수 있도록 돕는 가족 서비스입니다.
이 저장소는 KIRI iOS 애플리케이션을 관리합니다.
- Platform: iOS
- UI: SwiftUI
- Language: Swift
- Target Release: 2026.11.22
- Branch:
develop
| Category | Technology |
|---|---|
| Language | Swift |
| UI | SwiftUI |
| Architecture | Feature-based Structure |
| Navigation | AppRouter |
| Local State | Swift Observation (@Observable) |
| Local Storage | UserDefaults |
| UIKit Bridge | UIViewControllerRepresentable |
| IDE | Xcode |
현재 Server API 연결 전 단계에서는 Mock 데이터를 사용합니다.
실제 인증 및 API 연동이 시작되면 네트워크 계층과 인증 토큰 저장 구조를 별도로 추가합니다.
KIRI-iOS
├── README.md
│
└── KIRI
└── KIRI
├── App
│ ├── AppRouter.swift
│ ├── MainTabView.swift
│ └── RootView.swift
│
├── Core
│ ├── Components
│ │ ├── KIRIBackButton.swift
│ │ ├── KIRIPrimaryButton.swift
│ │ ├── KIRIShareSheet.swift
│ │ └── KIRITextField.swift
│ │
│ ├── DesignSystem
│ │ ├── KIRIColor.swift
│ │ ├── KIRIRadius.swift
│ │ ├── KIRISpacing.swift
│ │ └── KIRITypography.swift
│ │
│ └── Storage
│ └── AppSessionStore.swift
│
├── Features
│ ├── Auth
│ │ ├── AuthEntryView.swift
│ │ ├── AuthFlowView.swift
│ │ ├── LoginView.swift
│ │ ├── SignUpView.swift
│ │ └── TermsAgreementView.swift
│ │
│ ├── Home
│ │ └── HomeView.swift
│ │
│ ├── Mission
│ │ └── MissionView.swift
│ │
│ ├── MyPage
│ │ └── MyPageView.swift
│ │
│ ├── Onboarding
│ │ ├── FamilyCodeInputView.swift
│ │ ├── FamilyCodeLoadingView.swift
│ │ ├── FamilyCodeView.swift
│ │ ├── FamilyEntryView.swift
│ │ ├── FamilyJoinConfirmView.swift
│ │ ├── FamilyJoinLoadingView.swift
│ │ ├── FamilyNameView.swift
│ │ ├── NicknameView.swift
│ │ ├── OnboardingFlowView.swift
│ │ └── RoleSelectionView.swift
│ │
│ └── Record
│ └── RecordView.swift
│
├── Models
│ └── FamilyInvitation.swift
│
├── ContentView.swift
└── KIRIApp.swift
애플리케이션 전체 흐름을 관리합니다.
AppRouter.swift
앱의 최상위 상태와 화면 전환을 관리합니다.
현재 주요 상태:
authentication
onboarding
main사용자 이용 상태:
family
browseFeature 내부의 세부 화면 이동을 모두 AppRouter에 넣지 않습니다.
앱 전체 수준의 상태 전환만 관리합니다.
특정 Feature에 종속되지 않고 여러 화면에서 재사용할 수 있는 코드를 관리합니다.
공통 UI 컴포넌트입니다.
예:
KIRIPrimaryButton
KIRITextField
KIRIBackButton
KIRIShareSheet
2개 이상의 Feature에서 사용할 가능성이 높은 UI는 Core/Components에 배치합니다.
특정 화면에서만 사용하는 작은 View는 해당 Feature 내부에 둡니다.
KIRI 전체 디자인 기준을 관리합니다.
KIRIColor
KIRITypography
KIRISpacing
KIRIRadius
화면에서 색상, 여백, Radius 등을 임의로 반복 선언하기보다 DesignSystem에 정의된 값을 우선 사용합니다.
앱 내부 로컬 저장을 관리합니다.
현재:
AppSessionStore.swift
UserDefaults에는 로그인 여부, 온보딩 완료 여부 등 단순 앱 상태만 저장합니다.
비밀번호, Access Token, Refresh Token 등의 민감정보는 UserDefaults에 저장하지 않습니다.
사용자 기능 단위로 코드를 분리합니다.
Auth
Home
Mission
Record
MyPage
Onboarding
새로운 기능이 추가되면 가능한 한 Feature 단위로 분리합니다.
예:
Features
└── Question
├── QuestionView.swift
├── QuestionAnswerView.swift
└── QuestionResultView.swift
화면이 늘어난다는 이유만으로 모든 View를 하나의 폴더에 넣지 않습니다.
여러 화면이나 기능에서 공유되는 데이터 모델을 관리합니다.
현재:
FamilyInvitation.swift
특정 Feature에서만 사용하는 단순 모델은 해당 Feature 내부에 둘 수 있습니다.
현재 앱의 기본 진입 구조입니다.
KIRIApp
↓
RootView
↓
AppRouter
│
├── Authentication
│ ↓
│ AuthFlow
│ ↓
│ 로그인 / 회원가입
│
├── Onboarding
│ ↓
│ 닉네임
│ ↓
│ 가족 역할
│ ↓
│ 가족 진입 방식
│
└── Main
↓
MainTabView
Main Tab은 다음 네 개로 구성합니다.
홈
미션
기록
마이
현재 인증 화면 흐름은 다음과 같습니다.
Auth Entry
│
├── 로그인
│ ↓
│ Login
│
└── 회원가입
↓
Sign Up
↓
약관 동의
현재 Server API 연결 전이므로 실제 인증은 Mock 상태입니다.
향후 Server 연동 시 로그인 결과에 따라:
로그인
↓
온보딩 미완료 → Onboarding
온보딩 완료 → Main
으로 분기합니다.
기본 온보딩:
닉네임
↓
가족 역할 선택
↓
가족 진입 방식
가족 역할은 현재 다음 네 가지로 구분합니다.
엄마
아빠
아들
딸
가족공간 만들기
↓
가족명 입력
↓
가족 생성
↓
가족코드 발급
↓
초대하기
↓
Main
가족코드는 Server API 연결 전까지 Mock 데이터를 사용합니다.
가족코드 입력
↓
가족 조회
↓
가족공간 확인
↓
가족공간 참여
↓
Main
목표 플로우:
초대링크
↓
KIRI 실행
↓
로그인 / 회원가입
↓
기본정보 입력
↓
초대받은 가족 조회
↓
가족공간 확인
↓
참여
초대정보는 FamilyInvitation을 사용합니다.
로그인/회원가입 과정에서 초대정보가 사라지지 않도록 AppRouter의 pendingInvitation에서 관리합니다.
실제 Universal Link는 도메인 확정 후 연결합니다.
임의의 URL을 코드에 하드코딩하지 않습니다.
KIRI는 Main 진입 사용자를 두 상태로 구분합니다.
enum UserMode {
case family
case browse
}가족공간을 만들었거나 기존 가족공간에 참여한 사용자입니다.
가족 기반 기능을 정상적으로 사용할 수 있습니다.
아직 가족공간에 참여하지 않고 서비스를 먼저 둘러보는 사용자입니다.
가족공간을 전제로 하는 기능은 제한될 수 있습니다.
특히 둘러보기 상태에서는 가족 질문을 배정하거나 답변을 입력하지 않습니다.
향후 Home, Mission, Record 등의 화면은 UserMode에 따라 UI와 기능을 분기할 수 있습니다.
현재 앱 실행 상태는 AppSessionStore에서 관리합니다.
저장하는 값:
isAuthenticated
isOnboardingCompleted
userMode
따라서 온보딩을 완료한 사용자는 앱을 종료했다 다시 실행해도 Main으로 복귀할 수 있습니다.
로그아웃 시 저장된 세션 상태를 초기화합니다.
현재 세션 저장은 Server 인증 전 개발 단계의 임시 구조입니다.
실제 인증 도입 후 인증 토큰은 Keychain 기반 저장 구조로 분리합니다.
색상을 직접 반복 선언하지 않습니다.
.foregroundStyle(KIRIColor.textPrimary)Typography:
.font(KIRITypography.title)Spacing:
.padding(.horizontal, KIRISpacing.horizontal)Radius:
.clipShape(
RoundedRectangle(
cornerRadius: KIRIRadius.large
)
)동일한 형태의 버튼을 화면마다 새로 만들지 않습니다.
KIRIPrimaryButton(...)입력 필드:
KIRITextField(...)뒤로가기:
KIRIBackButton(...)반복되는 UI가 발생하면 공통화가 필요한지 먼저 확인합니다.
Type:
PascalCase
예:
FamilyCodeView
AppSessionStore
FamilyInvitationProperty / Function:
camelCase
예:
familyCode
selectedRole
enterFamilyMode()Boolean:
가능한 한 상태를 읽을 수 있는 형태로 작성합니다.
isAuthenticated
isValid
isShareSheetPresented
hasPendingInvitationView 파일은 기본적으로 View 이름과 파일 이름을 동일하게 유지합니다.
FamilyCodeView.swift
→ FamilyCodeView
하나의 화면이 지나치게 커지지 않도록 구성합니다.
권장 형태:
struct ExampleView: View {
// MARK: - Properties
// MARK: - Body
var body: some View {
...
}
// MARK: - Subviews
private var header: some View {
...
}
// MARK: - Actions
private func handleAction() {
...
}
}작은 UI는 private var로 분리할 수 있습니다.
재사용성이 생기면 별도 View 또는 Core/Components로 분리합니다.
Server API 연결 전 임시 로직은 반드시 TODO를 남깁니다.
// TODO: 가족공간 생성 API 연결 후 제거Mock 데이터임을 알 수 없는 형태로 값을 남기지 않습니다.
예:
createdFamilyCode = "KIRI24"를 사용하는 경우 해당 코드 근처에 Mock임을 명시합니다.
Server API 연결 후에는 Mock 로직을 제거합니다.
새로운 파일이나 폴더는 터미널에서 먼저 생성합니다.
폴더:
mkdir -p KIRI/KIRI/Features/Example파일:
touch KIRI/KIRI/Features/Example/ExampleView.swift터미널에서 touch로 파일을 생성했다면 Xcode에서 동일한 이름의 New File을 다시 생성하지 않습니다.
잘못 생성하면 다음과 같은 중복 파일이 생길 수 있습니다.
ExampleView.swift
ExampleView 2.swift
중복 파일 확인:
find KIRI/KIRI -type f \( -name "* 2.swift" -o -name "* 3.swift" -o -name "* 4.swift" \) -print새 파일이 Xcode에서 바로 보이지 않더라도 먼저 실제 파일 존재 여부를 확인합니다.
find KIRI/KIRI -type f -name "*.swift" | sort기본 브랜치:
main
develop
배포 가능한 안정 버전을 관리합니다.
직접 개발하지 않습니다.
현재 개발 내용을 통합하는 브랜치입니다.
기능 개발은 팀의 Git 전략에 따라 별도 브랜치를 생성한 뒤 develop으로 병합합니다.
커밋 메시지는 다음 형식을 사용합니다.
[Type] : 설명
예:
[Feat] : 가족공간 참여 플로우 구현
[Fix] : 온보딩 화면 전환 오류 수정
[Refactor] : 인증 상태 관리 구조 개선
[Design] : 가족코드 화면 UI 수정
[Chore] : Xcode 사용자 설정 파일 정리
[Docs] : iOS 프로젝트 README 작성
주요 Type:
| Type | 설명 |
|---|---|
| Feat | 새로운 기능 |
| Fix | 버그 수정 |
| Refactor | 코드 구조 개선 |
| Design | UI/디자인 수정 |
| Docs | 문서 |
| Chore | 설정 및 기타 작업 |
| Test | 테스트 |
Type의 첫 글자는 대문자로 작성합니다.
작업 시작 전:
git checkout develop
git pull origin develop현재 상태 확인:
git status개발 후 Xcode에서:
⌘ + B
빌드가 정상적으로 완료되는지 확인합니다.
중복 Swift 파일 확인:
find KIRI/KIRI -type f \( -name "* 2.swift" -o -name "* 3.swift" -o -name "* 4.swift" \) -print변경 내용 확인:
git status커밋:
git add -A
git commit -m "[Type] : 작업 내용"Push:
git push origin develop- 프로젝트 기본 구조
- DesignSystem 기본 구성
- Main Tab 구조
- 로그인/회원가입 UI
- 약관 동의 UI
- 닉네임 입력
- 가족 역할 선택
- 가족공간 진입 방식 선택
- 가족공간 생성 플로우
- 가족코드 발급 Mock
- 가족코드 복사
- iOS System Share Sheet
- 가족코드 입력
- 가족공간 조회 Mock
- 가족공간 참여 확인
- Family / Browse 상태 분리
- 초대정보 모델 및 pending invitation 구조
- 앱 세션 로컬 저장
- 앱 재실행 상태 복구
- 로그아웃 및 세션 초기화
- 로그인 API
- 회원가입 API
- 약관 동의 API
- 사용자 정보 저장 API
- 닉네임 중복 확인
- 가족명 중복 확인
- 가족공간 생성 API
- 가족코드 발급 API
- 가족코드 조회 API
- 가족공간 참여 API
- 초대링크 검증
- Universal Link
- 실제 사용자 세션 / 토큰 관리
- Home 화면 구현
- Family / Browse Home 분기
- 질문 기능
- 미션 기능
- 기록 / 가족 캘린더
- 마이페이지
- Server API 연결
- Universal Link
- 실제 인증 세션
- 디자인 QA
KIRI 1.0 목표:
2026.11.22
- Android 기존 서비스 업데이트
- iOS 신규 출시
iOS는 단순 화면 구현이 아니라 실제 App Store 출시 가능한 상태를 목표로 개발합니다.
KIRI는 가족이 서로를 조금 더 알아가고, 함께할 시간을 만들 수 있도록 개발하고 있습니다.