Skip to content

About

πŸ“Έ 사진 촬영 λ§€μΉ­ ν”Œλž«νΌ, μ°μ–΄μ€„κ²Œ

Resources

Stars

3 stars

Watchers

2 watching

Forks

Latest commit

Β 

History

380 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

dnd-14th-3-frontend

DND 14κΈ° 3νŒ€ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈ (TypeScript 기반)

기술 μŠ€νƒ

μ½”μ–΄

  • React 18.3.1 - UI 라이브러리
  • TypeScript 5.9.3 - νƒ€μž… μ•ˆμ •μ„±
  • Vite 7.2.4 - λΉŒλ“œ 도ꡬ

μƒνƒœ 관리

  • Zustand 5.0.10 - μ „μ—­ μƒνƒœ 관리
  • TanStack React Query 5.90.20 - μ„œλ²„ μƒνƒœ 관리

μŠ€νƒ€μΌλ§

  • Tailwind CSS 4.1.18 - μœ ν‹Έλ¦¬ν‹° CSS ν”„λ ˆμž„μ›Œν¬

폼 & μœ νš¨μ„± 검사

  • Zod 3.25.76 - λŸ°νƒ€μž„ νƒ€μž… 검증

ν…ŒμŠ€νŠΈ

  • Vitest 4.0.18 - μœ λ‹› ν…ŒμŠ€νŠΈ
  • React Testing Library 16.3.2 - μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ
  • Playwright 1.58.0 - E2E ν…ŒμŠ€νŠΈ

지도

  • react-kakao-maps-sdk 1.2.0 - 카카였맡 API

μ½”λ“œ ν’ˆμ§ˆ

  • ESLint - μ½”λ“œ λ¦°νŒ…
  • Prettier 3.8.1 - μ½”λ“œ ν¬λ§·νŒ…
  • EditorConfig - 에디터 μ„€μ • 톡일

μ„€μΉ˜

npm install

슀크립트

개발 μ„œλ²„

# 개발 μ„œλ²„ μ‹œμž‘ (ν•« λ¦¬λ‘œλ“œ 지원)
npm run dev
# β†’ http://localhost:5173 μ—μ„œ 개발 μ„œλ²„ μ‹€ν–‰
# β†’ 파일 λ³€κ²½ μ‹œ μžλ™μœΌλ‘œ λΈŒλΌμš°μ € μƒˆλ‘œκ³ μΉ¨

λΉŒλ“œ

# ν”„λ‘œλ•μ…˜ λΉŒλ“œ (μ΅œμ ν™”λœ λ²ˆλ“€ 생성)
npm run build
# β†’ dist/ 폴더에 λΉŒλ“œ κ²°κ³Όλ¬Ό 생성
# β†’ μ••μΆ•, μ΅œμ ν™”, νŠΈλ¦¬μ‰μ΄ν‚Ή 적용

# λΉŒλ“œ κ²°κ³Ό 미리보기
npm run preview
# β†’ ν”„λ‘œλ•μ…˜ λΉŒλ“œλ₯Ό λ‘œμ»¬μ—μ„œ ν…ŒμŠ€νŠΈ
# β†’ μ‹€μ œ 배포 ν™˜κ²½κ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ‹€ν–‰

μ½”λ“œ ν’ˆμ§ˆ

# ESLint둜 μ½”λ“œ 검사
npm run lint
# β†’ JavaScript/TypeScript μ½”λ“œ μŠ€νƒ€μΌ 및 잠재적 였λ₯˜ 검사
# β†’ eslint.config.js κ·œμΉ™ 적용

# Prettier둜 μ½”λ“œ μžλ™ ν¬λ§·νŒ…
npm run format
# β†’ src/ ν΄λ”μ˜ λͺ¨λ“  μ½”λ“œ 파일 μžλ™ 정리
# β†’ .prettierrc 섀정에 따라 ν¬λ§·νŒ…

# Prettier ν¬λ§·νŒ… 검사 (CI/CD용)
npm run format:check
# β†’ ν¬λ§·νŒ…μ΄ μ˜¬λ°”λ₯Έμ§€ κ²€μ‚¬λ§Œ μˆ˜ν–‰ (μˆ˜μ •ν•˜μ§€ μ•ŠμŒ)
# β†’ CI νŒŒμ΄ν”„λΌμΈμ—μ„œ μ‚¬μš©

μœ λ‹› ν…ŒμŠ€νŠΈ (Vitest + React Testing Library)

# ν…ŒμŠ€νŠΈ Watch λͺ¨λ“œ (개발 쀑 μ‚¬μš©)
npm run test
# β†’ 파일 λ³€κ²½ μ‹œ κ΄€λ ¨ ν…ŒμŠ€νŠΈ μžλ™ μž¬μ‹€ν–‰
# β†’ μΈν„°λž™ν‹°λΈŒ CLI 제곡

# ν…ŒμŠ€νŠΈ UI λͺ¨λ“œ
npm run test:ui
# β†’ λΈŒλΌμš°μ €μ—μ„œ ν…ŒμŠ€νŠΈ κ²°κ³Ό μ‹œκ°ν™”
# β†’ 각 ν…ŒμŠ€νŠΈ 상세 정보 확인 κ°€λŠ₯

# ν…ŒμŠ€νŠΈ ν•œ 번만 μ‹€ν–‰ (CI/CD용)
npm run test:run
# β†’ Watch λͺ¨λ“œ 없이 λͺ¨λ“  ν…ŒμŠ€νŠΈ 1회 μ‹€ν–‰
# β†’ λΉŒλ“œ νŒŒμ΄ν”„λΌμΈμ—μ„œ μ‚¬μš©

# ν…ŒμŠ€νŠΈ 컀버리지 리포트 생성
npm run test:coverage
# β†’ coverage/ 폴더에 HTML 리포트 생성
# β†’ μ½”λ“œ 컀버리지 확인 κ°€λŠ₯

E2E ν…ŒμŠ€νŠΈ (Playwright)

# E2E ν…ŒμŠ€νŠΈ μ‹€ν–‰ (ν—€λ“œλ¦¬μŠ€ λͺ¨λ“œ)
npm run test:e2e
# β†’ λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ E2E ν…ŒμŠ€νŠΈ μ‹€ν–‰
# β†’ CI ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜κΈ° μ’‹μŒ

# Playwright UI λͺ¨λ“œ
npm run test:e2e:ui
# β†’ ν…ŒμŠ€νŠΈλ₯Ό λ‹¨κ³„λ³„λ‘œ ν™•μΈν•˜κ³  디버깅
# β†’ νƒ€μž„ νŠΈλž˜λΈ” κΈ°λŠ₯으둜 각 단계 μž¬μƒ κ°€λŠ₯

# λΈŒλΌμš°μ € ν‘œμ‹œ λͺ¨λ“œ (ν—€λ“œν’€)
npm run test:e2e:headed
# β†’ μ‹€μ œ λΈŒλΌμš°μ €λ₯Ό λ„μ›Œμ„œ ν…ŒμŠ€νŠΈ μ‹€ν–‰
# β†’ ν…ŒμŠ€νŠΈ 과정을 눈으둜 확인 κ°€λŠ₯

μ½”λ”© μ»¨λ²€μ…˜

파일λͺ…, import μˆœμ„œ λ“± ν”„λ‘œμ νŠΈ μ»¨λ²€μ…˜μ€ ν”„λ‘ νŠΈμ—”λ“œ_μ½”λ”© μ»¨λ²€μ…˜λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

ν”„λ‘œμ νŠΈ ꡬ쑰

β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ components/          # μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ shared/          # 곡톡 μ»΄ν¬λ„ŒνŠΈ (Button, Input λ“±)
β”‚   β”‚   β”œβ”€β”€ layout/          # λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ (Header, Footer λ“±)
β”‚   β”‚   └── domain/          # 도메인별 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ hooks/               # μ»€μŠ€ν…€ React ν›…
β”‚   β”œβ”€β”€ constants/           # μƒμˆ˜ (도메인별: on-board/intro λ“±)
β”‚   β”œβ”€β”€ api/                 # API 톡신 ν•¨μˆ˜ (순수 API 호좜)
β”‚   β”œβ”€β”€ queries/             # React Query ν›… & Query Key 관리
β”‚   β”œβ”€β”€ services/            # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ lib/                 # 순수 μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
β”‚   β”œβ”€β”€ store/               # Zustand μ „μ—­ μƒνƒœ 관리
β”‚   β”œβ”€β”€ pages/               # λΌμš°νŠΈλ³„ νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ router/              # React Router μ„€μ •
β”‚   β”‚   └── guards/          # 라우트 κ°€λ“œ
β”‚   β”œβ”€β”€ types/               # TypeScript νƒ€μž… μ •μ˜
β”‚   β”œβ”€β”€ assets/              # 이미지, μ•„μ΄μ½˜ λ“± 정적 λ¦¬μ†ŒμŠ€
β”‚   β”œβ”€β”€ test/                # ν…ŒμŠ€νŠΈ μœ ν‹Έλ¦¬ν‹°
β”‚   β”‚   └── setup.ts         # Vitest μ„€μ •
β”‚   β”œβ”€β”€ App.tsx              # 메인 μ•± μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ main.tsx             # μ—”νŠΈλ¦¬ 포인트
β”‚   β”œβ”€β”€ index.css            # μ „μ—­ μŠ€νƒ€μΌ
β”‚   └── vite-env.d.ts        # Vite νƒ€μž… μ •μ˜
β”œβ”€β”€ e2e/                     # Playwright E2E ν…ŒμŠ€νŠΈ
β”œβ”€β”€ public/                  # 정적 파일 (favicon λ“±)
β”œβ”€β”€ vite.config.ts           # Vite μ„€μ •
β”œβ”€β”€ vitest.config.ts         # Vitest μ„€μ •
β”œβ”€β”€ playwright.config.ts     # Playwright μ„€μ •
β”œβ”€β”€ tsconfig.json            # TypeScript 메인 μ„€μ •
β”œβ”€β”€ tsconfig.app.json        # μ•± μ½”λ“œ TypeScript μ„€μ •
β”œβ”€β”€ tsconfig.node.json       # λΉŒλ“œ 도ꡬ TypeScript μ„€μ •
β”œβ”€β”€ eslint.config.js         # ESLint μ„€μ •
β”œβ”€β”€ .prettierrc              # Prettier μ„€μ •
β”œβ”€β”€ .editorconfig            # EditorConfig μ„€μ •
β”œβ”€β”€ .coderabbit.yaml         # CodeRabbit AI 리뷰 μ„€μ •
β”œβ”€β”€ .env.example             # ν™˜κ²½ λ³€μˆ˜ 예제
└── README.md                # ν”„λ‘œμ νŠΈ λ¬Έμ„œ

Path Alias

TypeScript와 Viteμ—μ„œ λ‹€μŒ 경둜 별칭을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

전체 μ ‘κ·Ό

import { User } from "@/types/user";
import { formatDate } from "@/lib/format";
import { userApi } from "@/api/user.api";

각 λ ˆμ΄μ–΄λ³„ 별칭

// ν•˜μœ„ 계측 (독립적)
import type { User } from "@/types";
import { formatDate } from "@/lib/format";
import { INTRO_STEPS } from "@/constants/on-board";

// 쀑간 계측
import { userApi } from "@/api/user.api";
import { userService } from "@/services/user.service";
import { useAuthStore } from "@/store/auth.store";

// μƒμœ„ 계측
import { useAuth } from "@/hooks/useAuth";
import { useUser } from "@/queries/user.query";

// UI 계측
import Button from "@/components/common/Button";
import HomePage from "@/pages/Home/HomePage";
import { ROUTES } from "@/router/routes";

// 정적 λ¦¬μ†ŒμŠ€
import logo from "@/assets/logo.png";
import logo2 from "@assets/logo.png"; // μΆ•μ•½ν˜•λ„ κ°€λŠ₯
import icon from "@public/icon.svg";

Import μˆœμ„œ (ESLint μžλ™ μ •λ ¬)

μ˜μ‘΄μ„± 계측 μˆœμ„œλŒ€λ‘œ μžλ™ μ •λ ¬λ©λ‹ˆλ‹€:

  1. React 핡심 β†’ 2. μ™ΈλΆ€ 라이브러리 β†’ 3. types β†’ 4. lib β†’ 5. api β†’ 6. services β†’ 7. store β†’ 8. hooks β†’ 9. queries β†’ 10. components β†’ 11. pages β†’ 12. router β†’ 13. assets

ν…ŒμŠ€νŠΈ μ‹€ν–‰ μ „ μ€€λΉ„

Playwright λΈŒλΌμš°μ €λ₯Ό 처음 μ‚¬μš©ν•˜λŠ” 경우 μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€:

npx playwright install

AI μ½”λ“œ 리뷰

이 ν”„λ‘œμ νŠΈλŠ” CodeRabbit을 μ‚¬μš©ν•˜μ—¬ PR에 λŒ€ν•œ μžλ™ μ½”λ“œ 리뷰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 리뷰 섀정은 .coderabbit.yamlμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λΌμ΄μ„ μŠ€

MIT

About

πŸ“Έ 사진 촬영 λ§€μΉ­ ν”Œλž«νΌ, μ°μ–΄μ€„κ²Œ

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages