ᛓ Git Flow

main : 제품으로 출시될 수 있는 브랜치
develop : 다음 출시 버전을 개발하는 브랜치
feature : 기능을 개발하는 브랜치
release : 이번 출시 버전을 준비하는 브랜치
hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치

브랜치 전략
1. upstream - origin - local
2. 이슈 단위 브랜치
- feature/iOS/#2_기능명
- feature/FE/#2_기능명
- feature/BE/#2_기능명

머지 전략
1. feature -> develop: squash & merge
2. Merge시 branch 삭제 

PR 템플릿

Untitled

# :eyes: What is this PR?

# :pencil: Changes

## :pushpin: Related issue(s)

## :camera: Attachment(optional)

🍓FE

⭐️ Prettier

{
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "jsxSingleQuote": true,
  "trailingComma": "all",
  "printWidth": 120,
  "arrowParens": "always",
  "endOfLine": "auto",
  "bracketSameLine": false,
	"bracketSpacing": true,
  "plugins": ["@trivago/prettier-plugin-sort-imports"],
  "pluginSearchDirs": false,
	// import order 나중에 수정
  "importOrder": [
    "^react",
    "^@[^/]+/(.*)$",
    "<THIRD_PARTY_MODULES>",
    "^@/components/(.*)$",
    "^@/providers/(.*)$",
    "^@/assets/(.*)$",
    "^@/styles/(.*)$",
    "^@/types/(.*)$",
    "^@/hooks/(.*)$",
    "^@/apis/(.*)$",
    "^@/libs/(.*)$",
    "^@/utils/(.*)$",
    "^~"
  ],
  "importOrderSortSpecifiers": true
}

⭐️ Eslint

module.exports = {
  env: {
    browser: true,
    node: true,
    es2021: true,
  },
  parser: '@typescript-eslint/parser',
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:import/recommended',
    'plugin:import/typescript',
    'plugin:prettier/recommended',
    'plugin:@typescript-eslint/recommended',
    'eslint-config-prettier',
  ],
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    project: './tsconfig.json',
    tsconfigRootDir: __dirname,
    ecmaFeatures: {
      jsx: true,
    },
  },
  plugins: ['react', '@typescript-eslint', 'react-hooks', 'import', 'prettier'],
  rules: {
		"no-var": "warn",
    'no-unused-vars': 'off',
    'no-console': 'off',
    'import/prefer-default-export': 'off',
    'react/prop-types': 'off',
    'react/jsx-filename-extension': ['warn', { extensions: ['js', 'jsx', '.ts', '.tsx'] }],
    'react/jsx-props-no-spreading': ['warn', { custom: 'ignore' }],
    'react/react-in-jsx-scope': 'off',
    'react/jsx-uses-react': 'off',
    'react-hooks/exhaustive-deps': 'warn',
    '@typescript-eslint/no-unused-vars': 'warn',
    '@typescript-eslint/no-empty-interface': 'off',
    '@typescript-eslint/no-explicit-any': 'off',
    '@typescript-eslint/no-var-requires': 'off',
    'import/no-unresolved': 'off',
  },
  settings: {
    react: {
      version: 'detect',
    },
    'import/resolver': {
      node: {
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      },
    },
    'prettier/prettier': [
      'error',
      {
        endOfLine: 'auto',
      },
    ],
  },
  ignorePatterns: ['build', 'dist', 'public', 'node_modules/'],
};

⭐️ Commit Convention

- feat: 새로운 기능 추가
- fix: 버그를 고친 경우
- design: css등 사용자 UI 디자인 변경
- !breaking change: 커다란 API 변경
- !hotfix: 급하게 치명적인 버그를 고쳐야하는 경우
- style: 코드 포맷 변경, 세미 콜론 누락, 코드 수정이 없는 경우
- refactor: 코드 리팩토링
- comment: 주석 추가 및 변경
- docs: 문서 수정
- test: 테스트 추가, 테스트 리팩토링
- chore: 빌드 테스트 업데이트, 패키지 매니저 설정, 이외의 자잘한것들
- rename: 파일 혹은 폴더명 수정
- remove: 파일을 삭제하는 경우만 수행한 경우