컴포넌트별 역할이 분명하게 분리되고 한 페이지에 컴포넌트는 하나만 정의되도록 만들기 위한 React Native 폴더 구조 프로젝트입니다.
Nuxtjs 프로젝트의 기본 구조를 일부 참조하였으며, 웹 개발 당시의 경험을 살려 주로 이용하던 폴더 구조를 정리했습니다.
- src: 환경 설정 외 모든 컴포넌트와 어플리케이션 로직들이 정리되는 폴더 구조입니다.
- pages: screen 파일들이 정의되는 폴더입니다.
- directory_name:
pages
의 하위 디렉토리 이름은route
의 이름과 동일합니다.- index.js(jsx|ts|tsx): 폴더 내부의 컴포넌트 정의 파일은 무조건
index
로 통일합니다. - style.js:
index.js
에 적용할 StyleSheet를 정의하는 파일입니다. - .components:
index.js
에 의존적인 컴포넌트들을 정의합니다. 이 디렉토리 안에 있는 컴포넌트는index.js
에만 사용 되어야하며, API 의존성을 허락합니다. - child_directory:
directory_name
내부의 하위 라우트 이름과 동일합니다. 만약Home
하위에MyPage
가 있다면 디렉토리 구조는pages/home/my-page
로 구성합니다.- 위 구조를 계속해서 반복합니다.
- index.js(jsx|ts|tsx): 폴더 내부의 컴포넌트 정의 파일은 무조건
- directory_name:
- components: 전역에서 사용되는 컴포넌트입니다. API 의존성이 절대로 허가되지 않으며, 모든 페이지에서 동일한 모습이 보여지며 역할이 동일해야 합니다.
- plugins: 전역에서 사용할
plugin
들을 정의해둔 파일입니다.App.js
에서import
하는 과정만으로 모든 세팅이 끝나도록 구현해야 합니다. - App.js: 모든 스크린의 진입점입니다. 전역 플러그인
import
,store
설정,Navigation
정의를 해당 파일에서 진행합니다. - routes: 모든 네비게이션이 정의되는 폴더입니다.
- pages 폴더와 동일한 구조를 가져갑니다. (다만, Navigation에 관한 정의만 해야합니다.)
- pages: screen 파일들이 정의되는 폴더입니다.
막상 사용해보니 실제로 소프트웨어를 개발할 때 페이지 당 한 개의 컴포넌트만을 선언하니까 파일 하나에 부여되는 복잡성이 줄어들긴 했습니다.
하지만 React의 장점 중 하나인 Stateless Component마저 별도의 파일에 선언해야 하는 점이 단점으로 다가왔습니다.
애초에 Vue의 구조를 살리고자 사용한 디렉토리 구조라서 Stateless Component도 별도의 파일로 작성하는 것을 전제로 만들긴 했지만 많은 사람들이 React의 장점으로 꼽는 컴포넌트 정의의 간편함이 퇴색되는 구조라고 생각되었습니다.
Stateless Component
의 경우는 한 페이지에 약식으로 선언해도 상관이 없을 듯 합니다.typescript
를 반영한다면component
의props
를type
으로 정의하여export
하면 더 쉽게 사용이 가능할 듯 합니다.