🏅 프로젝트 목표
- 챌린지보다는 완성도 높게
- 신기술도전에 의해서 오버하지만 않았으면!!
- 휘식님은 도전하는것도 조아~.~ 너무 죠아~~
- 라이브러리 + 디자인 시스템 + tailwind (+ 각자 생각하는 페이지 모습을 피그잼or와이어프레임 도구에 기록은 해두자!)
- 테스트 jest?
- 애자일하게 진행하자
- 버전관리를 진행하자! (기록으로 남기기!)
🤔 결정권자 & 담당
PM | 백윤서 |
디자인 | 박종운 |
기술 스택 | 문휘식 |
백엔드 협업 | 모유경 |
MC | 안범 |
기록, 문서화 | 다같이 |
🤙🏻 개발 규칙
브랜치 전략
main ← dev ←
[prefix]#이슈번호
prefix 목록
init | 프로젝트 생성 및 초기 설정 |
feat | 새로운 기능 추가 |
style | 디자인(css, 레이아웃)추가, 변경 |
fix | 버그, 오류 수정 및 변경된 기능 수정 |
hotfix | 급하게 치명적인 버그를 고쳐야하는 경우 |
refactor | 기능의 변화가 아닌 코드 리팩터링 ex) 변수 이름 변경, 최적화, 가독성 개선, 중복 최소화, 컴포넌트 분리 등 |
cleanup | 콘솔 로그 및 주석 삭제, 파일 삭제, 불필요한 함수 삭제, 코드 위치 변경 |
merge | pull 과정 중 현재 commit과 자동병합이 일어날때 필수적으로 적어줘야하는 commit에 적어줌 |
chore | 패키지 매니저 업데이트, 빌드 관련 ex) .gitignore, package.json 관련 |
test | 테스트 코드 추가, 수정 |
docs | README 수정 |
이슈/PR 컨벤션
- 이슈 제목:
[prefix] 작업내용 요약
// 이슈 컨벤션 깃허브에 저장할 컨벤션 # 📌 작업 내용 - task 1
- PR 제목: 이슈 제목과 같음(
[prefix] 작업내용 요약
)
// PR 컨벤션 # 📌 작업 내용 // 구현 내용 및 작업 했던 내역, 사진필요한 경우 선택적으로 첨부 - [x] 작업 내용 # 🚦 특이 사항 //주의깊게 봐야하는 PR 포인트 & 말하고 싶은 점
디렉토리 구조 (추후 결정)
- eslint로 import 순서 설정 → 디렉토리 구조 설정할 때 같이 얘기!!
components hooks constants types utils
- 컴포넌트 →
컴포넌트 이름.tsx
- 타입 →
컴포넌트 이름.types.ts
- 스타일 →
컴포넌트 이름.styles.ts
├── app │ └── _common │ ├── components │ ├── hooks │ ├── constants │ ├── types │ └── utils │ ├── api │ └── main │ ├── page.tsx │ ├── _component │ ├── _util │ ├── _type │ └── _api └── public
개발 컨벤션
- 줄임말은 쓰지않는걸로!
1. 함수 export 방식 선언 후 export
컴포넌트를 제외한 함수 선언 방식은
const
를 사용합니다.vscode 단축키
tsrfce
function Component() { ... } export default Component;
- tsx를 반환한다면 확장자 이름을 .tsx를 사용합니다.
- ASI를 이용하지 않고 세미콜론을 필수적으로 써줍니다. (prettier로 관리).
- 리터럴 값은 상수로 만들어서 사용합니다. 상수는 스네이크 케이스(ex.
BASE_URL
)를 사용합니다.
- 변수명은 camelCase로 작성합니다.
- .tsx 파일의 파일(폴더)명은 PascalCase를 사용합니다. ex) LoginPage.tsx.
- alias를 이용해서 파일 절대 경로로 import, export 사용합니다. src: @, test: #
- export 할때 barrel export 방식을 사용하지 않습니다.
- 타입을 분리할 경우(여러 곳에서 타입이 생성될 경우(2군데 이상))
types
디렉토리에 관리한다.
- 최대한 코드에 대한 설명 주석은 적지 않습니다. 이름만 읽어도 무슨 일을 하는 함수인지 알 수 있어야합니다.
11. 이벤트 핸들러를 정의할때 handle + 메서드명
로 정의합니다.
on
접두사가 붙은 경우, 이 Prop에 실제 이벤트가 연결되어 있다는 걸 뜻하고,handle
접두사가 붙은 경우, 이벤트가 발생했을 때 호출되는 실제 Function을 의미합니다.function DateTypeToggleButton ({ onClick }) { return <button onClick={onClick} /> } function ModalButton ({ onClick }) { return <button onClick={onClick} /> } function Calendar () { const handleClickDateType = () => {} const handleModalOpen = () => {} /* 주의!! 컴포넌트의 props로 핸들러를 넘길때도 handle 접두사를 사용해야 합니다. */ return ( <> <DateTypeToggleButton onClick={handleClickDateType} /> <ModalButton onClick={handleModalOpen} /> </> ) }
12. 컴포넌트 props
지정 방식
interface CommentListItemProps{...} const CommentListItem = (props: CommentListItemProps) => { const { id, author, loginId, createdAt, comment, isMyComment } = props; }
((논의 사항))
- image, svg는 카멜 사용하여 네이밍합니다.(ex. eraseCheck.svg). - 확인 후 결정
프리티어 설정
module.exports = { printWidth: 80, // 한 줄 최대 문자 수 tabWidth: 2, // 들여쓰기 시, 탭 너비 (js 표준인 2 indent를 권장함) useTabs: false, // 스페이스 대신 탭 사용 semi: true, // 문장 끝 세미콜론 사용 singleQuote: false, // 작은 따옴표 사용 trailingComma: "all", // 꼬리 콤마 사용 bracketSpacing: true, // 중괄호 내에 공백 사용 arrowParens: "avoid", // 화살표 함수 단일 인자 시, 괄호 생략 proseWrap: "preserve", // 마크다운(ex.readme.md) 포매팅 제외 endOfLine: "auto", // 개행문자 유지 (혼합일 경우, 첫 줄 개행문자로 통일) jsxSingleQuote: false, // JSX에 single Quotation 사용 여부 plugins: ["prettier-plugin-tailwindcss"] // tailwindcss 정렬 };