-
Notifications
You must be signed in to change notification settings - Fork 8
Frontend Convention wiki
- 브랜치 종류
- main: 최종본만을 올리는 브랜치
- release: dev에서 큰 범주의 기능을 완성시키면 올려서 ci/cd에 올리는 브랜치
- dev: feature에서 구현한 브랜치를 통합하는 브랜치
- feature: 기능을 구현하는 브랜치
- feature 별로 브랜치 나눠놓습니다. 아래는 예시입니다.
- feature/myprofile/
- feature/teampage/
- …
- feature 별로 브랜치 나눠놓습니다. 아래는 예시입니다.
- hotfix: main에서 터진 급한 에러를 관리하는 브랜치
- 기능 명세 코드 사용
- [기능명세코드] 기능명세상depth2
- 예시) [D-MYPAGE-01~05] 프로필 이미지
- 이슈 란에 구현할 기능에 대해 자세히 정확하게 작성
- To-do list처럼 할일을 작성하고 끝날 때마다
- 프론트엔드와 백엔드 브랜치 구분
- 깃헙 액션 CI/CD 활용 예정
- 이슈 만들어서 fork된 브랜치로 브랜치 생성
- PR 날릴때 커밋로그가 같이 동봉된다.
[우린 Git-flow를 사용하고 있어요 | 우아한형제들 기술블로그](https://techblog.woowahan.com/2553/)
- Chat-gpt 이용 히나님 프롬프트 활용 [링크 참조
ex)
Feat: 커밋 명
(50자) Feat : 새로운 기능 추가 Fix : 버그 고침 Design : CSS 등 사용자 UI 디자인 변경 Hotfix : 급하게 치명적인 버그를 고쳐야 하는경우 Break : 커다란 API 변경의 경우 Style (+ Comment) : 코드 포맷 변경, 세미콜론 누락, 코드수정이 없는경우, 주석 관련 수정, 오타 수정 등 의미 없는 변경사항 포함 Refact: 프로덕션 코드 수정 Docs : 문서 수정, 파일 혹은 폴더명 수정과 이동, 삭제 Test : 테스트 추가, 테스트 리팩토링 Chore : 도커, 메이크 파일 등 빌드 태스크 업데이트
- 참조
- 기능 코드 prefix로 작성
- 코드리뷰는 추후 작성예정
-
Eslint
{ "extends": ["airbnb", "airbnb/hooks", "airbnb-typescript", "prettier"] }
- 기본적으로 airbnb의 코드 컨벤션을 적용합니다
airbnb eslint 룰은 여기: https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb/rules/react.js
-
Prettier
{ "singleQuote": true, "semi": false, "tabWidth": 2, "printWidth": 80, "trailingComma": "all", "arrowParens": "always" //화살표함수의 매개변수는 항상 괄호 추가 }
-
코드 작성 규칙
-
spread 연산자: ✅ → ex) 배열 복사시 사용
-
구조 분해 할당: ✅
-
React.FC: ❌ (최대한 배제)
-
변수 선언: let, const만
-
함수 선언: 화살표 함수 (=>)를 사용한다
-
필요한 부분만 주석 사용: 이슈를 최대한 사용해서 처리해보기
-
타입 정의
객체의 경우: 인터페이스 선언
interface Post { content: string questionId: number title: string answerCount: number category: string recommend: number view: number nickname: string createdAt: string }
일반 타입의 경우: Type 선언
type Category = null | 'ft_irc' | 'minishell' | 'minirt' | 'search'
-
변수는 최대한 위에 선언해놓는다.
-
같은 라이브러리에서 컴포넌트나 함수 등을 임포트 할경우, {}를 사용하여 임포트 한다.
import { Button, Container, FormControl, InputLabel, MenuItem, Select, SelectChangeEvent, TextField, } from '@mui/material'
- eslint와 prettier는 commit 하기전에 제대로 지켜졌는지 확인하기.
-
컴포넌트 네이밍
컴포넌트 이름은 PascalCase를 사용하여 작성합니다. 이름은 명사로 시작하며, 기능을 명확하게 설명해야 합니다.
예시)
UserProfile
,NavBar
,LoginButton
import React from 'react'; interface Props { text: string; onClick: () => void; } const LoginButton = ({ text, onClick }: Props) => ( <button onClick={onClick}> {text} </button> ); export default LoginButton;
컴포넌트 파일 이름은 해당 컴포넌트 이름과 동일하게 PascalCase를 사용하여 작성하며
.tsx
확장자를 사용해야 합니다. -
변수 및 함수 네이밍
컴포넌트를 제외한 변수 및 함수는 camelCase를 사용하여 작성합니다. 함수 이름은 동사를 포함하여 작성되어야 하며, 기능을 명확하게 설명해야 합니다. 변수 이름은 명사를 사용하여 작성되어야 합니다.
//함수 예시 const fetchData = async (): Promise<User[]> => { // 데이터를 가져오는 로직을 구현합니다. // 예: API 호출을 통한 데이터 불러오기 const response = await fetch('https://api.example.com/data'); return response.json() as Promise<User[]>; }; //변수 예시 const [data, setData] = useState<User[]>([]);
이벤트 핸들러 : 이벤트 핸들러는
handle
/on
/is
접두사 및 이벤트 이름(camelCase로 작성)을 사용해 작성해야 합니다.// 아래와 같이 이벤트 핸들러 함수는 handle과 같은 접두사를 붙여줍니다. const handleUserClick = (userId: number) => { setCurrentUserId(userId); }; // 아래와 같은 bool타입 변수는 is 접두사를 붙여줍니다. const [isLoading, setIsLoading] = useState<boolean>(true); if (isLoading) { return <div>Loading...</div>; }
-
인터페이스 및 타입
인터페이스와 타입 구분없이 PascalCase 사용.
인터페이스와 타입 둘 다 PascalCase를 사용하여 네이밍을 진행합니다. 이 방식은 명확하고 간결한 표현으로 작성할 수 있습니다.
- 인터페이스는 대문자
I
라는 접두사를 붙여서 더욱 명확하게 전달합니다.
interface IUser { id: number; name: string; } // interface 는 interface 디렉토리 안 기능별 디렉토리 작성되며 파일명은 interface.ts 입니다. // - 는 디렉토리 -- 는 파일 // - interface // -Login // --interface.ts // -Main // --inteface.ts // -Detail // --interface.ts
- 타입은 대문자
T
라는 접두사를 붙여서 더욱 명확하게 전달합니다.
type TCategory = null | 'ft_irc' | 'minishell' | 'minirt' | 'search' // type 디렉토리 구조도 interface와 동일합니다. 위 예시를 참고해주세요.
- 인터페이스는 대문자
-
폴더 네이밍
- app 폴더 안에 들어가는 폴더에 대해서는 명사만 사용한다.
- 즉 라우팅 되는 폴더는 간단 명료하게 작성하고, 카멜케이스로 작성한다.
-
라우팅 폴더 안 디렉토리는 [id] 라고 네이밍 한다.
(ex 카카오 예시)
- app
- pages.tsx
- /panel
- 기능별로 분리된 component들…
- hooks
- 공통적으로 쓰이는 hook 정의
- component
- 공통적으로 쓰이는 component 정의
- types
- 인터페이스, 타입 파일
- styles (optional)
- theme (optional)
- asset(optional)
(기획 회의 거쳐서 작성)
- FLUX 패턴 이용
기술 별 버전, 패키지 등을 정할 수 있는 만큼 정해주세요
- React, Next.js 13
- Zustand
- MUI
- 필요하면 커스텀으로!
- 테마 사용
-
axios
-
useForm
-
useSWR
-
개발하면서 추가