튜토리얼을 통해 배우는 Node.js 프로젝트 구조

튜토리얼을 통해 배우는 Node.js 프로젝트 구조

Jun 10, 2018    

Node.js 프로젝트 구조는 java 웹 프로젝트처럼 정형화된 사례가 없는 것 같아 BP사례를 찾아보다 아래 글을 발견해 번역했다.

원문: Node Hero - Node.js Project Structure Tutorial

Node.js 프로젝트 구조의 다섯가지 규칙

1. 파일은 역할이 아닌 기능별로 구성한다.

아래와 같은 구조를 가진 프로젝트가 있다고 가정해보자.

// Bad
 .
 ├controllers
 │ ├product.js
 │ └user.js
 ├model
 │ ├product.js
 │ └user.js
 ├view
 │ ├product.ejs
 │ └user.ejs
 ...

이런 접근은 다음과 같은 문제를 야기한다.

  • ‘product’ 페이지가 동작하는 방식을 이해하기 위해, 세 건의 디렉토리를 번갈아가며 열어봐야 한다.
  • 모듈을 불러와야 할 때 require('../../controllers/user.js')와 같이 긴 경로를 입력해야 한다.

이런 문제를 피하기 위해, 기능별로 파일을 그룹화해서 관리하면 훨씬 이해하기 쉬워진다.

// Good
 .
 ├product
 │ ├index.js
 │ ├product.js
 │ └product.ejs
 ├user
 │ ├index.js
 │ ├user.js
 │ └user.ejs
 ...

2. index.js 파일 안에 로직 구현은 지양한다.

아래 코드처럼 기능을 export하는 용도로 사용한다.

// product/index.js
var product = require('./product')

module.exports = {
  create: product.create
}

3. test 코드는 구현 코드 옆에 위치한다.

테스트는 단지 모듈들이 기대하는 결과를 출력하는지 확인하는 도구가 아니라 모듈을 문서화하는 파일 중 하나이다. 이런 이유로 테스트 코드는 구현 코드 옆에 위치하는 것이 바람직하다.
* 역자 주: 아래 구조를 보면 user.spec.js라고 테스크 코드를 표현했는데, 기능을 명세(Specification)하는 의미로 spec을 붙인 것 같다.

추가적인 테스트 코드가 필요한 경우, 별도의 test 디렉토리를 생성해서 관리한다.

 .
 ├test
 │ ├setup.spec.js
 │ └extra.spec.js
 ├product
 │ ├index.js
 │ ├product.js
 │ ├product.spec.js
 │ └product.ejs
 ├user
 │ ├index.js
 │ ├user.js
 │ ├user.spec.js
 │ └user.ejs
 ...

4. config 디렉토리를 이용한다.

프로젝트 구성정보를 관리하기 위해, config 디렉토리를 생성해서 하위에 관리한다.

 .
 ├config
 │ ├index.js
 │ └server.js
 ├product
 │ ├index.js
 │ ├product.js
 │ ├product.spec.js
 │ └product.ejs
 ...

5. scripts 디렉토리로 긴 npm 스크립트 파일을 관리한다.

별도의 디렉토리를 만들어서 package.json의 스크립트들을 관리한다.

 .
 ├scripts
 │ ├syncDB.sh
 │ └provision.sh
 ├product
 │ ├index.js
 │ ├product.js
 │ ├product.spec.js
 │ └product.ejs
 ...