Skip to content

Commit 017397b

Browse files
authored
Merge pull request #2 from TTORANG/chore/initial-setup#1
chore/프로젝트 세팅
2 parents a96a506 + 14f7efd commit 017397b

28 files changed

+8647
-0
lines changed

.editorconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
indent_style = space
7+
indent_size = 2
8+
insert_final_newline = true
9+
trim_trailing_whitespace = true
10+
11+
[*.md]
12+
trim_trailing_whitespace = false

.env.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
# API
3+
VITE_API_URL=
4+
5+
# App
6+
VITE_APP_TITLE=또랑

.eslintrc

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"root": true,
3+
"env": {
4+
"browser": true,
5+
"es2021": true
6+
},
7+
"extends": [
8+
"eslint:recommended",
9+
"plugin:@typescript-eslint/recommended",
10+
"plugin:react/recommended",
11+
"plugin:react/jsx-runtime",
12+
"plugin:react-hooks/recommended",
13+
"prettier"
14+
],
15+
"parser": "@typescript-eslint/parser",
16+
"parserOptions": {
17+
"ecmaVersion": "latest",
18+
"sourceType": "module",
19+
"ecmaFeatures": {
20+
"jsx": true
21+
}
22+
},
23+
"plugins": ["@typescript-eslint", "react", "react-hooks", "react-refresh", "check-file"],
24+
"settings": {
25+
"react": {
26+
"version": "detect"
27+
}
28+
},
29+
"rules": {
30+
"@typescript-eslint/no-unused-vars": "warn",
31+
"react/prop-types": "off",
32+
"no-console": "warn",
33+
"react-refresh/only-export-components": ["warn", { "allowConstantExport": true }],
34+
35+
"check-file/folder-naming-convention": [
36+
"error",
37+
{ "src/**/": "KEBAB_CASE" }
38+
],
39+
"check-file/filename-naming-convention": [
40+
"error",
41+
{
42+
"src/**/!(*main|*vite-env)*.tsx": "PASCAL_CASE",
43+
"src/**/!(*vite-env)*.ts": "CAMEL_CASE"
44+
},
45+
{ "ignoreMiddleExtensions": true }
46+
],
47+
48+
"@typescript-eslint/naming-convention": [
49+
"error",
50+
{
51+
"selector": "variable",
52+
"format": ["camelCase", "UPPER_CASE", "PascalCase"],
53+
"leadingUnderscore": "allow"
54+
},
55+
{
56+
"selector": "variable",
57+
"modifiers": ["const", "exported"],
58+
"types": ["function"],
59+
"format": ["camelCase", "PascalCase"]
60+
},
61+
{
62+
"selector": "function",
63+
"format": ["camelCase", "PascalCase"]
64+
},
65+
{
66+
"selector": "typeLike",
67+
"format": ["PascalCase"]
68+
},
69+
{
70+
"selector": "enumMember",
71+
"format": ["UPPER_CASE"]
72+
}
73+
]
74+
}
75+
}

.github/copilot-instructions.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Copilot 코드 리뷰 지침
2+
3+
## 언어
4+
5+
- 한글로 리뷰해주세요
6+
7+
## 네이밍 컨벤션
8+
9+
- 폴더명: `kebab-case`
10+
- 일반 파일(.ts): `camelCase`
11+
- 컴포넌트 파일(.tsx): `PascalCase`
12+
- 변수/함수명: `camelCase`
13+
- 상수명: `UPPER_SNAKE_CASE`
14+
- 컴포넌트명: `PascalCase`
15+
- 페이지 컴포넌트: `PascalCase + Page` (예: `MainPage`)
16+
17+
## Export 규칙
18+
19+
- 컴포넌트: `export default`
20+
- 유틸 함수: `named export`
21+
22+
## 코드 품질
23+
24+
- 불필요한 `console.log`가 있는지 확인해주세요
25+
- 사용하지 않는 import가 있는지 확인해주세요
26+
- TypeScript 타입이 `any`로 되어있는지 확인해주세요
27+
- 하드코딩된 값이 상수로 분리되어야 하는지 확인해주세요
28+
29+
## React
30+
31+
- 컴포넌트 props는 interface로 정의해주세요
32+
- useEffect 의존성 배열이 올바른지 확인해주세요
33+
- 불필요한 리렌더링이 발생할 수 있는 코드인지 확인해주세요
34+
35+
## 보안
36+
37+
- API 키나 민감한 정보가 하드코딩되어 있는지 확인해주세요
38+
- 환경변수는 `VITE_` 접두사를 사용해야 합니다

.github/workflows/ci.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: CI
2+
3+
on:
4+
pull_request:
5+
branches: [main, develop]
6+
7+
jobs:
8+
check:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Checkout
13+
uses: actions/checkout@v4
14+
15+
- name: Setup Node.js
16+
uses: actions/setup-node@v4
17+
with:
18+
node-version: 22
19+
cache: 'npm'
20+
21+
- name: Install dependencies
22+
run: npm ci
23+
24+
- name: Lint
25+
run: npm run lint
26+
27+
- name: Type check
28+
run: npm run type-check
29+
30+
- name: Build
31+
run: npm run build

.gitignore

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
pnpm-debug.log*
8+
lerna-debug.log*
9+
10+
node_modules
11+
dist
12+
bun.lock
13+
.env
14+
.env.local
15+
.env.*.local
16+
dist-ssr
17+
*.local
18+
19+
# Editor directories and files
20+
.vscode/*
21+
!.vscode/extensions.json
22+
!.vscode/settings.json
23+
.idea
24+
.DS_Store
25+
*.suo
26+
*.ntvs*
27+
*.njsproj
28+
*.sln
29+
*.sw?

.husky/commit-msg

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#!/bin/sh
2+
3+
commit_msg=$(cat "$1")
4+
first_line=$(echo "$commit_msg" | head -n 1)
5+
6+
# 허용된 타입
7+
allowed_types="feat|fix|docs|style|refactor|test|chore|design|ci|perf"
8+
9+
# 1. 타입 형식 체크 (type: 형식인지)
10+
if ! echo "$first_line" | grep -qE "^[a-zA-Z]+:"; then
11+
echo ""
12+
echo "❌ 커밋 메시지 형식이 올바르지 않습니다."
13+
echo ""
14+
echo "올바른 형식: type: 메시지 (#이슈번호)"
15+
echo "예시: feat: 로그인 기능 구현 (#123)"
16+
echo ""
17+
exit 1
18+
fi
19+
20+
# 2. 타입 추출
21+
type=$(echo "$first_line" | sed 's/:.*//')
22+
23+
# 3. 대문자 타입 체크
24+
if echo "$type" | grep -qE "[A-Z]"; then
25+
echo ""
26+
echo "❌ 커밋 타입은 소문자만 사용해야 합니다."
27+
echo ""
28+
echo "잘못된 예: Feat, FEAT, FIX"
29+
echo "올바른 예: feat, fix, docs"
30+
echo ""
31+
exit 1
32+
fi
33+
34+
# 4. 허용된 타입인지 체크
35+
if ! echo "$type" | grep -qE "^($allowed_types)$"; then
36+
echo ""
37+
echo "❌ '$type'은(는) 허용되지 않는 커밋 타입입니다."
38+
echo ""
39+
echo "허용된 타입:"
40+
echo " feat - 새로운 기능"
41+
echo " fix - 버그 수정"
42+
echo " docs - 문서 변경"
43+
echo " style - 코드 포맷팅 (로직 변경 없음)"
44+
echo " refactor - 리팩토링"
45+
echo " test - 테스트 추가/수정"
46+
echo " chore - 빌드, 설정 등 기타"
47+
echo " design - UI/UX 디자인 변경"
48+
echo " ci - CI/CD 관련 변경"
49+
echo " perf - 성능 개선"
50+
echo ""
51+
exit 1
52+
fi
53+
54+
# 5. 이슈 번호 체크
55+
if ! echo "$first_line" | grep -qE "\(#[0-9]+\)$"; then
56+
echo ""
57+
echo "❌ 커밋 메시지에 이슈 번호가 없습니다."
58+
echo ""
59+
echo "올바른 형식: type: 메시지 (#이슈번호)"
60+
echo "예시: feat: 로그인 기능 구현 (#123)"
61+
echo ""
62+
exit 1
63+
fi
64+
65+
# 6. 헤더 길이 체크 (100자)
66+
length=${#first_line}
67+
if [ "$length" -gt 100 ]; then
68+
echo ""
69+
echo "❌ 커밋 메시지가 너무 깁니다. (현재: ${length}자)"
70+
echo ""
71+
echo "커밋 헤더는 100자 이내로 작성해주세요."
72+
echo ""
73+
exit 1
74+
fi
75+
76+
exit 0

.husky/pre-commit

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
npx lint-staged

.husky/pre-push

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#!/bin/sh
2+
3+
branch=$(git rev-parse --abbrev-ref HEAD)
4+
5+
# main, develop 브랜치는 허용
6+
if [ "$branch" = "main" ] || [ "$branch" = "develop" ]; then
7+
exit 0
8+
fi
9+
10+
# 허용된 타입
11+
allowed_types="feat|fix|refactor|design|chore|docs"
12+
13+
# 1. 기본 형식 체크 (type/xxx 형식인지)
14+
if ! echo "$branch" | grep -qE "^[a-zA-Z]+/"; then
15+
echo ""
16+
echo "❌ 브랜치 이름 형식이 올바르지 않습니다."
17+
echo ""
18+
echo "올바른 형식: type/설명#이슈번호"
19+
echo "예시: feat/login#12, fix/button-click#34"
20+
echo ""
21+
exit 1
22+
fi
23+
24+
# 2. 타입 추출
25+
type=$(echo "$branch" | sed 's/\/.*//')
26+
27+
# 3. 대문자 체크
28+
if echo "$branch" | grep -qE "[A-Z]"; then
29+
echo ""
30+
echo "❌ 브랜치 이름은 소문자만 사용해야 합니다."
31+
echo ""
32+
echo "잘못된 예: Feat/login#12, feat/Login#12"
33+
echo "올바른 예: feat/login#12, fix/button#34"
34+
echo ""
35+
exit 1
36+
fi
37+
38+
# 4. 허용된 타입인지 체크
39+
if ! echo "$type" | grep -qE "^($allowed_types)$"; then
40+
echo ""
41+
echo "❌ '$type'은(는) 허용되지 않는 브랜치 타입입니다."
42+
echo ""
43+
echo "허용된 타입:"
44+
echo " feat - 새로운 기능"
45+
echo " fix - 버그 수정"
46+
echo " refactor - 리팩토링"
47+
echo " design - UI/UX 디자인 변경"
48+
echo " chore - 빌드, 설정 등 기타"
49+
echo " docs - 문서 작업"
50+
echo ""
51+
exit 1
52+
fi
53+
54+
# 5. 이슈 번호 체크 (끝에 #숫자)
55+
if ! echo "$branch" | grep -qE "#[0-9]+$"; then
56+
echo ""
57+
echo "❌ 브랜치 이름에 이슈 번호가 없습니다."
58+
echo ""
59+
echo "올바른 형식: type/설명#이슈번호"
60+
echo "예시: feat/login#12, fix/button-click#34"
61+
echo ""
62+
exit 1
63+
fi
64+
65+
# 6. 허용되지 않는 문자 체크
66+
if echo "$branch" | grep -qE "[^a-z0-9/#\-]"; then
67+
echo ""
68+
echo "❌ 브랜치 이름에 허용되지 않는 문자가 있습니다."
69+
echo ""
70+
echo "허용: 소문자(a-z), 숫자(0-9), 하이픈(-), 슬래시(/), 샵(#)"
71+
echo "예시: feat/user-login#12"
72+
echo ""
73+
exit 1
74+
fi
75+
76+
exit 0

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
22

0 commit comments

Comments
 (0)