🏗️file & folder style
Naming
기본 파일 이름 규칙
모든 파일의 네이밍은 기본적으로 kebab-case 로 작성합니다. 가장 가독성이 좋습니다.
React 관련 파일 이름 규칙
단, react 와 관련 있는 파일은 해당 변수의 네이밍 규칙을 따라갑니다.
코드 분리
파일을 폴더로 변경하기
코드가 길어지면 코드 분리가 필요합니다. 코드 분리시, index 파일과, 본문 파일과 함께 폴더구조로 변경합니다.
Q1.왜 index 파일을 생성하나요?
Index 파일은 자바스크립트와, 사람 둘 모두에게 진입점(우선탐색할 파일)임을 명시적으로 알려줍니다
Q2. index 파일에 본문을 작성하지 않고 따로 파일을 하나 더 두는 이유는 무엇인가요?
파일 검색시 index 파일은 이름이 겹쳐 찾기가 어렵기 때문입니다.
일관된 Sub-Folder 로 관리하기
분리할 파일을 서브폴더로 분류해서 분리합니다.
서브폴더 분류는 일반적으로 src 폴더에서 사용하는 폴더(constants, types, utils, hooks, components, context....)로 구분을 권장합니다.
하위 폴더의 파일하나의 구현사항이 길어진다면 해당 파일 역시 폴더로 변환 후 하위 폴더를 가질 수 있습니다.
depth 가 너무 깊어져서 폴더 구조 파악하기가 너무 힘들어요
하위 컴포넌트(코드)를 너무 많이 가지고 있는 구조라면, 결합도가 높진 않은지 고민해보세요.
자식을 갖기보단 컴포넌트 합성으로, 결합도를 낮추고 더 유연한 컴포넌트를 만들어 보세요.
전역적으로 사용되는 파일은 공용(최상단) 폴더로 분리하기
만약 여러 파일에서 사용되는 코드가 있고, 그 범위가 하위코드에만 국한되지 않는다면 최상단 레벨로 파일 분리를 고려해 보세요.
예를들어 PostCard 컴포넌트에서 사용되는 format-date 같은 함수는 최상단 utils 폴더가 더욱 적합합니다.
파일 관리
@ 태그로 하나의 주제로 폴더를 묶기
sub 폴더가 하위 모듈을 관리하는 방법이라면 @ 폴더는 연관된 모듈을 방법입니다.
코드분리를 위한 폴더는 하위 모듈을 포함한 하나의 모듈입니다. 반면, @ 폴더는 모듈의 집합입니다. 모듈의 집합임을 명시적으로 알 수 있게 폴더 앞에 @ 태그를 붙여주세요.
폴더 구조: Pages
SEO 에 유리한 url 설계하기
Next.js는 pages 폴더 내에 파일 구조로 url을 생성합니다. url 은 seo 에 영향이 있기 때문에, seo 에 유리한 url 을 만드는것이 중요합니다. pages 폴더로 페이지 경로를 설정할때, 아래사항을 유의해 주세요
kebab case 사용
명확한 의미의 문자 사용 및 특수문자 사용 금지
계층 관계 나타내기
폴더 구조: Containers
pages 폴더와 1:1 구조로 생성하기
next-init에서 사용하는 pages 폴더와 1:1 대응하는 컴포넌트 폴더입니다.
각 페이지에 들어 갈 React 컴포넌트의 최상단 파일들을 모아놓으며 Components 폴더와 동일한 규칙을 지닙니다.
자세한 컨벤션은 Components 문서를 참고해주세요.
왜 containers 은 components 폴더와 같은 규칙인데 따로 관리되나요? pages 의 폴더구조는 routing 과 직결됩니다. pages 폴더에서 하위폴더로 컴포넌트를 분리하면 그 파일 자체가 route 할 수 있는 하나의 url 이 되기 때문에, container 는 코드 구현을, pages 는 routing 으로 역할을 분담합니다.
폴더 구조: Apis
스웨거 태그 기준으로 폴더 생성하기
swggger tag 란? api 경로를 그룹화 한 것 입니다. 아래 사진에선 estimate 에 해당합니다.
swagger 문서와 구조를 동일하게 가져감으로써 팀원들이 코드를 찾기 더욱 수월하게 해보세요
dto 폴더와 model 폴더를 활용하기
api 를 정의할땐 type 선언이 필수적입니다. 특히 응답값 같은 경우는 json 을 parse 하는 과정에서 any 타입으로 변하기 때문에, 더욱더 정확한 타입이 요구되는데요. api 관련 타입을 정의할 땐 dto 와 model 폴더를 활용해서 타입을 정의해주세요.
dto, model 이 뭔가요?
dto 는 Data Transfer Object 의 약자로, 통신을 위한 데이터 객체를 의미합니다. 보일러 플레이트에선 요청 타입에 해당합니다.
model 은 프론트 코드에서 서버의 데이터 구조를 표현하기 위한 타입 명명이며, 보일러 플레이트에선 주로 응답 타입에 해당합니다.
React Query Hook 을 api 파일과 같은 폴더에 포함하기
react query 는 일반적으로 네트워크 요청시에 사용하므로 hook 이지만 apis 폴더에서 관리합니다. 데이터를 가져오는 역할인 useQuery
를 사용하는 경우는 .query
로, useMutation
을 사용하는경우는 .mutation
으로 구분해 주세요
gen:source 사용하기
똑똑한 개발자 보일러 플레이트에서 yarn run gen:source
스크립트로 컨벤션에 맞춰진 api 코드 탬플릿을 생성할 수 있습니다.
gen:api 사용하기
똑똑한 개발자 보일러 플레이트에서 yarn run gen:api
스크립트로 swagger 의 json 을 기반으로 바로 사용가능한 api 코드를 생성할 수 있습니다.
폴더 구조: utils
되도록 최상단 utils 폴더는 함수 하나당 하나의 파일을 갖도록 해주세요
전역 레벨에서 사용되는 함수는 재사용성과, 팀원들이 사용할 가능성이 높은 함수입니다. 어떤 함수들이 정의 되었는지 한눈에 확인 할 수 있도록 한 함수당 한 파일을 권장합니다.
폴더 구조: types
되도록 최상단 types 폴더는 타입 하나당 하나의 파일을 갖도록 해주세요
전역 레벨에서 사용되는 타입은 재사용성과, 팀원들이 사용할 가능성이 높은 함수입니다. 어떤 타입들이 정의 되었는지 한눈에 확인 할 수 있도록 한 함수당 한 타입을 권장합니다.
폴더 구조: test code
테스트 코드는 __test__ 폴더에서 작성해주세요
소스 파일과 분리해주세요
테스트 코드 파일은 확장자 전에 .test 를 포함해주세요
jest 가 파일 이름을 기준으로 테스트 코드를 인식할 수 있습니다.
Last updated