μ μΈ μ¬κΈ°λ₯Ό μλ°©μ μν 3κ°μ§!
- νμν μ 보λ₯Ό "μ μΈλ³΄κ°" νλλ‘
- 볡μ‘ν μ μ² λ°©λ²λ "μ μΈλ³΄κ°"
- μ΄λ €μ΄ λ¨μ΄λ 볡μ‘ν μ©μ΄λ "μ μΈλ³΄κ°"
| μ‘°μΉμ° | κΉμ§ν | λ Έμμ€ | μμ±μ |
|---|---|---|---|
FE / BE |
FE |
FE / BE |
FE / BE |
β¨ 2025.08 - 2025.08
[μ μΈλ³΄κ°]- https://lion5-bogam.site
보기
-
Node.js 20.18.1
-
.env νμΌμ μλμ νλͺ©λ€μ΄ μμ΄μΌ ν©λλ€.CODEF_DEMO_CLIENT_ID: μΈλΆ API(CODEF API) client idCODEF_DEMO_CLIENT_SECRET: μΈλΆ API(CODEF API) client secretVWORLD_BROKER_KEY: μΈλΆ API(λΈμ΄μλ API) λΈμ΄μλ keyKAKAO_CLIENT_ID: μΈλΆ API(μΉ΄μΉ΄μ€ API) μΉ΄μΉ΄μ€ client idKAKAO_REDIRECT_URI: μΈλΆ API(μΉ΄μΉ΄μ€ API) redirect URL μ£ΌμKAKAO_REST_API_KEY: μΈλΆ API(μΉ΄μΉ΄μ€ μ§λ API) μΉ΄μΉ΄μ€ μ§λ μ¬μ© keyDATABASE_URL: μ격 μλ² DB μ°κ²° URLNEXTAUTH_SECRET: Next auth secret keyNEXTAUTH_URL: Next auth URLNEXT_PUBLIC_KAKAO_MAP_API_KEY: μΈλΆ API(μΉ΄μΉ΄μ€ API) μΉ΄μΉ΄μ€ μ§λ JavaScript API ν€NEXT_PUBLIC_KAKAO_REST_API_KEY: μΈλΆ API(μΉ΄μΉ΄μ€ API) μΉ΄μΉ΄μ€ μ§λ JavaScript REST API ν€
- νλ‘μ νΈ ν΄λ‘
$ git clone https://github.com/FRONT-END-BOOTCAMP-PLUS-5/BoGam.git- μμ‘΄μ± μ€μΉ
$ npm install- μ€ν
$ npm run devκ°λ° 컨벀μ 보기
// κΈ°λ³Έ ν¨μ νν
export default function ComponentName() {
return (
// JSX
)
}- Prefix: Next.js App Router κ·μΉ μ€μ
- URL: μΌλ°₯ μΌμ΄μ€ (kebab-case)
- μ»΄ν¬λνΈλͺ : λλ¬Έμ μμ, μΉ΄λ© μΌμ΄μ€
κΈ°λ³Έ μ»΄ν¬λνΈ
const Component = () => {
return (
// JSX
)
}
export default Component;Props νμ μ μ
// Component.tsx
const Component = ({}: ComponentProps) => {
// μ»΄ν¬λνΈ λ‘μ§
};
// types/ComponentProps.ts
export type ComponentProps = {
// Props νμ
μ μ
};- Tailwind CSS μ¬μ©
- λμμΈ λ νΌλ°μ€: ν μ€ μ±
- CSS λ³μ: Camel case (headerBox)
- npm μ¬μ©
- ESLint & Prettier
- μλνλ ESLint (μΉμ°λμ΄ μΆκ° μμ )
- Prettier ν¬λ§·ν
API ν΄λλͺ κ·μΉ
/api/kebab-textνμ
μλ³μ κ·μΉ
| νλͺ© | κ·μΉ | μμ |
|---|---|---|
| λ³μλͺ | camelCase | userName, isLoggedIn |
| ν¨μλͺ | camelCase | getUserInfo(), handleSubmit() |
| ν΄λμ€λͺ | PascalCase | UserService, AuthController |
| React μ»΄ν¬λνΈλͺ | PascalCase | UserCard.tsx, TaxCertForm.tsx |
| μμ | UPPER_SNAKE_CASE | DEFAULT_TIMEOUT, API_URL |
| ν μ΄λ¦ | use + camelCase | useUserStore(), useTaxCertQuery() |
νμΌλͺ κ·μΉ
| νμΌ μ’ λ₯ | κ·μΉ | μμ |
|---|---|---|
| μΌλ° νμΌ | kebab-case.ts | tax-cert-form.ts, user-service.ts |
| React μ»΄ν¬λνΈ | PascalCase.tsx | TaxCertForm.tsx, UserProfile.tsx |
| ν΄λλͺ | kebab-case/ | components/, api/, tax-cert/ |
| ν ν΄λ | hooks/useX.ts | hooks/useTaxCert.ts |
| μ νΈ ν¨μ | utils/xxx.ts | utils/formatDate.ts |
λ³μλͺ κ·μΉ
- Boolean νμ
: is, has, can λ±μΌλ‘ μμ
isLoggedIn,hasPermission,canSubmit
- ν¨μ: 'λμ¬ + λͺ
μ¬' νν
- μ’μ μ:
fetchUserData(),calculateTotalPrice() - λμ μ:
data(),price()
- μ’μ μ:
- μ½λ μ€νμΌ: stringμ μμ λ°μ΄ν(')λ‘ κ°μΈκΈ°
- μ½μ΄ κΈμ§: λͺ
νμ±μ΄ λ¨μ΄μ§λ©΄ μ 체 λ¨μ΄ μ¬μ©
- μ’μ μ:
userProfile - λμ μ:
usrProf
- μ’μ μ:
- Zustand μ¬μ©
λΈλμΉ μ λ΅
main
βββ dev
βββ feat/#1
βββ feat/#2
βββ feat/#78
βββ refactor/#29
βββ fix/#2
μμ νλ‘μ°
- Issue μμ± β μμ
μ μ΄μ μμ±
- Summary: μμ νμ€ μμ½
- Descriptions: λ¬Έμ μ ν΄κ²° λ°©μ μ€λͺ
- μ»€λ° β μ μ°ν λ¨μλ‘ μ»€λ°
- PR μμ± β λ§€μΌ 5μμ PR μμ±
- 리뷰μ΄: μ½λ μμ± κ΄λ ¨ 2μΈ μ΄μ
- Assignees: μμ μ μ§μ
- Approve 2λͺ μ΄μ μ Merge
PR ν νλ¦Ώ
## π κ°μ (Overview)
μ΄ PRμ μ΄λ€ λ³κ²½μ¬νμ λ΄κ³ μλμ? κ΄λ ¨ μ΄μκ° μλ€λ©΄ μ°κ²°ν΄μ£ΌμΈμ.
(μ: Closes #μ΄μλ²νΈ)
## β
μμ
μ¬ν (Work Done)
- [ ] μμ
λ΄μ 1
- [ ] μμ
λ΄μ 2
- [ ] UI λ³κ²½μ΄ μλ€λ©΄ μ€ν¬λ¦°μ·μ 첨λΆν΄μ£ΌμΈμ.
## πΈ μ€ν¬λ¦°μ· (Screenshots)
| Before | After |
| :----: | :---: |
| | |
## reviewersμκ²
- 리뷰μ΄κ° νΉλ³ν μ κ²½μ¨μ λ΄μΌ ν λΆλΆμ΄ μλ€λ©΄ μλ €μ£ΌμΈμ.
- κΆκΈν μ μ΄λ λ
Όμκ° νμν λΆλΆλ μ’μ΅λλ€.μ»€λ° λ©μμ§ μμ
νκΈ νμ: <type>: <subject>(νκ΅μ΄)
- κΈμμ μ ν: κ° μ€ μ΅λ 72κΈμ μ€μ
- Body: 무μμ μ λ³κ²½νλμ§ μ€λͺ
μμ:
feat: λνΉ λ¦¬μ€νΈ μ‘°ν κΈ°λ₯ ꡬν
μ£Όλμ΄ λνΉ μ‘°νλ₯Ό μν΄ getRankingLists ν¨μ μΆκ°
μ»€λ° νμ
| νμ | μ€λͺ |
|---|---|
| feat | μλ‘μ΄ κΈ°λ₯ μΆκ° |
| fix | λ²κ·Έ μμ |
| docs | λ¬Έμ μμ |
| style | μ½λ μ€νμΌ λ³κ²½ |
| design | UI λμμΈ λ³κ²½ |
| test | ν μ€νΈ μ½λ μμ± |
| refactor | μ½λ 리ν©ν λ§ |
| build | λΉλ νμΌ μμ |
| ci | CI μ€μ νμΌ μμ |
| perf | μ±λ₯ κ°μ |
| chore | μμν μμ |
| rename | νμΌ/ν΄λλͺ μμ |
| remove | νμΌ μμ |
Push κ·μΉ
- μ§ κ° λ ν λ²μ pushνκΈ°
PR μ 체ν¬λ¦¬μ€νΈ
- μ΅μ dev λΈλμΉ λ¨Έμ§: PR 보λ΄κΈ° μ localμμ μ΅μ devλ₯Ό mergeν΄μ μΆ©λ μ²λ¦¬
- λΉλ νμΈ:
npm run buildμ€ννμ¬ λΉλκ° μ μμ μΌλ‘ λλμ§ νμΈ ν devμ merge
-
볡μ‘ν μ μΈ μ¬κΈ° μλ°© λ°μ΄ν° μκ°ν λ° μ μ₯ κΈ°λ₯
- λ±κΈ°λΆλ±λ³Έ, λ©μΈμ¦λͺ
μ, μ€κ°μΈ, μ€κ±°λκ°, μμΈ, μ μΈκΈ λ°νκΈ κ³μ° λ± λ€μν μ μΈ μ¬κΈ°λ₯Ό λ°©μ§ νκ³ , μλ°©νκΈ° μν λ°μ΄ν°λ₯Ό μ 곡ν©λλ€.
- λ±κΈ°λΆλ±λ³Έ API λ¬Έμ λ§ν¬
- λ©μΈμ¦λͺ μ API λ¬Έμ λ§ν¬
- μ€κ°μΈ API λ¬Έμ λ§ν¬
- μ€κ±°λκ° API λ¬Έμ λ§ν¬
- μμΈ API λ¬Έμ λ§ν¬
- 곡μμ§κ° API λ¬Έμ λ§ν¬
- μ μΈκΈ λ°νκΈ κ³μ° API λ¬Έμ λ§ν¬
- ν΄λΉ λ°μ΄ν°λ€μ μ§μ μ μΌλ‘ 보μ¬μ£Όλ κ²μ΄ μλ νμν λ°μ΄ν°λ§ νν°λ§(μνλ κ²μ¬) νμ¬ μ¬μ©μμκ² λ³΄μ¬μ€λλ€.
- νν°λ§λ λ°μ΄ν° μ€ μ¬μ©μκ° μμλ‘ νμΈ ν΄μΌ νλ λ΄μ©μ 체ν¬λ¦¬μ€νΈλ₯Ό ν΅ν΄ 보μ¬μ€λλ€.
- λ°μ΄ν°λ₯Ό μΈλΆ APIλ₯Ό ν΅ν΄ λ°κΈ λ°μΌλ©΄ λ΄λΆ DBμ μ μ₯ λμ΄ μΆκ° λ°κΈμ λ°©μ§ ν©λλ€.
- λ±κΈ°λΆλ±λ³Έ, λ©μΈμ¦λͺ
μ, μ€κ°μΈ, μ€κ±°λκ°, μμΈ, μ μΈκΈ λ°νκΈ κ³μ° λ± λ€μν μ μΈ μ¬κΈ°λ₯Ό λ°©μ§ νκ³ , μλ°©νκΈ° μν λ°μ΄ν°λ₯Ό μ 곡ν©λλ€.
-
μ μ² λ°©λ² κ°μ΄λ μ 곡
- μ μΈ μ¬κΈ°λ₯Ό μλ°© νΉμ λ°©μ§ νκ³ μ μ μ² ν΄μΌ νλ λ΄μ©κ³Ό λ°©λ²μ κ°μ΄λ ν©λλ€.
- μ¬μ©μκ° κ°μ΄λμ μ΄λκΉμ§ μ§ν νλ μ§λ₯Ό μκ°μ μΌλ‘ 보μ¬μ€λλ€.
- μ¬μ©μμ κ°μ΄λ λ¨κ³ μ 보λ₯Ό μλμΌλ‘ μ μ₯ν©λλ€.
-
UI
- Three.jsμ pageFilp λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ "μ μΈλ³΄κ°"μ΄λΌλ μλΉμ€ 컨μ μ μ΄λ Έμ΅λλ€.
-
μ¬μ©μ μ£Όμμ λ°λ₯Έ κ°λ³ μλΉμ€ μ 곡
- μ¬μ©μλ νμΈ νκ³ μ νλ μ£Όμλ₯Ό μ¬λ¬ κ° λ±λ‘ κ°λ₯νλ©°, ν΄λΉ μ£Όμ λ§λ€ λ³λμ λ°μ΄ν°λ‘ κ΅¬λΆ λ©λλ€.
ꡬ쑰 보기
Bogam/
βββ app/ # Next.js App Router νμ΄μ§λ€
β βββ (anon)/ # μΈμ¦λμ§ μμ μ¬μ©μ νμ΄μ§λ€
β β βββ _components/ # κ³΅ν΅ μ»΄ν¬λνΈλ€
β β β βββ common/ # μμ£Ό μ¬μ©λλ μ»΄ν¬λνΈλ€ (λ²νΌ, νΌ, λͺ¨λ¬ λ±)
β β βββ @detail/ # μλ¨κ³κ³ νμ΄μ§λ€
β β βββ main/ # λ©μΈ νμ΄μ§
β β βββ mypage/ # λ§μ΄νμ΄μ§
β β βββ real-estate-data/ # λΆλμ° λ°μ΄ν° νμ΄μ§
β β βββ signin/ # λ‘κ·ΈμΈ νμ΄μ§
β β βββ signup/ # νμκ°μ
νμ΄μ§
β β βββ steps/ # μ€λ¨κ³ νμ΄μ§
β β βββ tex-cert-data/ # μΈκΈκ³μ°μ λ°μ΄ν° νμ΄μ§
β βββ api/ # API λΌμ°νΈλ€
β
βββ hooks/ # React Hooks
β βββ main/ # λ©μΈ νμ΄μ§ κ΄λ ¨ hooks
β βββ (κΈ°ν hooks) # κ³΅ν΅ hooks
βββ libs/ # λΌμ΄λΈλ¬λ¦¬ λ° κ³΅ν΅ λͺ¨λ
β βββ stores/ # μν κ΄λ¦¬ νμΌλ€
β βββ api_front/ # νλ‘ νΈμλ API ν΄λΌμ΄μΈνΈ
β βββ constants/ # μμ μ μ
β βββ codef/ # μ½λμν κ΄λ ¨ λͺ¨λ
βββ utils/ # μ νΈλ¦¬ν° ν¨μ λ° λͺ¨λ
β βββ main/ # λ©μΈ νμ΄μ§ κ΄λ ¨ μ νΈλ¦¬ν°
β βββ sise/ # μμΈ κ΄λ ¨ μ νΈλ¦¬ν°
β βββ verifyPassword/ # λΉλ°λ²νΈ κ²μ¦ μ νΈλ¦¬ν°
βββ hooks/ # React Hooks
β βββ main/ # λ©μΈ νμ΄μ§ κ΄λ ¨ hooks
β βββ (κΈ°ν hooks) # κ³΅ν΅ hooks
βββ types/ # TypeScript νμ
μ μ
β βββ kakao-maps.d.ts
β βββ next-auth.d.ts
βββ metadata/ # λ©νλ°μ΄ν° νμΌλ€
β βββ mainMetadata.ts
β βββ stepMetadata.ts
βββ public/ # μ μ νμΌλ€ (μ΄λ―Έμ§, μμ΄μ½, λͺ¨λΈ λ±)
β βββ images/ # μ΄λ―Έμ§ νμΌλ€
β βββ models/ # 3D λͺ¨λΈ νμΌλ€
β βββ icons/ # μμ΄μ½ νμΌλ€
βββ backend/ # λ°±μλ (Clean Architecture)
β βββ applications/
β βββ domain/
β βββ infrastructure/
βββ prisma/ # λ°μ΄ν°λ² μ΄μ€
β βββ schema.prisma
βββ scripts/ # λΉλ μ€ν¬λ¦½νΈ
βββ (μ νΈλ¦¬ν° μ€ν¬λ¦½νΈλ€)
| μ¨λ³΄λ© νμ΄μ§ |
|---|
![]() |
| λ©μΈ νμ΄μ§ |
|---|
![]() |
| λλ¨κ³ νμ΄μ§ |
|---|
![]() |
| μ€λ¨κ³ νμ΄μ§ |
|---|
![]() |
| μλ¨κ³ νμ΄μ§ |
|---|
![]() |
| λ‘κ·ΈμΈ νμ΄μ§ | νμκ°μ νμ΄μ§ |
|---|---|
![]() |
![]() |
| λμ보λ νμ΄μ§ | λ§μ΄ νμ΄μ§ |
|---|---|
![]() |
![]() |
| λ±κΈ°λΆλ±λ³Έ λ°κΈ μ λ ₯ λΆλΆ | λ©μΈμ¦λͺ μ λ°κΈ μ λ ₯ λΆλΆ | λΆλμ° μ€κ°μ μ μ λ ₯ λΆλΆ |
|---|---|---|
![]() |
![]() |
![]() |
| λ±κΈ°λΆλ±λ³Έ λ°μ΄ν° μκ°ν | λ©μΈ μ¦λͺ μ λ°μ΄ν° μκ°ν | λΆλμ° μ€κ°μ μ λ°μ΄ν° μκ°ν |
|---|---|---|
![]() |
![]() |
![]() |
| μ€κ±°λκ° μ λ ₯ λΆλΆ | μ€κ±°λκ° νμΈ λͺ¨λ¬ | μ€κ±°λκ° λ°μ΄ν° μκ°ν |
|---|---|---|
![]() |
![]() |
![]() |
| μ μ² λ°©λ² κ°μ΄λ |
|---|
![]() |
| μ μΈκΈ λ°ν 보μ¦κΈ κ³μ° μ λ ₯ λΆλΆ |
|---|
![]() |
| μ μΈκΈ λ°ν 보μ¦κΈ κ³μ° λ°μ΄ν° μκ°ν |
|---|
![]() |





















