Feature based structure vs. Screen based structure. 프로젝트를 시작하면 초기에 디렉토리 구조를 어떤 기준으로 설계해야 할지 고민하게 된다. Feature 중심의 구조와 화면 UI 기준의 구조가 무엇이고, 어떤 상황에 무엇이 적합한지 고민해보았다.
— 13 min read
소프트웨어 개발에 앞서, 아키텍처 설계를 하고 Framework 를 선정하는 작업 이후에는 프로젝트 디렉토리 구조를 어떤 기준으로 구성할지 고민해야 할 것이다.
디렉토리 구조는 아키텍처 설계 또는 프레임워크에 따라 구조가 정해지게 되는데, 이번 블로그 프로젝트에서는 Gatsby 를 사용하기 때문에 이에 맞는 디렉토리 구조가 설계 되어야 할 것이다.
우선 Gatsby 기반의 프로젝트에서 구성해야 하는 기본적인 디렉토리 구조를 살펴본 후, 이번 글의 주제인 화면을 구성하는 React Component 파일 디렉토리 구조를 Feature-based 로 할지 Screen-based 로 한지 에 대한 고민을 해보도록 하자.
사실 Gatsby 기반이라고 해서 정해진 디렉토리 구조가 있는 것은 아니다.
Gatsby 프레임워크를 기반인 경우, 설정(/gatsby-config.ts
)이나, 빌드(/gatsby-node.ts
, /gatsby-browser.ts
등 )를 위한 파일들은 프로젝트 최상위 디렉토리에 위치하는 것 이외에, 별도로 고려해야 할 것은 거의 없다.
Gatsby 가 Default 로 참조하는 폴더가 몇가지 있으며, 이는 아래와 같다.
├── src
| ├── pages // 1. 페이지 폴더로 향후 Markup 으로 변환
| | ├── 404.tsx
| | ├── index.tsx
| | └── ...
|
├── static // 2. JS, CSS, 이미지 등 static 파일
| └── ...
|
├── gatsby.config.ts // 3. Gatsby 설정파일로 Plugin 을 추가
├── gatsby.node.ts // 4. Gatsby 에서 Build 하는 과정에 필요한 로직 추가
├── gatsby.browser.ts // 5. 전역에 필요한 CSS, JS 등을 Import
├── package.json
└── ...
우선 TypeScript 로 작성되었기 때문에 확장자는 *.ts
와 *.tsx
(React JSX Element 를 포함한 파일) 로 되어 있고, 위의 폴더 구조에서 TypeScript 설정이나 Lint 관련된 파일을 다른 프로젝트에서도 많이 볼 수 있으므로 따로 표기하지 않았다.
/src/pages
: 이 디렉토리에 있는 *.jsx
, *.tsx
파일은 Static Markup 파일로 변환되어 웹페이지 링크로 접속 가능해 진다. 이 중 404.tsx
파일은 페이지 링크에 없는 접속일 경우 보여지는 Exception 페이지로 자동 설정 된다.
/static
: JS, CSS, 이미지 등 static 파일들을 넣을 수 있는 디렉토리이며, 파일 경로는 그대로 웹페이지에서 접속이 가능하다. /src
디렉토리 안에 있는 tsx 파일에서도 import 가능하며, 자동으로 minified & compressed 되게 된다.
/gatsby.config.ts
: Gatsby 설정 파일이며, 적용하고자 하는 Plugin을 추가할때 이 파일에 작성해야 한다.
/gatsby.browser.ts
: Markup 으로 랜더링될 때 전역에 필요한 font 파일이나 CSS, JS 를 import 하는데 사용된다.
/gatsby.node.ts
: Gatsby 가 Build 하는 과정에 필요한 작업을 수행하도록 한다. GraphQL 로 접근하는 데이터 스키마를 새로 구성하거나 데이터를 입력하는 작업과, MDX 파일을 Markup 으로 만들기 위한 작업을 하도록 개발하는 파일로, Gatsby API 를 사용하여 로직을 구현하게 된다.