프론트엔드 개발 표준 및 구조 설계 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
- React/Vite 기본 구조에서 확장
- 페이지, 도메인 단위로 분류
src/
├── App.tsx #리액트 라우터
├── App.css
├── index.css
├── main.tsx
├── vite-env.d.ts
├── api/ #도메인 별 API
│ ├── albums/ #앨범
│ ├── notification/ #알림
│ ├── pictures/ #사진
│ ├── user/ #사용자 관련 데이터 조회
│ ├── auth/ #로그인 및 인증
│ ├── config.js #상수 관리
│ └── apiClient.js #api Helper
├── assets/ #아이콘, 기본 이미지, 로고 등
│ ├── icons/ #아이콘
├── components/ #페이지 별 컴포넌트 분류
│ ├── Album/ #앨범페이지 하위 컴포넌트
│ ├── AlbumEditor/ #앨범에디터 하위 컴포넌트
│ ├── Main/ #메인페이지 하위 컴포넌트
│ ├── MyPage/ #마이페이지 하위 컴포넌트
│ └── common/ #공용 컴포넌트
├── hooks/
├── pages/ #페이지 컴포넌트
│ └── auth/ #Ouath 콜백 페이지
├── services/
├── stores/
├── package.json
├── tsconfig.json
├── vite.config.ts
├── tailwind.config.js
├── postcss.config.js
├── index.html
├── eslint.config.js
└── ...
-
main: Production에 배포되는 브랜치 -
dev: Develope 및 Test 브랜치 -
feature-
이슈종류에 따라 브랜치 경로 생성 후 작업
- 브랜치명 컨벤션:
feature/{이슈 번호}
- 브랜치명 컨벤션:
-
Pull Request (PR) 생성 후 Rebase Merge.
- PR 리뷰와 승인 필요
-
-
fix: 동일 -
!HOTFIX- 급한 이슈 발생 시 해당 브랜치 이용
- 브랜치명 컨벤션 :
!HOTFIX/{이슈 번호}
이슈 종류
| Issue Name | Description |
|---|---|
| Bug: Critical | 심각한 버그를 리포트 |
| Bug: Minor | 작동하지만 기대와 다른 경우 리포트 |
| BugFix | 버그 수정 |
| Chore | 빌드/환경 관련 작업 |
| Deploy | 배포 관련 작업 |
| Duplicate | 중복된 이슈 |
| Feature | 새로운 기능 개발 |
| Refactor | 코드 리팩토링 |
| Test | 테스트 관련 작업 |
# 기능 개발 시
feature/* -> dev -> main
# 급한 오류 해결
hotfix -> dev -> main
<Type>: <Commit Title>
| Types | 설명 |
|---|---|
feat |
새로운 기능 추가 |
fix |
버그 수정 |
design |
CSS 등 사용자 UI 디자인 변경 |
!BREAKING CHANGE |
커다란 API 변경의 경우 |
!HOTFIX |
치명적인 버그로 인한 긴급한 수정 |
style |
코드 포맷 변경, 세미콜론 누락 등 (코드 수정은 없는 경우) |
refactor |
프로덕션 코드 리팩토링 |
comment |
필요한 주석 추가 및 변경 |
docs |
문서 수정 |
test |
테스트 추가, 테스트 리팩토링 (프로덕션 코드 변경 X) |
setting |
패키지 설치, 개발 설정 관련 변경 |
chore |
빌드, 테스트 업데이트, 패키지 매니저 설정 (프로덕션 코드 변경 X) |
rename |
파일 혹은 폴더명을 수정하거나 옮기는 작업 |
remove |
파일을 삭제하는 작업만 수행한 경우 |
폴더명
- 소문자, camelCase 사용
파일명
- 라우팅 파일은 next.js의 기본 설정인
page.tsx,layout.tsx로 설정합니다. - 컴포넌트 파일 : PascalCase
- 기타 파일 : camelCase
- 커스텀 훅 파일 : use 접두사 사용
const Component =({props}) => {
return (
<>
{/* 컴포넌트 내용 */}
</>
);
}
export default Component;변수 및 함수
camelCase- boolean 변수는 is, has, should 접두사 사용
상수
-
SCREAMING_SNAKE_CASE사용
// 1. React 관련
import React from 'react';
import { useState, useEffect } from 'react';
// 2. 내부 컴포넌트
import Button from '@/components/ui/Button';
// 3. 커스텀 훅 & 서비스
import { useAuth } from '@/hooks/use-auth';
// 4. 외부 라이브러리
import axios from 'axios';
import exifr from 'exifr';
// 5. assetsconst Component = ({ prop1, prop2 }) => {
// 1. 상태 관리
const [state, setState] = useState();
// 2. 커스텀 훅
const { data, loading } = useCustomHook();
// 3. 이벤트 핸들러
const handleClick = () => {
// 핸들러 로직
};
// 4. useEffect
useEffect(() => {
// 부수 효과
}, []);
// 5. 조건부 렌더링
if (loading) return <Loading />;
// 6. JSX 반환
return (
<div>
{/* 컴포넌트 내용 */}
</div>
);
};/**
* 사용자 프로필을 표시하는 컴포넌트
* @param user - 사용자 정보 객체
* @param onEdit - 편집 버튼 클릭 시 호출되는 함수
*/
const UserProfile = ({ user, onEdit }: UserProfileProps) => {
// TODO: 프로필 이미지 업로드 기능 추가
return (
<div>
{/* 사용자 아바타 영역 */}
<Avatar src={user.avatar} />
</div>
);
};- ESLint 플러그인 eslint-plugin-tailwindcss에 따른 자동 정렬 사용
-
Vite 프로젝트 생성 시 초기 설정을 확장
-
Import (simple-import-sort ) 사용
-
"no-unused-vars": "on" 설정
-
예시 코드 (추후 변경 예정)
- 모바일 브라우져 기준으로 개발
- 기본 개발 화면 크기
- Width : 392px
- Height : 790px
- 기본 넓이 보다 커지는 경우 중앙에 배치한다.
- 기본 길이보다 커지는 경우 확장된다.
- 적응형 디자인을 일부 적용한다. (넓이값을 높이에 사용)
추가로 설정이 필요한 경우에는 다음과 같이 package.json 에 BrowserList를 적는 방법으로 명시합니다.
{
"browserslist": [
"chrome 64",
"edge 79",
"firefox 67",
"opera 51",
"safari 12"
]
}