GlobalNomadλ μ¬μ©μκ° μ§μ 체νμ λ±λ‘νκ³ ,
λ€λ₯Έ μ¬μ©μκ° ν΄λΉ 체νμ μμ½ν μ μλ μλ°©ν₯ 체ν μμ½ νλ«νΌμ
λλ€.
μ§λ λ° μΊλ¦°λ SDKλ₯Ό νμ©νμ¬ μ²΄ν μμΉμ μμ½ κ°λ₯ μΌμ μ μ§κ΄μ μΌλ‘ νμΈν μ μμΌλ©°,
볡μ‘ν UI νλ¦κ³Ό μν κ΄λ¦¬λ₯Ό ν΅ν΄ μ€λ¬΄ μμ€μ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
- μ¬μ©μκ° μ²΄νμ λ±λ‘νκ³ , λ€λ₯Έ μ¬μ©μκ° μ΄λ₯Ό μμ½ν μ μλ ꡬ쑰
- μ§λ λ° μΊλ¦°λ SDKλ₯Ό ν΅ν μμΉ κΈ°λ° + μΌμ κΈ°λ° μμ½ κΈ°λ₯ ꡬν
- μ§λ/μΊλ¦°λ κΈ°λ° μμ½ μμ€ν μ λν κΈ°μ μ κ΄μ¬
- 볡μ‘ν UI νλ¦κ³Ό μν κ΄λ¦¬ κ²½νμ ν΅ν΄ μ€λ¬΄μ κ°κΉμ΄ νλ‘ νΈμλ κ²½νμ μκΈ° μν¨
| λ°κ΄λ―Ό | κΉλ³΄κ²½ | λ§ΉμλΉ | μ΄μ°¬νΈ |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- κ³΅ν΅ μ»΄ν¬λνΈ μ μ:
Input,Button, νμModalλ± μ¬μ©μ μ€μ¬ μΈν°λμ μμ ꡬν - λ‘κ·ΈμΈ / νμκ°μ μΈμ¦ νλ¦ λ° μ ν¨μ± κ²μ¬ λ‘μ§ κ΅¬ν
- νΌ μ λ ₯ κ²μ¦ λ° μλ¬ μ²λ¦¬ λ‘μ§ μ€κ³
- Kakao OAuth μ°λ λ‘κ·ΈμΈ κΈ°λ₯ κ°λ°
- μλ¦Ό κΈ°λ₯ ꡬν
- ν λ¦¬λ© λ° μ½λ 리뷰 μ£Όλ
- κ³΅ν΅ λ μ΄μμ μ»΄ν¬λνΈ μ μ:
Header,Footer,Paginationλ± - λ°μν μ€νμΌλ§ λ° νμ΄μ§λ€μ΄μ λ‘μ§ μμ±
- λ©μΈ νμ΄μ§ νΌλΈλ¦¬μ± λ° API μ°λ
- 체ν 리μ€νΈ, κ²μ, νν°λ§, μ λ ¬ κΈ°λ₯ ν¬ν¨
- μΈκΈ° 체ν μΉμ 무ν μ€ν¬λ‘€ ꡬν
- 체ν μμ /λ±λ‘ UI ꡬν
- λͺ¨λ°μΌ UI κ°μ
- κ³΅ν΅ μ»΄ν¬λνΈ μ μ:
Modal,Floating Box,Avatarλ± - 체ν μμΈ νμ΄μ§ ꡬν
- μ΄λ―Έμ§ λ·°μ΄, μκ°, Kakao Map, μΊλ¦°λ μμ½ κΈ°λ₯, 리뷰 νμ΄μ§λ€μ΄μ ν¬ν¨
- 체ν λ±λ‘/μμ νμ΄μ§ μ΄κΈ° UI λ° λ‘μ§ κ΅¬ν
- UX κ°μ μ μν μΈλΆ μΈν°λμ ꡬν
- Oracle Cloud Infrastructure(OCI) κΈ°λ° ν΄λΌμ°λ μΈνλΌ μ€κ³
- GitHub Actions λ° GHCR κΈ°λ° CI/CD νμ΄νλΌμΈ ꡬμΆ
- Docker λ©ν°μ€ν μ΄μ§ λΉλ κΈ°λ° μ»¨ν μ΄λν ꡬμ±
- Nginx + Letβs Encrypt κΈ°λ° HTTPS νκ²½ ꡬμ±
- λλ©μΈ(
globalnomad.site) λ° DNS μ€μ - κ³΅ν΅ μ»΄ν¬λνΈ(λλ‘λ€μ΄) κ°λ°
- λ§μ΄νμ΄μ§ (λ΄ μ 보, 체ν νν©, μμ½ λ΄μ, νκΈ° μμ± λ±) ꡬν
-
체ν λ±λ‘ / μμ½
μ¬μ©μλ νΈμ€νΈλ‘μ μμ λ§μ 체νμ λ±λ‘ν μ μμΌλ©°,
λ€λ₯Έ μ¬μ©μλ κ²μ€νΈλ‘μ μνλ 체νμ μ ννμ¬ μμ½ν μ μμ΅λλ€. -
μΉ΄ν κ³ λ¦¬ κΈ°λ° μ²΄ν νμ
- λ€μν μΉ΄ν κ³ λ¦¬λ‘ μ²΄νμ λΆλ₯νμ¬ νμ κ°λ₯
- κ²μ / νν°λ§ / μ λ ¬ κΈ°λ₯ μ 곡
-
μ§λ + μΊλ¦°λ κΈ°λ° μμ½
- Kakao Mapμ ν΅ν μμΉ κΈ°λ° μ²΄ν νμΈ
- μμ½ κ°λ₯ μΌμλ₯Ό μ§κ΄μ μΌλ‘ νμΈ κ°λ₯ν μΊλ¦°λ UI μ 곡
-
μ€μκ° μλ¦Ό κΈ°λ₯
- 체ν μΉμΈ, κ±°μ λ± μ£Όμ νλμ λν μ€μκ° μλ¦Ό μ 곡
-
νκΈ° μμ± μμ€ν
- 체ν μ°Έμ¬ ν 리뷰 μμ± κ°λ₯
- λ€λ₯Έ μ¬μ©μμ νκΈ° νμΈμ ν΅ν΄ μ λ’°λ ν보
src/
βββ actions/ # μλ² μ‘μ
ν¨μ μ μ
βββ apis/ # API νΈμΆ κ΄λ ¨ ν¨μ λͺ¨μ
βββ app/ # Next.js 13 App Router κΈ°λ° λΌμ°νΈ
β βββ (non-header)/ # ν€λκ° νμ μλ νμ΄μ§ ν΄λ
β β βββ νμ΄μ§ν΄λ/
β β βββ νμ΄μ§ν΄λ/
β βββ (with-header)/ # ν€λκ° νμν νμ΄μ§ ν΄λ
β β βββ νμ΄μ§ν΄λ/
β β βββ νμ΄μ§ν΄λ/
β βββ api/ # Next.js API λΌμ°νΈ
β βββ globals.css # κΈλ‘λ² μ€νμΌ
β βββ layout.tsx # λ£¨νΈ λ μ΄μμ
β βββ loading.tsx # μ μ λ‘λ© UI
β βββ not-found.tsx # 404 νμ΄μ§
β βββ error.tsx # μλ¬ νμ΄μ§
βββ components/ # μ¬μ¬μ© κ°λ₯ν κ³΅ν΅ μ»΄ν¬λνΈ
βββ constants/ # μμ μ μ (μ: μ΅μ
리μ€νΈ, URL λ±)
βββ contexts/ # μ μ Context μ μ (μ: ν
λ§, λͺ¨λ¬ λ±)
βββ hooks/ # 컀μ€ν
ν
βββ lib/ # μ νΈμ± ν¨μ λ° μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ€μ
βββ stores/ # Zustand λ± μ μ μν κ΄λ¦¬
βββ types/ # μ μ TypeScript νμ
μ μ
βββ ui/ # λμμΈ μμ€ν
κΈ°λ° UI μ»΄ν¬λνΈ
βββ utils/ # κ³΅ν΅ μ νΈ ν¨μ
| λΈλμΉλͺ | μ€λͺ |
|---|---|
main |
λ°°ν¬ λΈλμΉ |
develop |
ν΅ν© κ°λ° λΈλμΉ |
feat/* |
κΈ°λ₯ κ°λ° λΈλμΉ |
fix/* |
λ²κ·Έ μμ λΈλμΉ |
style/* |
μ€νμΌ μμ λΈλμΉ |
docs/* |
λ¬Έμ μμ± λ° μμ λΈλμΉ |
| λμ | κ·μΉ | μμ |
|---|---|---|
| ν΄λλͺ | μΌλ°₯μΌμ΄μ€ (kebab-case) | components, user-profile |
| μ»΄ν¬λνΈ νμΌλͺ | νμ€μΉΌμΌμ΄μ€ (PascalCase) | UserProfile.tsx |
| μ΄λ―Έμ§/μμ΄μ½ νμΌλͺ | μΌλ°₯μΌμ΄μ€ (kebab-case) | logo-icon.png, profile-default.png |
| ν¨μλͺ /λ³μλͺ | μΉ΄λ©μΌμ΄μ€ (camelCase) | fetchUserData, userList |
| νκ²½λ³μ | λλ¬Έμ + μ€λ€μ΄ν¬μΌμ΄μ€ | NEXT_PUBLIC_API_URL |
| λΈλμΉ μ’ λ₯ | λ€μ΄λ° κ·μΉ | μμ |
|---|---|---|
| κΈ°λ₯ κ°λ° | feat/{μ΄μλ²νΈ} | feat/13 |
| λ²κ·Έ μμ | fix/{μ΄μλ²νΈ} | fix/24 |
| λ¬Έμ μμ | docs/{μ΄μλ²νΈ} | docs/58 |
| μ€νμΌ μμ | style/{μ΄μλ²νΈ} | style/33 |
| Type | Description |
|---|---|
feat |
κΈ°λ₯ μΆκ° |
feat |
μ΄λ―Έμ§/μμ΄μ½ μΆκ° |
fix |
λ²κ·Έ μμ |
docs |
λ¬Έμ μμ |
style |
UI, μ€νμΌ κ΄λ ¨ μΆκ° λ° μμ |
refactor |
리ν©ν λ§ |
chore |
μ€μ , λΉλ λ³κ²½ |




