🌳λͺ©ν‘œ

이둠적인 λ‚΄μš©λ³΄λ‹€λŠ” μ½”λ“œλ₯Ό 직접 λ”°λΌν•˜λŠ” λ‚΄μš©μ΄ λ§ŽμŠ΅λ‹ˆλ‹€. 쀑간에 μ‹€μŠ΅ λ¬Έμ œκ°€ μžˆμ–΄μ„œ μ—¬λŸ¬λΆ„μ΄ 직접 μ½”λ”©ν•˜λŠ” μˆœμ„œλ„ μžˆκ΅¬μš”. 이런 ν™˜κ²½μ„ κ°–μΆ”κΈ° μœ„ν•œ μ‹€μŠ΅ μ„ΈνŒ… μž‘μ—…λΆ€ν„° μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ 생성

λͺ¨λ“  μ½”λ“œλŠ” κΉƒν—™ μ €μž₯μ†Œμ— 올렀 λ‘μ—ˆμŠ΅λ‹ˆλ‹€. 이 μ½”λ“œλ₯Ό μ—¬λŸ¬λΆ„ 컴퓨터에 λ³΅μ‚¬ν•΄μ„œ κ°€μ Έ μ˜΅λ‹ˆλ‹€.

$ git clone git@github.com:jeonghwan-kim/codelab-node-web.git
# or 
$ git clone https://github.com/jeonghwan-kim/codelab-node-web.git

진행 μˆœμ„œμ— 따라 브랜치λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“€μ–΄ λ‘μ—ˆλŠ”λ°μš”, λ¨Όμ € scaffolding/init 브랜치둜 이동 ν•©λ‹ˆλ‹€.

$ git checkout scaffolding/init

.gitignore 파일만 μžˆλ„€μš”. 이건 κΉƒμ—μ„œ μΆ”μ ν•˜μ§€ μ•ŠλŠ” 파일 이름을 μž‘μ„±ν•œ λͺ©λ‘μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œλΆ€ν„° 코딩을 μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ’»

NPM

NPM은 λ…Έλ“œ νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €(Node Package Manage)라고도 ν•˜λŠ”λ°μš”. λ…Έλ“œμ—μ„œ λ§Œλ“  맀킀지(ν˜Ήμ€ λͺ¨λ“ˆ, 라이브러리 λ”°μœ„)λ₯Ό κ΄€λ¦¬ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

λ…Έλ“œ 기반의 ν”„λ‘œμ νŠΈλŠ” 이 NPM을 μ΄μš©ν•΄μ„œ κ°œλ°œν•˜λŠ”λ°μš”, μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€.

$ npm init

init λͺ…령은 λ…Έλ“œ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. λͺ…령을 μ‹€ν–‰ν•˜κ³  λ‚˜λ©΄ ν”„λ‘œμ νŠΈ 정보에 λŒ€ν•΄ λͺ‡ 가지 λ¬Όμ–΄λ³Όν…λ°μš”. κ·Έλ ‡κ²Œ μ€‘μš”ν•˜μ§€ μ•ŠμœΌλ‹ˆ -y μ˜΅μ…˜μœΌλ‘œ λͺ¨λ‘ β€œλ„€(yes)”라고 λŒ€λ‹΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

$ npm init -y

이제 ν”„λ‘œμ νŠΈ 폴더에 package.json 파일이 μƒμ„±λ˜μ—ˆμ„ κ²λ‹ˆλ‹€. NPM은 이 νŒŒμΌμ— ν”„λ‘œμ νŠΈ κ΄€λ ¨ 정보λ₯Ό λ‹΄λŠ” 것이죠.

ν…ŒμŠ€νŠΈ ν™˜κ²½ μ„ΈνŒ…

λ…Έλ“œμ—μ„œ ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ λ§Œλ“€λ €λ©΄ μ™ΈλΆ€ ν”„λ ˆμž„μ› 도움을 λ°›μ•„μ•Ό ν•©λ‹ˆλ‹€. λͺ¨μΉ΄(Mocha)와 μŠˆλ“œ(Should)μΈλ°μš”, μ„€μΉ˜λΆ€ν„° ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

$ npm install --save-dev mocha should

μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€λŠ” 것은 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. λ°”λ‘œ 방금 μ„€μΉ˜ν•œ λͺ¨μΉ΄κ°€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ£ΌλŠ” ν…ŒμŠ€νŠΈ λŸ¬λ„ˆ(Test Runner)인 것이죠.

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Όκ°€ κΈ°λŒ€ν•˜λŠ” κ°’κ³Ό 같은지 κ²€μ‚¬ν•˜λŠ” 과정이 ν•„μš”ν•œλ°μš”, μŠˆλ“œκ°€ λ°”λ‘œ 밸리데이터(Validator) 열할을 ν•˜λŠ” 라이브러리 μž…λ‹ˆλ‹€.

그럼 κ°„λ‹¨ν•˜κ²Œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ³ΌκΉŒμš”?

server.spec.jsλž€ μ΄λ¦„μ˜ νŒŒμΌμ„ ν•˜λ‚˜ λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ νŒŒμΌμ€ β€œspec” 혹인 β€œtest” λΌλŠ” 이름을 λΆ™μ΄λŠ” κ΄€λ‘€κ°€ μžˆλŠ”λ° μ €λŠ” spec으둜 μ •ν–ˆμŠ΅λ‹ˆλ‹€.

νŒŒμΌμ— μ•„λž˜ μ½”λ“œλ₯Ό μž…λ ₯ν•΄ λ³΄μ„Έμš”.

const should = require('should')
const server = require('./server')

describe('server test suite', () => {
  it('should return "hello world"', () => {
    server().should.be.equal('Hello world')
  })
})

μ„œλ²„ λͺ¨λ“ˆμ„ κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•œ 값이 β€œHello world” λ¬Έμžμ—΄μ„ λ¦¬ν„΄ν•˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

이제 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ„œ ν…ŒμŠ€νŠΈ 톡과여뢀λ₯Ό ν™•μΈν•΄μ•Όν•˜λŠ”λ°μš” 방금 μ„€μΉ˜ν•œ λͺ¨μΉ΄ λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

$ node_modules/.bin/mocha server.spec.js

λͺ¨μΉ΄ ν…ŒμŠ€νŠΈλŠ” 자주 μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄λΌμ„œ NPM 슀크립트둀 등둝해 두면 νŽΈλ¦¬ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν• λ•Œ μžλ™μœΌλ‘œ λ§Œλ“  package.json νŒŒμΌμ— 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

"test": "mocha server.spec.js"

νŒ¨ν‚€μ§€ νŒŒμΌμ—μ„œλŠ” μ„€μΉ˜ν•œ λͺ¨λ“ˆμ€ μƒλŒ€μ£Όμ†Œ 없이 λ°”λ‘œ λͺ…λ Ήμ–΄λ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

슀크립트λ₯Ό 쑰금 더 κ°œμ„ ν•΄ λ³ΌκΉŒμš”?

"test": "mocha $(find ./ -name \"*.spec.js\")"

이름이 β€œspec.jsβ€λ‘œ λλ‚˜λŠ” νŒŒμΌμ„ λͺ¨λ‘ λͺ¨μΉ΄ ν…ŒμŠ€νŠΈλ‘œ μ‹€ν–‰ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

그럼 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•΄ 보죠.

$ npm test 
> codelab-node-web@1.0.0 test /Users/jeonghwan/tmp/codelab-node-web
> mocha $(find ./ -name "*.spec.js")

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module './server'

λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν–ˆλ„€μš”. λ§ˆμ§€λ§‰ 문ꡬλ₯Ό 보면 server νŒŒμΌμ„ 찾을 수 μ—†λ‹€κ³  ν•©λ‹ˆλ‹€. (Error: Cannot find module β€˜./server’)

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μž‘μ„±ν–ˆμ§€λ§Œ ν…ŒμŠ€νŠΈ λŒ€μƒμΈ server.jsλŠ” 아직 λ§Œλ“€μ§€ μ•Šμ•˜μœΌλ‹ˆκΉŒμš”.

이제 server.js νŒŒμΌμ„ μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄ λ΄…λ‹ˆλ‹€.

const server = () => "Hello world"

module.exports = server

κ°„λ‹¨ν•˜κ²Œ β€œHello world” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ§Œ λ§Œλ“€μ–΄ (server()) λ…ΈμΆœν•΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. (module.exports = server)

λ‹€μ‹œ ν…ŒμŠ€νŠΈλ₯Ό λŒλ €λ³ΌκΉŒμš”?

$ npm test

> codelab-node-web@1.0.0 test /Users/jeonghwan/tmp/codelab-node-web
> mocha $(find ./ -name "*.spec.js")

  server test suite
    βœ“ should return "hello world"

  1 passing (8ms)

μ΄λ²ˆμ—” ν…ŒμŠ€νŠΈμ— ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€.

정리

  • NPM으둜 λ…Έλ“œκΈ°λ°˜μ˜ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  • μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§„ package.json에 ν”„λ‘œμ νŠΈ κ΄€λ ¨ 정보λ₯Ό μ €μž₯ν•˜κ³  μŠ€ν¬λ¦½νŠΈλ„ λ“±λ‘ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨μΉ΄μ™€ μŠˆλ“œλ‘œ μœ λ‹›ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ λ§Œλ“€μ—ˆκ³  NPM에 test 슀크립트둜 λ“±λ‘ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ©μ°¨ λ°”λ‘œκ°€κΈ°