Skip to content
Merged
Show file tree
Hide file tree
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
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# API 서버 주소
VITE_API_URL=
# API 서버 주소 (클라이언트에 공개되는 값만 사용)
EXPO_PUBLIC_API_URL=
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@ jobs:
- name: Format check
run: npm run format:check

- name: Typecheck
run: npm run typecheck

- name: Build
run: npm run build
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,10 @@ dist-ssr
# env
.env*
!.env.example

# Expo generated files
.expo/
expo-env.d.ts
web-build/
ios/
android/
4 changes: 1 addition & 3 deletions .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,5 @@
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 100,
"endOfLine": "lf",
"plugins": ["prettier-plugin-tailwindcss"],
"tailwindStylesheet": "./src/index.css"
"endOfLine": "lf"
}
64 changes: 63 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@

## 로컬 실행

Node.js 버전은 `.nvmrc`를 기준으로 맞춥니다.

```bash
npm ci
npm run dev
npm start
```

- 웹: `npm run web`
- iOS Simulator: `npm run ios` (macOS 및 Xcode 필요)
- Android: `npm run android` (에뮬레이터 또는 연결된 기기 필요)
- 실제 기기: 개발 서버가 안내하는 QR을 호환 버전의 Expo Go에서 스캔

## 커밋 전 검증

```bash
npm run typecheck
npm run lint
npm run format:check
npm run build
Expand Down Expand Up @@ -116,3 +124,57 @@ PR 제목은 Issue와 같은 형식을 사용합니다.
- 주요 변경 사항, 실제 검증 결과, 리뷰어가 확인할 내용을 작성합니다.
- UI 변경이 있다면 스크린샷 또는 화면 녹화를 첨부합니다.
- 하나의 PR은 하나의 작업 목표를 다룹니다.

## Expo 프로젝트 구성

Expo SDK 58 + React Native + Expo Router를 사용합니다.
웹 번들러는 Metro이며, 기존 Vite와 React Router 실행 설정은 제거했습니다.

```text
assets/images/ # 웹·모바일 공통 로고 및 아이콘
src/app/_layout.tsx # 라우터, Safe Area, 공유 상태 Provider
src/app/index.tsx # 시작
src/app/terms.tsx # 약관 동의
src/app/profile.tsx # 프로필 작성 및 수정
src/app/settings.tsx # 설정
src/features/onboarding/ # 화면 UI 및 데모 공유 상태
app.json # Expo 앱 설정
```

### 현재 구현 범위

- 시작 → 약관 동의 → 프로필 → 설정 화면
- 필수 약관 선택, 이름 필수 입력, 과목 복수 선택, 프로필 수정
- Expo Image로 번들에 포함된 SVG를 표시하며 웹 전용 절대 경로를 사용하지 않습니다.
- Safe Area 및 iOS 키보드 회피 처리
- 프로필·동의 상태는 메모리에만 보관하며 새로고침 또는 앱 재시작 시 초기화됩니다.
- 소셜 로그인, 이메일 인증, 비밀번호 재설정, 실제 계정 삭제는 API 연동 전입니다.
- 이메일 가입 및 소셜 로그인 창의 데모 버튼은 인증 없이 화면 흐름을 확인하는 용도입니다.
- 약관 원문은 아직 연결하지 않았으며 실제 가입 동의로 사용하면 안 됩니다.
- API 주소는 `.env.example`의 `EXPO_PUBLIC_API_URL` 형식을 사용합니다.

### 웹 배포

```bash
npm run build
```

정적 호스팅의 빌드 명령은 `npm run build`, 배포 폴더는 `dist`입니다.
`web.output`은 `single`이며 모든 경로를 `index.html`로 연결하는 SPA fallback이 필요합니다.

### 네이티브 번들 검증 및 앱 빌드

```bash
npm run export:ios
npm run export:android
```

위 명령은 JavaScript·에셋 번들 검증이며 설치 가능한 앱 파일을 생성하지 않습니다.
실제 앱 배포에는 앱 식별자, 서명 및 EAS Build 등 별도 구성이 필요합니다.
`ios/`, `android/`, `.expo/`는 생성 파일이므로 저장소에서 관리하지 않습니다.

### 의존성 진단 참고

Expo Doctor 검사를 통과했습니다. npm audit는 Expo CLI의 Zod 3 전이 의존성에서
보안 권고(GHSA-mrhx-c7xc-m3w5)를 보고합니다. CLI가 Zod 3 API를 사용하므로
강제로 Zod 4로 올리지 않았으며, 호환되는 상위 패키지 패치가 필요합니다.
21 changes: 21 additions & 0 deletions app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"expo": {
"name": "수담",
"slug": "sudam",
"version": "1.0.0",
"scheme": "sudam",
"orientation": "portrait",
"userInterfaceStyle": "light",
"plugins": ["expo-router"],
"web": {
"bundler": "metro",
"output": "single"
},
"ios": {
"supportsTablet": true
},
"android": {
"softwareKeyboardLayoutMode": "resize"
}
}
}
36 changes: 36 additions & 0 deletions assets/images/email.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions assets/images/google.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions assets/images/kakao.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions assets/images/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 1 addition & 3 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
import js from '@eslint/js';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import tseslint from 'typescript-eslint';
import { defineConfig, globalIgnores } from 'eslint/config';
import prettier from 'eslint-config-prettier/flat';

export default defineConfig([
globalIgnores(['dist']),
globalIgnores(['dist', '.expo', 'expo-env.d.ts']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
globals: globals.browser,
Expand Down
13 changes: 0 additions & 13 deletions index.html

This file was deleted.

Loading
Loading