Git & GitHub
Commit message
type | 설명 |
init | 프로젝트 초기 설정 |
feat | 새로운 기능 추가 |
fix | 버그 수정, 단순 파일 수정
코드 포맷팅, 오탈자 수정 |
refactor | 리팩토링 진행 |
style | CSS등 UI 디자인 수정 |
chore | 추가 의존성 설치, 문서 수정 |
remove | 파일 삭제 |
# <타입>: #0 <제목> # ------------------ # 제목은 최대 50 글자까지만 입력 # 본문은 한 줄에 최대 72 글자까지만 입력 # # 타입은 영어로 작성하고 제목과 본문은 한글로 작성한다. # 제목 끝에 마침표(.) 금지 # 제목과 본문을 한 줄 띄워 분리하기 # 본문은 "어떻게" 보다 "무엇을", "왜"를 설명한다. # 본문에 여러줄의 메시지를 작성할 땐 "-"로 구분 # 관련된 이슈번호는 제목 맨 뒤에 추가한다. ex. (#1) # ------------------
feat: #1 회원가입 페이지 제작 - 회원가입 페이지 라우팅 처리 - Axios 사용으로 데이터 전송 확인 완료
Branch
main > dev > feature/#00-working/name (기능 단위)
타입/기능 (kebab-case) 형식으로 작성 -
refactor/#01-login-page/name
Branch 운영 규칙
브랜치는 merge된 이후 삭제
19시 이후에는 PR 금지
19시 이전 PR은 24시까지 코드리뷰 완료하기
merge는 익일 09시 진행
Code Naming
종류 | 형식 | 예시 |
상수 | UPPER, snack_case | API_KEY |
함수 | 동사, 명확한 네이밍, camelCase | fetchPostData |
파일 | .tsx, 명확한 네이밍, PascalCase | LoginPage |
컴포넌트 | PascalCase | Input |
type, interface | PascalCase | Users |
hooks | use__형식, camelCase | useAxios |
utils | camelCase | validatePassword |
API | camelCase | getPostList |
Code Style
규칙 | 비고 |
약어 사용 금지 | const btn → const button |
커밋 파일 내 주석, console 금지 | console 및 //, /* */ 삭제 요망 |
함수 표현식 (화살표 함수) 우선 사용 | 함수 선언식은 this 바인딩이 필요할 경우 사용 |
배열의 이름은 반드시 ___Array 형태로 명시적 사용 | chat, chats, chatList → chatArray |
boolean값은 is___ 형태로 명시적 사용 | isCompleted |
var 사용 금지, let보다 const를 권장 | 값이 변하지 않으면 const만 사용할 것 |
const는 let보다 상단에 위치 | const constantName = 0;
let variableName = 0; |
비동기 처리는 async await 사용 | const promise = new Promise().then().then() →
const fetchData = async (url) ⇒ { … } |
문자열 조합은 템플릿 리터럴 작성 | return ` 문자열: ${stringABC} ` |
전역 상수는 src/constants/index.ts 파일에서 관리 | ㅤ |
타입스크립트는 interface를 기본으로 사용한다. | 모든 타입은 types 폴더에서 별도 관리 |
css단위는 rem단위를 기본으로 적용 | ㅤ |
src 경로는 @로 단축한다. | import Header from @/components/Header |
내부 정의 이벤트는 handle__,
props로 전달 받은 이벤트는 on___형식으로 작성한다. | handleClick과 onClick 두 가지를 구분하기 위함 |
블록 구문 내 한 줄 코드 역시 중괄호로 묶어준다. | if (true) {
return 1;
} |
객체 프로퍼티는 Destructuring로 접근한다. | const {name, age} = userData |
return문은 메인코드 한 줄 아래 작성,
또한 early return을 권장함. | 코드 길이로 인한 가독성 측면에서 if-else문 사용 예정 시 팀원 간 공유할 것 |
초기 환경 설정
ESLint
module.exports = { root: true, env: { browser: true, es2020: true, node: true }, extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:prettier/recommended', ], ignorePatterns: ['dist', '.eslintrc.cjs', 'vite.config.ts'], parser: '@typescript-eslint/parser', plugins: ['react', 'prettier', '@typescript-eslint', "import", "unused-imports"], rules: { 'no-console': 'error', 'no-var': 'error', 'prefer-template': 'error', 'arrow-spacing': 'error', 'no-duplicate-imports': 'error', 'dot-notation': 'error', 'no-useless-concat': 'error', 'react/react-in-jsx-scope': 'off', 'react/function-component-definition': [ 'error', { namedComponents: 'arrow-function', unnamedComponents: 'arrow-function', }, ], '@typescript-eslint/naming-convention': [ 'error', { format: ['camelCase', 'UPPER_CASE', 'PascalCase'], selector: 'variable', leadingUnderscore: 'allow', }, { format: ['camelCase', 'PascalCase'], selector: 'function', }, { format: ['PascalCase'], selector: 'interface', }, { format: ['PascalCase'], selector: 'typeAlias', }, ], "import/order": [ "warn", { groups: [ "index", "sibling", "parent", "internal", "external", "builtin", "object", "type", ], }, ], "unused-imports/no-unused-imports": "error", "import/newline-after-import": ["error", { count: 1 }], "padding-line-between-statements": [ "error", { blankLine: "always", prev: "const", next: "return" }, ], }, }; // npm i -D eslint-plugin-react // npm i -D eslint-plugin-import eslint-plugin-unused-imports /* "no-unused-vars": "error", // 미사용 변수 금지 "react/jsx-key": "error", // 반복문 내 key값 강제화 */
Prettier
{ "singleQuote": true, "trailingComma": "all", "endOfLine": "auto", "bracketSameLine": true, "semi": true, "arrowParens": "always", "vueIndentScriptAndStyle": false, "jsxSingleQuote": true, "quoteProps": "as-needed", "embeddedLanguageFormatting" : "auto", }
tsconfig
// ... /* Linting */ "baseUrl": "./", "paths": { "@/*": ["src/*"] }
vite config
import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; // <https://vitejs.dev/config/> export default defineConfig({ plugins: [react(), tsconfigPaths()], }); // npm i -D @types/node vite-tsconfig-paths