μ¬μ§ ν μ₯μ AI μΊλ¦ν°λ‘ λ°κΎΈκ³ ,
μΆμ μμ μλ‘μ΄ μΈμ°μ λ°κ²¬νλ λͺ¨λ°μΌ μκ°ν
μΉ μλΉμ€
μν½μ μ¬μ©μκ° μμ μ μ¬μ§μΌλ‘ AI μΊλ¦ν° νλ‘νμ λ§λ€κ³ , λ€λ₯Έ μ°Έμ¬μμ νλ‘νμ νμν μ μλ μλΉμ€μ λλ€. μΉ΄μΉ΄μ€ κ³μ μΌλ‘ κ°νΈνκ² μμν΄ λλ€μ, MBTI, λ§€λ ₯ ν€μλμ μ°λ½μ²λ₯Ό λ±λ‘νλ©°, νλ‘ν μ‘°ν μ΄μ©κΆμΌλ‘ κ΄μ¬ μλ μλμ μ°λ½μ²λ₯Ό νμΈν μ μμ΅λλ€.
λͺ¨λ°μΌ μ¬μ© νκ²½μ μ€μ¬μΌλ‘ μ€κ³νμΌλ©°, λΈλΌμ°μ λλΉκ° λμ΄μ Έλ μ½ν μΈ μμμ μΌμ νκ² μ μ§ν΄ μΌκ΄λ κ²½νμ μ 곡ν©λλ€.
| κΈ°λ₯ | μ€λͺ |
|---|---|
| μΉ΄μΉ΄μ€ λ‘κ·ΈμΈ | OAuth μΈκ° μ½λλ₯Ό λ°±μλμ μ λ¬νκ³ μ¨λ³΄λ© μλ£ μ¬λΆμ λ°λΌ μ§μ νλ©΄μ λΆκΈ°ν©λλ€. |
| AI νλ‘ν μμ± | μ¬μ§ μ λ‘λ, 미리보기, μ΄λ―Έμ§ μμΆ, μμ± μν νμΈ, κ²°κ³Ό μ νκΉμ§ λ¨κ³ν νλ¦μΌλ‘ μ 곡ν©λλ€. |
| νλ‘ν νμ | μ±λ³ νν°μ μΉ΄λ λͺ©λ‘μΌλ‘ μ°Έμ¬μλ₯Ό μ΄ν΄λ³΄κ³ μμΈ νλ‘νμ νμΈν μ μμ΅λλ€. |
| μ°λ½μ² μ΄λ | μ΄μ©κΆ 보μ μ¬λΆλ₯Ό νμΈν λ€ μ°λ½μ²λ₯Ό μ΄λνκ³ ν΄λ¦½λ³΄λμ 볡μ¬ν μ μμ΅λλ€. |
| λ΄ μ 보 κ΄λ¦¬ | νλ‘ν μμ , μ‘°ν μ΄λ ₯ νμΈ, λ‘κ·Έμμκ³Ό νμ νν΄λ₯Ό μ§μν©λλ€. |
μ¬λ¬ API μμ²μμ λμμ 401μ΄ λ°μν΄λ ν ν° μ¬λ°κΈ μμ²μ ν λ²λ§ μ μ‘ν©λλ€. μ¬λ°κΈ μ€ λ€μ΄μ¨ μμ²μ νμμ λκΈ°ν λ€ μλ‘μ΄ μ‘μΈμ€ ν ν°μΌλ‘ λ€μ μ€ννλ©°, 리νλ μ ν ν°κΉμ§ λ§λ£λ κ²½μ°μλ μΈμ¦ μνλ₯Ό μ 리νκ³ μΈμ
λ§λ£ UIλ₯Ό λ
ΈμΆν©λλ€.
μ
λ‘λ μ΄λ―Έμ§λ λΈλΌμ°μ μμ μ΅λ 1280px, JPEG νμ§ 0.85λ‘ μμΆν΄ μ μ‘λμ μ€μ
λλ€. μμ± μ€μλ 2μ΄ κ°κ²©μΌλ‘ μνλ₯Ό νμΈνκ³ , μ€μ μ§νλ₯ μ μ μ μλ λΉλκΈ° μμ
μ νΉμ±μ κ³ λ €ν΄ 90%μ μ κ·Όνλ μ§νλ₯ κ³Ό λ¨κ³λ³ λ©μμ§λ₯Ό μ 곡ν©λλ€. μλ£ μλ΅μ΄ λμ°©νλ©΄ 100%λ‘ μ νν λ€ κ²°κ³Ό νλ©΄μΌλ‘ μμ°μ€λ½κ² μ°κ²°ν©λλ€.
- TanStack Queryλ νλ‘ν, μΉ΄λ λͺ©λ‘, μ΄λ―Έμ§ μμ± μν κ°μ μλ² μνμ μΊμλ₯Ό κ΄λ¦¬ν©λλ€.
- Zustandλ μΈμ¦, μΈμ λ§λ£, ν μ€νΈμ²λΌ μ± μ μμμ 곡μ νλ ν΄λΌμ΄μΈνΈ μνλ₯Ό κ΄λ¦¬ν©λλ€.
- React Routerμ λ³΄νΈ λΌμ°νΈλ μΈμ¦λμ§ μμ μ¬μ©μμ μλΉμ€ νλ©΄ μ κ·Όμ μ°¨λ¨ν©λλ€.
| μμ | κΈ°μ |
|---|---|
| Core | React 19, TypeScript, Vite |
| Styling | Tailwind CSS v4, Pretendard |
| Routing | React Router v7 Data Router |
| Server State | TanStack Query |
| Client State | Zustand |
| HTTP | Axios |
| Validation | Zod |
| Analytics | Google Analytics 4 |
| Package Manager | pnpm |
src/
βββ apps/ # λΌμ°ν°, λ μ΄μμ, λ³΄νΈ λΌμ°νΈ
βββ ui/ # λΌμ°νΈ λ¨μ νμ΄μ§
βββ components/ # κ³΅μ© UI μ»΄ν¬λνΈ
βββ features/ # λλ©μΈλ³ API, ν
, νμ
βββ store/ # μ μ ν΄λΌμ΄μΈνΈ μν
βββ schemas/ # μ
λ ₯κ° κ²μ¦ μ€ν€λ§
βββ constants/ # λΌμ°νΈμ κ³΅μ© μμ
βββ utils/ # HTTP, μ΄λ―Έμ§ μ²λ¦¬, λΆμ μ νΈλ¦¬ν°
βββ assets/ # μ΄λ―Έμ§, μμ΄μ½, μμ
- Node.js
- pnpm 10 μ΄μ
pnpm install
cp .env.example .env
pnpm devκΈ°λ³Έ κ°λ° μλ²λ http://localhost:5173μμ μ€νλ©λλ€.
| λ³μ | νμ | μ€λͺ |
|---|---|---|
VITE_KAKAO_CLIENT_ID |
O | μΉ΄μΉ΄μ€ OAuth ν΄λΌμ΄μΈνΈ μλ³μ |
VITE_KAKAO_REDIRECT_URI |
O | μΉ΄μΉ΄μ€ λ‘κ·ΈμΈ μλ£ ν λμμ¬ URI |
VITE_IMAGE_BASE_URL |
O | μλ κ²½λ‘ μ΄λ―Έμ§μ μ¬μ©ν κΈ°λ³Έ URL |
VITE_PAYMENT_ACCOUNT_NUMBER |
O | κ²°μ νλ©΄μ νμν μ κΈ κ³μ’λ²νΈ |
VITE_PAYMENT_ACCOUNT_INFO |
O | κ²°μ νλ©΄μ νμν μν λ° μκΈμ£Ό μ 보 |
VITE_GA_MEASUREMENT_ID |
X | νλ‘λμ νκ²½μμ μ¬μ©ν GA4 μΈ‘μ ID |
VITE_μ λμ¬κ° λΆμ κ°μ ν΄λΌμ΄μΈνΈ λ²λ€μ ν¬ν¨λμ΄ λΈλΌμ°μ μμ νμΈν μ μμ΅λλ€. API λΉλ°ν€, λΉλ°λ²νΈ, μλ² μ μ© ν ν°μ λ£μ§ λ§μΈμ.
pnpm dev # κ°λ° μλ² μ€ν
pnpm build # νμ
κ²μ¬ ν νλ‘λμ
λΉλ
pnpm lint # ESLint κ²μ¬
pnpm format:check # Prettier ν¬λ§· κ²μ¬
pnpm preview # νλ‘λμ
λΉλ 미리보기
pnpm generate:api # OpenAPI λͺ
μΈλ‘ API νμ
μμ±- νμ΄μ§λ λΌμ°νΈ λλ©μΈ κΈ°μ€μΌλ‘ ꡬμ±νκ³ , λλ©μΈ λ‘μ§μ
featuresμ λͺ¨μλλ€. - μλ² λ°μ΄ν°λ Query μΊμλ₯Ό λ¨μΌ μμ€λ‘ μ¬μ©νλ©° μ μ μ€ν μ΄μ 볡μ νμ§ μμ΅λλ€.
- λͺ¨λ λΌμ°νΈλ κ²½λ‘ μμλ‘ κ΄λ¦¬νκ³ , API μλ΅μ κ³΅ν΅ μλ΅ νμ μΌλ‘ λ€λ£Ήλλ€.
- 1remμ 10pxλ‘ μ€μ νκ³ Tailwind spacing μ«μκ° λμμΈμ px κ°κ³Ό λμνλλ‘ κ΅¬μ±ν©λλ€.