Skip to content

๐Ÿ—‚๏ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ๊ด€๋ฆฌ ๊ทœ์น™ (FOLDER-STRUCTURE.md) โ€‹

์ด ๋ฌธ์„œ๋Š” Antigravity๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” ์›น(Web) ๋ฐ ์•ฑ(App) ํ”„๋กœ๊ทธ๋žจ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ ๊ด€๋ฆฌ ๊ทœ์น™์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.


1. ๐ŸŒ ์›น ํ”Œ๋žซํผ ํด๋” ๊ตฌ์กฐ โ€‹

์›น ํ”„๋กœ์ ํŠธ(React, Vue, Next.js, Vite ๋“ฑ) ๊ฐœ๋ฐœ ์‹œ Antigravity๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์ ‘๊ทผํ•˜๊ธฐ ์‰ฌ์šด ํ‘œ์ค€ํ™”๋œ ํ”„๋ก ํŠธ์—”๋“œ/๋ฐฑ์—”๋“œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

text
/my-web-project
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ assets/          # ์ด๋ฏธ์ง€, ํฐํŠธ, ๊ธ€๋กœ๋ฒŒ CSS ๋“ฑ ์ •์  ์ž์›
โ”‚   โ”œโ”€โ”€ components/      # ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ (์›์ž ๋‹จ์œ„)
โ”‚   โ”œโ”€โ”€ views/ (pages/)  # ๋ผ์šฐํŒ… ๋‹จ์œ„์˜ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ layouts/         # ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ (Header, Footer, Sidebar ๋“ฑ)
โ”‚   โ”œโ”€โ”€ hooks/           # ์ปค์Šคํ…€ ํ›…์Šค (์ƒํƒœ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋กœ์ง)
โ”‚   โ”œโ”€โ”€ store/           # ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ (Redux, Pinia, Zustand ๋“ฑ)
โ”‚   โ”œโ”€โ”€ services/ (api/) # API ํ†ต์‹  ๋กœ์ง ๋ฐ Axios/Fetch ์„ค์ •
โ”‚   โ”œโ”€โ”€ utils/           # ๋‚ ์งœ ํฌ๋งท ๋ณ€ํ™˜, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ํ—ฌํผ ํ•จ์ˆ˜
โ”‚   โ””โ”€โ”€ types/           # TypeScript ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํƒ€์ž… ์ •์˜
โ”œโ”€โ”€ public/              # ๋นŒ๋“œ ์‹œ ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌ๋˜๋Š” ์ •์  ํŒŒ์ผ (favicon ๋“ฑ)
โ”œโ”€โ”€ .env                 # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
โ”œโ”€โ”€ package.json         # ์˜์กด์„ฑ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ์ •๋ณด
โ”œโ”€โ”€ vite.config.ts       # ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ๋นŒ๋“œ ์„ค์ • (Vite, Webpack ๋“ฑ)
โ””โ”€โ”€ README.md            # ์›น ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

์›น ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๊ทœ์น™ โ€‹

  • ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ: UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Custom Hook)์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฝ๋กœ ๋ณ„์นญ (Path Alias): import ์ง€์˜ฅ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด vite.config.ts ๋ฐ tsconfig.json์—์„œ @/ ๊ฒฝ๋กœ ๋ณ„์นญ์„ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ ๊ด€๋ฆฌ: ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ƒํƒœ๋Š” useState, ์—ฌ๋Ÿฌ ๋ށ์Šค๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ์ƒํƒœ๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ ํด๋” ๊ตฌ์กฐ โ€‹

๋ชจ๋ฐ”์ผ ์•ฑ(Android, iOS ๋„ค์ดํ‹ฐ๋ธŒ ๋˜๋Š” Flutter, React Native ๋“ฑ์˜ ํฌ๋กœ์Šคํ”Œ๋žซํผ) ๊ฐœ๋ฐœ ์‹œ ํ™œ์šฉ๋˜๋Š” ๊ถŒ์žฅ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

text
/my-app-project
โ”œโ”€โ”€ android/             # Android ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๋ฐ ๋นŒ๋“œ ์„ค์ • (Gradle)
โ”‚   โ”œโ”€โ”€ app/src/main/
โ”‚   โ”‚   โ”œโ”€โ”€ java/        # Kotlin/Java ์†Œ์Šค ์ฝ”๋“œ (์•กํ‹ฐ๋น„ํ‹ฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ)
โ”‚   โ”‚   โ”œโ”€โ”€ res/         # ๋ ˆ์ด์•„์›ƒ(XML), ๋“œ๋กœ์–ด๋ธ”, ๋ฐธ๋ฅ˜, ํ…Œ๋งˆ ์ž์›
โ”‚   โ”‚   โ””โ”€โ”€ AndroidManifest.xml # ๊ถŒํ•œ ๋ฐ ์•ฑ ๊ธฐ๋ณธ ์†์„ฑ ์ •์˜
โ”œโ”€โ”€ ios/                 # iOS ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๋ฐ ๋นŒ๋“œ ์„ค์ • (Xcode, CocoaPods)
โ”‚   โ”œโ”€โ”€ Runner/
โ”‚   โ”‚   โ”œโ”€โ”€ Assets.xcassets/ # ์•ฑ ์•„์ด์ฝ˜ ๋ฐ ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค
โ”‚   โ”‚   โ”œโ”€โ”€ Info.plist   # ๊ถŒํ•œ ๋ฐ ์•ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •์˜
โ”‚   โ”‚   โ””โ”€โ”€ AppDelegate.swift
โ”œโ”€โ”€ src/ (ํฌ๋กœ์Šคํ”Œ๋žซํผ)   # ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฉ”์ธ ์†Œ์Šค
โ”‚   โ”œโ”€โ”€ screens/         # ์•ฑ์˜ ๊ฐ ํ™”๋ฉด(Screen) UI
โ”‚   โ”œโ”€โ”€ navigation/      # ๋ผ์šฐํ„ฐ ๋ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ ์„ค์ •
โ”‚   โ”œโ”€โ”€ components/      # ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ store/           # ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ services/        # ๋„คํŠธ์›Œํฌ ๋ฐ ๋กœ์ปฌ DB(SQLite, Room ๋“ฑ) ํ†ต์‹ 
โ”‚   โ””โ”€โ”€ theme/           # ์•ฑ์˜ ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ, ์Šคํƒ€์ผ ์ƒ์ˆ˜
โ”œโ”€โ”€ package.json (๋˜๋Š” pubspec.yaml) # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ
โ””โ”€โ”€ App.tsx (๋˜๋Š” main.dart) # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง„์ž…์ (Entry Point)

์•ฑ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๊ทœ์น™ โ€‹

  • ํ”Œ๋žซํผ๋ณ„ ๋ถ„๋ฆฌ: ํฌ๋กœ์Šคํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋„ค์ดํ‹ฐ๋ธŒ(Android/iOS) ์„ค์ • ํŒŒ์ผ(ํผ๋ฏธ์…˜, ์•„์ด์ฝ˜, ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด)์€ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ํŠน์„ฑ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ์™€ ๋ฌด๊ฑฐ์šด ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€)์˜ ์บ์‹ฑ์„ ๋‹ด๋‹นํ•  ํด๋”๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜์‘ํ˜• ์ œ์•ฝ: ๊ธฐ๊ธฐ๋ณ„ ๋…ธ์น˜(Notch) ๋ฐ ํ•˜๋‹จ ํ™ˆ ์ธ๋””์ผ€์ดํ„ฐ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด SafeArea๋ฅผ ์ ์šฉํ•œ ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3. ๊ณตํ†ต ๊ทœ์น™ (๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›) โ€‹

  1. ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(Naming Convention)
    • ์›น: ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋ช…์€ PascalCase(HeaderMenu.tsx), ์œ ํ‹ธ/ํ›…์Šค๋Š” camelCase(useAuth.ts), ์„ค์ • ํŒŒ์ผ์€ kebab-case(vite.config.ts)๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.
    • ์•ฑ: ๋ชจ๋ฐ”์ผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์€ snake_case(activity_main.xml), ํ™”๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase(LoginScreen.tsx)๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  2. SSOT ์›์น™: ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, API ์—”๋“œํฌ์ธํŠธ ์ƒ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ(์˜ˆ: constants/api.ts)์—์„œ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ง€์‹DB โ€” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์œ„ํ•ด