๐๏ธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ๊ด๋ฆฌ ๊ท์น (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. ๊ณตํต ๊ท์น (๋จ์ผ ์ง์ค ๊ณต๊ธ์) โ
- ํ์ผ ๋ช
๋ช
๊ท์น(Naming Convention)
- ์น: ์ปดํฌ๋ํธ ํ์ผ๋ช
์ PascalCase(
HeaderMenu.tsx), ์ ํธ/ํ ์ค๋ camelCase(useAuth.ts), ์ค์ ํ์ผ์ kebab-case(vite.config.ts)๋ฅผ ์งํฅํฉ๋๋ค. - ์ฑ: ๋ชจ๋ฐ์ผ ๋ค์ดํฐ๋ธ ๋ ์ด์์ ํ์ผ์ snake_case(
activity_main.xml), ํ๋ฉด ์ปดํฌ๋ํธ๋ PascalCase(LoginScreen.tsx)๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ์น: ์ปดํฌ๋ํธ ํ์ผ๋ช
์ PascalCase(
- SSOT ์์น: ๋ฐ์ดํฐ ๊ตฌ์กฐ, API ์๋ํฌ์ธํธ ์์๋ ํ๋์ ํ์ผ(์:
constants/api.ts)์์ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.