μ°λ¦¬ 컀μ€ν°λ§μ΄μ§(QUOSTOMIZE) μ μ¬μ©μκ° λ§€λ¬ μμ μ μν ν¨ν΄κ³Ό μ·¨ν₯μ λ§κ² μΉ΄λ ννκ³Ό ν¬μΈνΈ μ¬μ©μ²λ₯Ό μ§μ μ νν μ μλ μλΉμ€μ λλ€.
μ¬μ©μκ° μ§μ κ²°μ νλ λ§μΆ€ν νν μ 곡μ ν΅ν΄ κΈ°μ‘΄ μΉ΄λ μλΉμ€μ νκ³λ₯Ό λ°μ΄λκ³ , λ³ννλ μλΉ νΈλ λμ μ μ°νκ² λμν©λλ€.
ππ» μμ°μμ λ°λ‘κ°κΈ°
ππ» μ¬μ΄νΈ λ°λ‘κ°κΈ°
λ³Έ νλ‘μ νΈλ μλΉμ€ 보μκ³Ό μμ μ± κ°νλ₯Ό μ£Όμ μ€κ³ λ°©ν₯μΌλ‘ λκ³ κ°λ°λμμ΅λλ€.
1. 보μκ³Ό μμ μ± κ°ν
- Next.js + Auth.js
- ν ν°μ λΈλΌμ°μ μΏ ν€ λμ μλ² μΈμ μ μ μ₯νμ¬ λ°μ΄ν° μ§μ λ ΈμΆ λ°©μ§
- Next.js API Route
- ν΄λΌμ΄μΈνΈ-λ°±μλ κ° μ§μ ν΅μ μ μ°¨λ¨ν΄ ν€λ μ 보 λ° API μ£Όμ 보νΈ
- JWT 보μ κ°ν
- λΉλ°λ²νΈλ λ¨λ°©ν₯ μνΈν, κ°μΈμ 보λ μλ°©ν₯ μνΈν μ μ©
- Acess/Refresh Token κ²μ¦ λ° Blacklist λ‘μ§ μΆκ°λ‘ 보μ μμ€ ν₯μ
2. λ©±λ±μ± μ μ©
- Redisλ₯Ό νμ©ν λ©±λ±ν€ κ΄λ¦¬λ‘ μΉ΄λ μμ± μμ² μ€λ³΅ μ²λ¦¬ λ°©μ§
- λμΌν μμ²μ μΊμλ μλ΅ λ°νμΌλ‘ ν¨μ¨μ±κ³Ό μμ μ± ν보
3. λλ λ°μ΄ν° μ²λ¦¬
- λ°°μΉ νλ‘μΈμ€: λ³΅κΆ μλͺ¨ λ°μ΄ν°λ₯Ό λ§€μΌ μ ν΄μ§ μκ°μ μ²λ¦¬
- Redaer: 1000λͺ λ°μ΄ν° μ½μ΄μ€κΈ°
- Processor: μλͺ¨μ μ€ λΉμ²¨μ μ μ
- Writer: λΉμ²¨ κ²°κ³Ό κΈ°λ‘
4. μ½λ νμ§ κ΄λ¦¬
- SonarQubeλ₯Ό ν΅ν μ μ μ½λ λΆμμΌλ‘ μ½λ νμ§ μ μ§
- DB LockμΌλ‘ λμμ± λ¬Έμ ν΄κ²°
- λΉλκΈ° μ²λ¦¬ κ°νλ‘ μμ μ μΈ μμΈ μ²λ¦¬ ꡬν
1. μΉ΄λ νν - νν μ νμ μμ
- μμλΆλ₯ νν: 5κ°μ§ μμλΆλ₯ μ ν μ λͺ¨λ κ°λ§Ήμ μμ 3% μ 립
- λ§μΆ€ν νν: μΈλΆ κ°λ§Ήμ κ·Έλ£Ή μ ν μ μ΅λ 4% μ 립
- μ μ°ν λ³κ²½: 30μΌλ§λ€ νν λ³κ²½ κ°λ₯
2. ν¬μΈνΈ μ¬μ©μ² - ν¬μΈνΈ μ¬μ©μ λ€μμ±
- νμ΄λ°±: μΉ΄λ κ²°μ μΌμ ν¬μΈνΈλ₯Ό νκΈμ²λΌ μ¬μ©
- μ‘°κ°ν¬μ: μνλ μ£Όμμ μ€μ νκ³ ν¬μΈνΈλ‘ μ£Όμ 맀μ
- μΌμΌλ³΅κΆ: λ§€μΌ μμ μΆμ²¨μΌλ‘ μ΅λ 1λ§ ν¬μΈνΈ μ§κΈ
3. μΉ΄λ μμ± - μ€μ μΉ΄λ μμ± νλ‘μΈμ€μ λ©±λ±μ±μ μ μ©ν μμ± κΈ°λ₯
- RestClientλ₯Ό νμ©ννκ΅ν¬μμ¦κΆ OPENAPIμ μ°λ
- Access Token λ°κΈ & 보μ μ£Όμ μ 보 κΈ°λ₯
- S3λ₯Ό νμ©ν μ£Όμ μ΄λ―Έμ§ λ€μ΄λ‘λ
- Spring Batchλ₯Ό νμ©ν΄ λ³΅κΆ κΈ°λ₯μ νμ±νν μ¬μ©μ μ§κ³
- μμ (00:00)μ 1/1000 νλ₯ λ‘ ν¬μΈνΈ νλ
κ΄λ¦¬μ νμ΄μ§λ Vercelμ μ΄μ©ν΄ λ°°ν¬λ₯Ό μ§ννμμ΅λλ€. Vercel λμ보λλ₯Ό ν΅ν΄ λ°°ν¬ μνλ₯Ό νλμ νμΈν μ μμ΅λλ€.
λ°°ν¬ κ³Όμ
- μ»€λ° νΈμ: Githubμ λΈλμΉλ‘ νΈμν©λλ€.
- Vercel λ°°ν¬: λ©μΈ λΈλμΉ λ³ν© ν Vercelμ λ°°ν¬ν©λλ€.
- μ€μκ° μ λ°μ΄νΈ: Vercelμ ν΅ν΄ κ΄λ¦¬μ μ¬μ΄νΈκ° μ¦μ μ λ°μ΄νΈλ©λλ€.
root/
βββ app/
β βββ (fullscreen)/
β β βββ card-benefit-details/
β β βββ create-card/
β β βββ my-page/
β β βββ sign-up/
β β βββ layout.jsx
β βββ (nav)/
β β βββ benefit-change/
β β βββ find-id/
β β βββ find-password/
β β βββ home/
β β βββ login/
β β βββ lotto/
β β βββ my-card/
β β βββ piece-stock/
β β βββ qna/
β β βββ layout.jsx
β βββ api/
β βββ auth/
β βββ API μ°κ²°μ΄ νμν μλΉμ€
β βββ (fullscreen κ΄λ ¨ API)
β βββ (nav κ΄λ ¨ API)
β βββ κΈ°ν κ³΅ν΅ API
βββ components/
β βββ box/
β βββ bubble/
β βββ button/
β βββ calendar/
β βββ card/
β βββ graph/
β βββ header/
β βββ navigationbar/
β βββ overlay/
βββ public/
β βββ cards-images/
β βββ icons/
β βββ images/
β βββ lotties/
βββ utils/
β βββ loginValid.js
β βββ getYYYYMMDDDate.js
βββ auth.js
βββ middleware.js
βββ jsconfig.json
βββ next.config.mjs
βββ tailwind.config.js
βββ .env.local
βββ package.json
βββ pnpm-lock.yaml
βββ postcss.config.js
- νλ‘μ νΈ μμμΌ: 2024.11.19.
- νλ‘μ νΈ μ’ λ£μΌ: 2024.12.08.
μΉ΄ν κ³ λ¦¬ | λΌμ΄λΈλ¬λ¦¬ | μ€λͺ |
---|---|---|
νλ μμν¬ & μ½μ΄ | Next.js (v15.0.2) | React κΈ°λ°μ νμ€ν μΉ νλ μμν¬λ‘ SSR λ° SSGλ₯Ό μ§μ |
React (v18.3.1) | μ μΈν μ¬μ©μ μΈν°νμ΄μ€λ₯Ό κ°λ°νκΈ° μν λΌμ΄λΈλ¬λ¦¬ | |
UI & μμ΄μ½μ½ | Emotion (v11.13) | CSS-in-JS λ°©μμ μ§μνμ¬ λμ μ€νμΌλ§μ κ°λ¨νκ² κ΅¬ν |
Material-UI (v6.1.7) | Googleμ Material Design κΈ°λ° UI μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬ | |
Headless UI (v2.2.0) | μ κ·Όμ± νμ€μ μ€μνλ UI μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬, λμμΈ μ»€μ€ν°λ§μ΄μ§ μ©μ΄ | |
Floating UI (v0.26.28) | νμ€λ², ν΄ν λ± UI μμμ μμΉλ₯Ό μ κ΅νκ² μ μ΄ | |
Lucide React (v0.460.0) | λͺ¨λν μ€νμΌμ μ€νμμ€ μμ΄μ½ μΈνΈ | |
React Icons (v5.3.0) | λ€μν μ€νμΌμ μμ΄μ½μ μ§μνλ React μμ΄μ½ λΌμ΄λΈλ¬λ¦¬ | |
Material Icons (v1.13.12) | Googleμ Material Design κ°μ΄λ κΈ°λ° μμ΄μ½ | |
μΈμ¦ | NextAuth.js (v5.0.0-beta.25) | OAuth, Credentials λ± λ€μν μΈμ¦ λ°©μμ κ°νΈνκ² κ΅¬ν |
μ λλ©μ΄μ & μκ° ν¨κ³Ό | GSAP (v3.12.5) | κ³ μ±λ₯ μ λλ©μ΄μ , νμλΌμΈ κΈ°λ°μ μ λλ©μ΄μ ꡬν |
Lottie Web (v5.12.2) | After Effects μ λλ©μ΄μ μ μΉμμ JSON νμΌλ‘ μ½κ² μ¬μ | |
Canvas Confetti (v1.9.3) | μΊλ²μ€λ₯Ό νμ©ν κ°λ²Όμ΄ 컨νν° ν¨κ³Ό μ 곡 | |
React Slot Counter (v3.0.1) | μ«μλ₯Ό μ λλ©μ΄μ μΌλ‘ μΉ΄μ΄ν νλ κΈ°λ₯ μ 곡 | |
λ°μ΄ν° μκ°ν | Chart.js (v4.4.6) | λ°μν μ°¨νΈλ₯Ό μ½κ² μμ±ν μ μλ λ°μ΄ν° μκ°ν λΌμ΄λΈλ¬λ¦¬ |
Chartjs Plugin Datalabels (v2.2.0) | μ°¨νΈμ λ°μ΄ν° λΌλ²¨μ μΆκ°νμ¬ μ 보λ₯Ό μκ°μ μΌλ‘ κ°μ‘° | |
μ νΈλ¦¬ν° | UUID (v11.0.3) | μ€λ³΅λμ§ μλ κ³ μ μλ³μλ₯Ό μμ± |
js-cookie (v3.0.5) | λΈλΌμ°μ μΏ ν€λ₯Ό κ°νΈνκ² μ€μ νκ³ κ΄λ¦¬ | |
React Intersection Observer (v9.13.1) | νΉμ μμκ° λ·°ν¬νΈμ λ€μ΄μλμ§ κ°μ§νμ¬ lazy loading λ± κΈ°λ₯ ꡬν | |
E2E ν μ€νΈ | Cypress (v13.16.1) | λΈλΌμ°μ κΈ°λ°μ End-to-End(E2E) ν μ€νΈ μν |
μ»€λ° μ»¨λ²€μ
- {Tag}/{μμ λ΄μ©}
Feat/input : λΉλ°λ²νΈ μ¨κΉ μ²λ¦¬
- μ»€λ° κ·μΉ
Tag Name | Description |
---|---|
Feat | μλ‘μ΄ κΈ°λ₯μ μΆκ° |
Fix | λ²κ·Έ μμ |
Design | CSS λ± μ¬μ©μ UI λμμΈ λ³κ²½ |
!BREAKING CHANGE | 컀λ€λ API λ³κ²½μ κ²½μ° |
!HOTFIX | μΉλͺ μ μΈ λ²κ·Έ κΈ΄κΈ μμ |
Style | μ½λ ν¬λ§· λ³κ²½, μΈλ―Έμ½λ‘ λλ½ λ± |
Refactor | νλ‘λμ μ½λ 리ν©ν λ§ |
Comment | μ£Όμ μΆκ° λ° λ³κ²½ |
Docs | λ¬Έμ μμ |
Test | ν μ€νΈ μ½λ μΆκ° λλ μμ |
Chore | λΉλ μ 무 μμ λ° ν¨ν€μ§ κ΄λ¦¬ μ λ°μ΄νΈ |
Rename | νμΌ/ν΄λλͺ μμ |
Remove | νμΌ/ν΄λ μμ |
μ΄κΈ° νμ μ μ£Όμμ¬ν
- ν¨ν€μ§ 맀λμ λ pnpmμ μ¬μ©ν©λλ€.
npm install -g pnpm
pnpm install
- navbarκ° μ‘΄μ¬νλ νμ΄μ§ ꡬν μ
app/(nav)
ν΄λ νμμ μμ±ν©λλ€. - navbarκ° μλ νμ΄μ§ ꡬν μ
app/(fullscreen)
ν΄λ νμμ μμ±ν©λλ€. - μ€λ³΅ κ°λ₯μ±μ΄ μκ±°λ νμ΄μ§κ° λ무 κΈΈμ΄μ Έμ λΆλ¦¬κ° νμν μ»΄ν¬λνΈμ κ²½μ° λΆλ¦¬ν νμΌμ
components
ν΄λμ κ°μ μ΄λ¦μ κ°μ§λ νμ ν΄λμ μμ±ν©λλ€. - λ§μ½ νλ©΄μ νμνλ κ² μΈμ λ‘μ§μ΄ κΈΈμ΄μ§λ©΄ νμνλ©΄
utils
ν΄λμ jsνμΌ μμ±ν©λλ€. - μμ΄μ½ μ¬μ© μ
https://marella.me/material-icons/demo/
νμ΄μ§μμ νμ ν μμΌλ©΄ νμΌλ‘ λ체ν©λλ€.
![]() |
![]() |
![]() |
κΈ°λ¨μ | κΉμμ± | κΉνμ° |
μ΄κ΄ νμ₯ Frontend νμ₯ FullStack κ°λ° |
FullStack κ°λ° νμ | Backend νμ₯ FullStack κ°λ° |
νλ‘ νΈ νλ‘μ νΈ μΈν
νλ‘ νΈ μΈμ¦/μΈκ° νλ‘ νΈ CI/CD κΈ°ν UI/κΈ°λ₯ ꡬν |
ν¬μ νμ΄μ§ ꡬν νμκ°μ νμ΄μ§ ꡬν ν¬μ API μ°κ²° νμκ°μ API μ°κ²° |
μΉ΄λ μμ± νμ΄μ§ ꡬν μΉ΄λ μμ± API μ°κ²° UUIDλ‘ λ©±λ±ν€ μμ± |
![]() |
![]() |
![]() |
λ°©μ±κ²½ | μ€μ λ―Ό | νμ°¬μ |
FullStack κ°λ° νμ | PM FullStack κ°λ° νμ |
FullStack κ°λ° νμ |
- - - |
μΉ΄λ μμΈ νν νμ΄μ§ ꡬν μΉ΄λ μμ± νμ΄μ§ ꡬν λμ μΉ΄λ νμ΄μ§ API μ°κ²° μΉ΄λ νν λ³κ²½ API μ°κ²° μΉ΄λ λ° μ°¨νΈ μ λλ©μ΄μ ꡬν |
μΉ΄λ μμ± νμ΄μ§ SMS μΈμ¦ νμ΄μ§ λ‘κ·ΈμΈ νμ΄μ§ API μ°κ²° QnA νμ΄μ§ API μ°κ²° |
μλΉμ€ μꡬμ¬ν μ μμ.pdf