src/
├── apis/ # 전역 axios 요청 함수 (공통 API)
├── assets/ # 이미지, 폰트 등 정적 자산
├── components/ # 전역 재사용 UI 컴포넌트
├── constants/ # 상수 (queryKeys, enums, endpoints 등)
├── features/ # 기능(도메인) 단위 폴더
│ └── {feature}/
│ ├── api/ # 해당 도메인 내부 API 함수
│ ├── components/ # 해당 도메인 전용 컴포넌트
│ ├── hooks/ # 해당 도메인 전용 커스텀 훅
│ ├── store/ # 해당 도메인 전용 상태관리
│ ├── schemas/ # zod 스키마 등 유효성 검증
│ ├── types/ # 해당 도메인 전용 타입
│ └── index.ts # 엔트리 포인트
├── hooks/ # 전역 커스텀 훅
├── libs/ # axios 인스턴스 등 외부 라이브러리 래핑
├── pages/ # 라우트 진입점 컴포넌트
├── schemas/ # 전역 유효성 검사 스키마
├── store/ # 전역 상태 (auth 등)
├── types/ # 전역 타입 (공통)
└── utils/ # 순수 함수 유틸
<type>(scope?): <description>
| type | 설명 | 예시 |
|---|---|---|
| feat | 새로운 기능 추가 | feat(login): 이메일 로그인 구현 |
| fix | 버그 수정 | fix(login): 에러 메시지 수정 |
| docs | 문서 관련 변경 | docs(readme): 환경설정 문서 추가 |
| style | 코드 스타일 수정 (로직 변화 X) | style: 세미콜론 제거 |
| refactor | 리팩터링 (기능 변경 없음) | refactor(modal): 조건문 간결화 |
| perf | 성능 개선 | perf(list): 렌더링 최적화 |
| test | 테스트 코드 추가·수정 | test(auth): useLogin 테스트 추가 |
| build | 빌드 설정 변경 | build: Vite 플러그인 설정 수정 |
| ci | CI 설정 변경 | ci: GitHub Actions 워크플로우 수정 |
| chore | 기타 작업 | chore: 패키지 업데이트 |
| revert | 이전 커밋 되돌리기 | revert: useLogin 커밋 롤백 |
git commit -m 'feat(login): 이메일 로그인 추가'
git commit -m 'fix(header): 로고 클릭 시 이동 오류 수정'
git commit -m 'docs(readme): 환경설정 문서 추가'
git commit -m 'style: 불필요한 세미콜론 제거'
git commit -m 'refactor(modal): 중복 로직 제거'
git commit -m 'test(auth): useLogin 테스트 추가'
git commit -m 'build: Vite 플러그인 설정 추가'
git commit -m 'ci: 배포 자동화 스크립트 수정'
git commit -m 'chore: 불필요한 console.log 제거'
git commit -m 'revert: useDebounce 커밋 되돌림'type/작업-또는-도메인명
| 타입 | 설명 | 예시 |
|---|---|---|
| feature | 신규 기능 | feature/회원가입-ui |
| fix | 버그 수정 | fix/로그인-버튼-중복클릭 |
| refactor | 리팩터링 | refactor/lpApi-에러핸들링 |
| chore | 설정·환경 | chore/eslint-rule-추가 |
| docs | 문서 | docs/readme-초기설정 |
⚠️ 모든 브랜치는main에서 파생합니다.
<type>(scope?): <description>
feat(login): 이메일 로그인 기능 구현fix(header): 로고 클릭 시 라우팅 오류 수정refactor(modal): 로직 중복 제거chore(deps): axios 버전 업데이트
main브랜치에서 브랜치를 파생 후 작업- PR 브랜치명은 브랜치 컨벤션 준수
main브랜치로 직접 커밋 금지- 리뷰 승인 후 머지
- 컴포넌트 선언:
const 컴포넌트명 = () => { ... }형태로 정의하고, 파일 하단에서export default 컴포넌트명;으로 기본 내보내기를 합니다. - Props 인터페이스 네이밍: 컴포넌트 Props는
interface 컴포넌트명Props { ... }로 선언합니다. - 약어 사용 금지:
Btn,Img와 같은 축약어 사용을 지양하고,Button,Image처럼 전체 단어를 사용합니다. - 파일 당 하나의 기본 컴포넌트: 한 파일에는 하나의 컴포넌트를 기본(export default)으로 두어 가독성을 높입니다.
- 타입은 features 폴더에: 타입은
export type = {}로 선언하고features/types에 저장합니다. - 페이지는 pages 폴더에: 페이지 컴포넌트
페이지명.tsx로 선언하고src/pages에 저장합니다.