ARESλ μ·¨μ μ€λΉμλ€μ΄ λ©΄μ κ³Όμ μμ κ²ͺλ μ΄λ €μμ AI κΈ°μ λ‘ ν΄κ²°νκ³ μ νμν AI κΈ°λ° λͺ¨μ λ©΄μ λ° μλ λΆμ νλ«νΌμ νλ‘ νΈμλ μ ν리μΌμ΄μ μ λλ€. React Nativeμ Expoλ₯Ό κΈ°λ°μΌλ‘ ꡬμΆλμ΄, iOS, Android, κ·Έλ¦¬κ³ μΉμμ μΌκ΄λ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
μ΄ μ ν리μΌμ΄μ μ ARES Backend APIμ ν΅μ νμ¬ AI λ©΄μ , μ΄λ ₯μ λΆμ, μ¬μΈ΅ 리ν¬νΈ λ± ν΅μ¬ κΈ°λ₯λ€μ μ¬μ©μμκ² μ§κ΄μ μ΄κ³ νΈλ¦¬ν UIλ‘ μ 곡νλ μν μ ν©λλ€.
- ARES Backend: Django κΈ°λ°μ RESTful API μλ²μ λλ€. AI/ML λ‘μ§, λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬ λ± λͺ¨λ ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬ν©λλ€.
μ¬μ©μκ° μ€μ μ κ°μ νκ²½μμ AI μλ°νμ μμ±μΌλ‘ λννλ©° λ©΄μ μ μ§ννλ λͺ°μ ν UIλ₯Ό μ 곡ν©λλ€.
- μ£Όμ μ¬μ© λΌμ΄λΈλ¬λ¦¬:
expo-camera,expo-av,react-native-webview - ꡬν μμΈ:
- λ©΄μ μ€μ : μ¬μ©μλ
app/(protected)/interviewstart.tsxνλ©΄μμ μ§λ¬΄, κΈ°μ , λ©΄μ λμ΄λλ₯Ό μ νν©λλ€. - μ€μκ° λ©΄μ μ§ν:
app/(protected)/interview.tsxνλ©΄μμexpo-cameraλ₯Ό ν΅ν΄ μ¬μ©μμ μμκ³Όexpo-avλ₯Ό ν΅ν΄ μμ±μ μ€μκ°μΌλ‘ λ°±μλμ μ€νΈλ¦¬λ°ν©λλ€. AIμ μ§λ¬Έμ μμ±μΌλ‘ μ¬μλλ©°, μ¬μ©μλ μ€μ λνμ²λΌ λ΅λ³ν μ μμ΅λλ€. - μλ°ν μνΈμμ©:
react-native-webviewλ₯Ό μ¬μ©νμ¬ 3D μλ°νλ₯Ό λ λλ§νκ³ , λ©΄μ μ νλ¦κ³Ό AIμ νΌλλ°±μ λ°λΌ μλ°νκ° μνΈμμ©νμ¬ νμ€κ°μ λμ λλ€.
- λ©΄μ μ€μ : μ¬μ©μλ
- κ²°κ³Ό: μ¬μ©μλ ν μ€νΈ κΈ°λ°μ μ μ μΈ μΈν°νμ΄μ€λ₯Ό λμ΄, μ€μ μ¬λκ³Ό λννλ λ―ν λμ μΈ νκ²½μμ λ©΄μ μ μ°μ΅νλ©° μ€μ κ°κ°μ κ·Ήλνν μ μμ΅λλ€.
μ¬μ©μκ° μ λ‘λν μ΄λ ₯μμ μκΈ°μκ°μ λ¬Έμλ₯Ό AIκ° λΆμνμ¬ κ°μ κ³Ό μ½μ μ μ§λ¨νκ³ , μμ μ§λ¬Έμ μμ±ν΄μ£Όλ κΈ°λ₯μ λλ€.
- μ£Όμ μ¬μ© λΌμ΄λΈλ¬λ¦¬:
expo-document-picker,axios - ꡬν μμΈ:
- λ¬Έμ μ
λ‘λ:
expo-document-pickerλ₯Ό μ¬μ©νμ¬ μ¬μ©μμ κΈ°κΈ°μμ PDF, DOCX νμμ μ΄λ ₯μ νμΌμ μ ννκ³ ,FormDataνμμΌλ‘ λ°±μλμ μ μ‘ν©λλ€. - λΆμ κ²°κ³Ό μμ² λ° νμ:
services/resumeService.tsλ₯Ό ν΅ν΄ λ°±μλμ λΆμμ μμ²νκ³ , λ°νλ μμ μ§λ¬Έ, μλ ν€μλ, κ°μ μ μ λ±μ κ²°κ³Όλ₯Όapp/(protected)/resume-analysis.tsxνλ©΄μ ꡬ쑰ννμ¬ νμν©λλ€.
- λ¬Έμ μ
λ‘λ:
- κ²°κ³Ό: μ¬μ©μλ μμ μ μ΄λ ₯μμ κΈ°λ°ν λ§μΆ€ν λ©΄μ μ§λ¬Έμ 미리 νμ νκ³ , λ΅λ³μ μ€λΉνλ©° λ©΄μ κ²½μλ ₯μ λμΌ μ μμ΅λλ€.
λ©΄μ μ’ λ£ ν, 볡μ‘ν λΆμ λ°μ΄ν°λ₯Ό μ¬μ©μκ° μ½κ² μ΄ν΄ν μ μλλ‘ μκ°ννμ¬ μ 곡ν©λλ€.
- μ£Όμ μ¬μ© λΌμ΄λΈλ¬λ¦¬:
react-native-chart-kit,react-native-svg - ꡬν μμΈ:
- λ°μ΄ν° μμ² λ° μμ : λ©΄μ μ΄ μ’
λ£λλ©΄
services/interviewService.tsλ₯Ό ν΅ν΄ λ°±μλμ λΆμ 리ν¬νΈλ₯Ό μμ²νκ³ ,app/(protected)/interviewanalysis.tsxνλ©΄μμ λ°μ΄ν°λ₯Ό μμ ν©λλ€. - NCS μλ μ°¨νΈ:
react-native-chart-kitμ λ μ΄λ μ°¨νΈ(Radar Chart)λ₯Ό 컀μ€ν°λ§μ΄μ§νμ¬, λ°±μλλ‘λΆν° λ°μ NCS μ§λ¬΄ μλ μ μλ₯Ό μκ°μ μΌλ‘ ννν©λλ€. - κ°μ /μ½μ λ° AI μ‘°μΈ: λ°±λΆμ, μ μ, ν
μ€νΈ νΌλλ°± λ± λ€μν ννμ λ°μ΄ν°λ₯Ό
components/interview/AnalysisResultPanel.tsxμ κ°μ μ»΄ν¬λνΈλ€μ ν΅ν΄ ꡬ쑰ννμ¬ λ³΄μ¬μ€λλ€.
- λ°μ΄ν° μμ² λ° μμ : λ©΄μ μ΄ μ’
λ£λλ©΄
- κ²°κ³Ό: μ¬μ©μλ μμ μ μλ μμ€μ κ°κ΄μ μΈ μ°¨νΈμ μμΉλ‘ νλμ νμ νκ³ , ꡬ체μ μΈ AIμ νΌλλ°±μ ν΅ν΄ κ°μ μ μ λͺ νν μΈμ§ν μ μμ΅λλ€.
μ¬μ©μμ μ»€λ¦¬μ΄ μ 보λ₯Ό ν¨μ¨μ μΌλ‘ μ λ ₯νκ³ κ΄λ¦¬ν μ μλ 체κ³μ μΈ νΌ(Form)κ³Ό UIλ₯Ό μ 곡ν©λλ€.
- μ£Όμ μ¬μ© λΌμ΄λΈλ¬λ¦¬:
react-hook-form,zod,zustand - ꡬν μμΈ:
- μν κ΄λ¦¬:
stores/resumeStore.tsμstores/profileStore.tsμμzustandλ₯Ό μ¬μ©νμ¬ νλ‘ν λ° μ΄λ ₯μ κ΄λ ¨ μ μ μνλ₯Ό κ΄λ¦¬ν©λλ€. - νΌ UI λ° μ ν¨μ± κ²μ¬: νλ ₯, κ²½λ ₯ λ± κ° νλͺ© μ
λ ₯ νΌ(
components/resume/details/*Form.tsx)μreact-hook-formμΌλ‘ μ μ΄λλ©°,zodλ₯Ό μ΄μ©ν΄ κ° νλμ μ ν¨μ±μ μ€μκ°μΌλ‘ κ²μ¦νμ¬ μ¬μ©μ μ€μλ₯Ό λ°©μ§ν©λλ€. - λ°μ΄ν° λκΈ°ν: μ¬μ©μκ° νΌμ μ μΆνλ©΄
services/resumeService.tsλλprofileService.tsλ΄μaxiosμΈμ€ν΄μ€λ₯Ό ν΅ν΄ λ°±μλ APIμ λ°μ΄ν°λ₯Ό λκΈ°νν©λλ€.
- μν κ΄λ¦¬:
- κ²°κ³Ό: μ¬μ©μλ 볡μ‘ν μ΄λ ₯μ νλͺ©λ€μ 체κ³μ μ΄κ³ νΈλ¦¬ν UIλ₯Ό ν΅ν΄ μμ±νκ³ κ΄λ¦¬ν μ μμΌλ©°, μ λ ₯ λ°μ΄ν°μ μ ν©μ±μ 보μ₯λ°μ΅λλ€.
μ¬μ©μκ° μμ μ κ΅¬κΈ μΊλ¦°λμ ARES μλΉμ€λ₯Ό μ°λνμ¬ λ©΄μ μΌμ μ μλμΌλ‘ κΈ°λ‘νκ³ κ΄λ¦¬ν μ μλλ‘ λμ΅λλ€.
- μ£Όμ μ¬μ© λΌμ΄λΈλ¬λ¦¬:
expo-auth-session,expo-web-browser - ꡬν μμΈ:
- OAuth 2.0 μΈμ¦:
expo-auth-sessionμ μ¬μ©νμ¬ λ°±μλμμ μμ±ν κ΅¬κΈ μΈμ¦ URLμ μ΄κ³ ,expo-web-browserλ₯Ό ν΅ν΄ μμ νκ² μΈμ¦μ μ§νν©λλ€. μΈμ¦ ν μ½λ°±μ λ°μ ν ν°μ λ°±μλλ‘ μ μ‘ν©λλ€. - μΊλ¦°λ μ°λ: μΈμ¦μ΄ μλ£λλ©΄, μ¬μ©μλ
app/(protected)/calendar.tsxνλ©΄μμ μμ μ μΊλ¦°λμ μ μ₯λ λ©΄μ μΌμ μ νμΈνκ³ , μλ‘μ΄ μΌμ μ μΆκ°ν μ μμ΅λλ€.
- OAuth 2.0 μΈμ¦:
- κ²°κ³Ό: ARES νλ«νΌ λ΄μμ μ‘ν λͺ¨μ λ©΄μ μΌμ μ΄λ, μ¬μ©μκ° μ§μ λ±λ‘ν μ€μ λ©΄μ μΌμ μ΄ μ¬μ©μμ κ΅¬κΈ μΊλ¦°λμ μλμΌλ‘ λκΈ°νλμ΄ νΈλ¦¬νκ² μΌμ μ κ΄λ¦¬ν μ μμ΅λλ€.
ARES νλ‘ νΈμλλ νμ₯μ±κ³Ό μ μ§λ³΄μμ±μ κ³ λ €νμ¬ λ€μκ³Ό κ°μ μν€ν μ²λ‘ μ€κ³λμμ΅λλ€.
-
κΈ°λ° νλ μμν¬ (React Native & Expo): Expoμ κ΄λ¦¬ν μν¬νλ‘μ°λ₯Ό μ±ννμ¬ λ€μ΄ν°λΈ λͺ¨λ μ€μ μ 볡μ‘ν¨μ μ€μ΄κ³ , OTA(Over-the-Air) μ λ°μ΄νΈ, λ€μν νλ«νΌ(iOS, Android, Web) μ§μ λ±μ μ΄μ μ νμ©ν©λλ€. React Nativeλ₯Ό ν΅ν΄ λ¨μΌ μ½λλ² μ΄μ€λ‘ μ¬λ¬ νλ«νΌμ μ§μνμ¬ κ°λ° ν¨μ¨μ±μ λμ λλ€.
-
νλ©΄ λΌμ°ν (Expo Router): νμΌ μμ€ν κΈ°λ°μ λΌμ°ν λ°©μμ μ¬μ©νμ¬ μ§κ΄μ μΌλ‘ νμ΄μ§λ₯Ό κ΄λ¦¬ν©λλ€.
appλλ ν 리μ νμΌ κ΅¬μ‘°κ° κ³§λ°λ‘ μ±μ λ€λΉκ²μ΄μ κ΅¬μ‘°κ° λλ―λ‘, μλ‘μ΄ νμ΄μ§λ₯Ό μΆκ°νκ±°λ μμ νκΈ° μ©μ΄ν©λλ€.(auth)μ(protected)κ°μ κ·Έλ£Ή λΌμ°νΈλ₯Ό νμ©νμ¬ μΈμ¦ μνμ λ°λ₯Έ μ κ·Ό μ μ΄λ₯Ό μ μΈμ μΌλ‘ ꡬνν©λλ€. -
μν κ΄λ¦¬ (Zustand): Reduxμ κ°μ κΈ°μ‘΄ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μ 볡μ‘μ±κ³Ό 보μΌλ¬νλ μ΄νΈλ₯Ό μ€μ΄κΈ° μν΄
Zustandλ₯Ό μ ννμ΅λλ€. Hook κΈ°λ°μ κ°λ¨ν APIλ‘ μ½κ² μ μ μνλ₯Ό λ§λ€κ³ μ¬μ©ν μ μμΌλ©°, λλ©μΈλ³(authStore,resumeStoreλ±)λ‘ μ€ν μ΄λ₯Ό λΆλ¦¬νμ¬ μ½λμ μμ§λλ₯Ό λμ΄κ³ , νμν μ»΄ν¬λνΈμμλ§ μνλ₯Ό ꡬλ νμ¬ λΆνμν 리λ λλ§μ μ΅μνν©λλ€. -
λ°μ΄ν° ν΅μ (Axios): λ°±μλ APIμμ ν΅μ μ μν΄
axiosλ₯Ό μ¬μ©ν©λλ€.services/api.tsμ μ€μνλaxiosμΈμ€ν΄μ€λ₯Ό μμ±νκ³ , μΈν°μ ν°(interceptor)λ₯Ό νμ©νμ¬ λͺ¨λ API μμ²μ μΈμ¦ ν ν°(JWT)μ μλμΌλ‘ μ£Όμ ν©λλ€. μ΄λ₯Ό ν΅ν΄ API μμ² μ½λλ₯Ό κ°κ²°νκ² μ μ§νκ³ , μΈμ¦ κ΄λ ¨ λ‘μ§μ ν κ³³μμ κ΄λ¦¬ν μ μμ΅λλ€.
/ares-frontend
βββ app/ # Expo Routerκ° κ΄λ¦¬νλ νλ©΄ μμ
β βββ (auth)/ # μΈμ¦μ΄ νμ μλ νλ©΄ (λ‘κ·ΈμΈ, νμκ°μ
)
β βββ (protected)/ # μΈμ¦μ΄ νμν νλ©΄
β βββ _layout.tsx # μ μ λ μ΄μμ λ° λ€λΉκ²μ΄μ
μ€μ
βββ assets/ # ν°νΈ, μ΄λ―Έμ§, λΉλμ€ λ± μ μ μμ
βββ components/ # μ¬μ¬μ© κ°λ₯ν UI μ»΄ν¬λνΈ
β βββ ui/ # λ²νΌ, ν€λ λ± λ²μ©μ μΈ κΈ°μ΄ μ»΄ν¬λνΈ
β βββ {domain}/ # μ΄λ ₯μ, λ©΄μ λ± νΉμ λλ©μΈ κ΄λ ¨ μ»΄ν¬λνΈ
βββ constants/ # μμ, λ μ΄μμ λ± μ± μ μμμ μ¬μ©λλ μμ
βββ hooks/ # κ³΅ν΅ λ‘μ§μ λ΄μ 컀μ€ν
ν
βββ i18n/ # λ€κ΅μ΄ μ§μ(i18next) μ€μ
βββ schemas/ # Zodλ₯Ό μ¬μ©ν λ°μ΄ν° μ ν¨μ± κ²μ¬ μ€ν€λ§
βββ services/ # Axios μΈμ€ν΄μ€ λ° API νΈμΆ μλΉμ€
βββ stores/ # Zustandλ₯Ό μ¬μ©ν μ μ μν κ΄λ¦¬ μ€ν μ΄
βββ utils/ # κΈ°ν μ νΈλ¦¬ν° ν¨μ (λ μ§ ν¬λ§·ν
λ±)
- Framework: React Native, Expo
- Language: TypeScript
- Routing: Expo Router
- State Management: Zustand
- Data Fetching: Axios
- Forms: React Hook Form
- Schema Validation: Zod
- UI: React Navigation, React Native Elements, React Native SVG
- Animation: React Native Reanimated
- Camera/AV: Expo Camera, Expo AV
- Internationalization: i18next, React-i18next
- Charting: React Native Chart Kit
- Node.js (LTS λ²μ κΆμ₯)
npmλλyarn- ARES λ°±μλ μλ² μ€ν (λ°±μλ μ μ₯μ μ°Έκ³ )
git clone https://github.com/project-ares-interview/ares-frontend.git
cd ares-frontendnpm install
# λλ
yarn installνλ‘μ νΈ λ£¨νΈμ .env.development νμΌμ μμ±νκ³ , μ€ν μ€μΈ λ°±μλ μλ²μ μ£Όμλ₯Ό μ
λ ₯ν©λλ€.
# ARES Backend API URL
EXPO_PUBLIC_API_URL=http://127.0.0.1:8000dotenvx run -f .env.environments -- npm start
# λλ
dotenvx run -f .env.environments -- yarn startμ€ν ν λνλλ QR μ½λλ₯Ό Expo Go μ±μΌλ‘ μ€μΊνκ±°λ, κ° νλ«νΌ(Android, iOS, Web)μ λ§κ² μ€νν μ μμ΅λλ€.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|---|
| κΉμν | λ°μ©λ½ | μ₯μνΈ | μ₯νλ³ | μ§μν¬ | μ΅λν |





