2 minute read

node.js는 아주 편리하다! 아주 대단하다!

우리가 생각할 수 있는 거의 모든 것들이 구현된 코드, 프로그램(도구라고 하자)들이

npm 생태계에 셀 수 없을 만큼 업로드 되어있고, 우리가 JavaScript 언어만 알고 있다면,

그것들을 자유롭게 끌어와 프로그래밍할 수 있다.

아주 많은 npm 도구들 중에서, 서버를 제작할때 사용했던 HTTP모듈 대신 편리하게 사용할 수 있는 Express에 대해서 알아보자.

Express.js

→ node.js 환경에서 웹 서버, 또는 API서버를 제작하기 위해 사용되는 프레임워크.

여기서 잠깐! 프레임워크와 라이브러리의 차이점은 무엇일까?

→ 어플리케이션의 주도권이 ‘누구’에게 있느냐에 따라 나눌 수 있다.

프레임워크는 이 도구를 가져다가 사용하는 느낌이 아닌, 이 도구 안에 들어가서 그 안에서 코드를 작성한다는 관점으로 접근할 수 있고,

라이브러리는 이 도구를 가져다가 내가 작성한 코드 안에서 이용한다는 관점으로 접근하면 된다!

비유적으로 표현해볼까?

프레임워크는 자동차다! 사용자가 자동차에 탑승해 악셀을 밟고, 기어를 변경하는 등의 행위로 자동차를 조작한다!

라이브러리는 몽키스패너와 같은 연장이다! 사용자가 몽키스패너로 조이기도 하고, 풀기도 한다!

이때, 사용자는 자동차를 몰고 하늘을 날거나, 바다를 건널수 없다.

하지만 몽키스패너를 사용할때 사용자는 조이고 푸는것 뿐만 아니라 급할땐 내려치기도 하고, 다른 방법으로 사용하기도 한다!

자동차는 악셀을 밟아야 앞으로 가고, 브레이크를 밟아야 멈추는 것처럼

프레임워크는 이미 프로그래밍할 규칙이 정해져있다.

이 규칙을 지키기 싫으면, 몽키스패너와 다른 연장들을 이용해 자동차를 처음부터 만들면 된다!

(할 수 있으면)

Express로 구현한 서버와 HTTP모듈로 작성한 서버의 차이점

  1. 미들웨어 추가가 편리하다
  2. 자체 라우터를 제공한다

express 라우트 형식

app.{METHOD}( {PATH}, {HANDLER} )

  • app은 express의 인스턴스
  • METHOD는 HTTP 요청 메소드 (GET, POST, PUT, PATCH, DELETE 등)
  • PATH는 서버에서의 경로
  • HANDLER는 라우트가 일치할 때 실행되는 함수
app.get('/' (req, res) => {
  res.send('Hello World')
});

기본적인 라우트이다.
POSTMAN에서 해당 URL에 GET요청을 보내면 'Hello World' 출력된다.
--------------------------------------------------------

app.get('/first/second' (req, res) => {
  res.send('first경로의 second')
});

위와 같이 중첩 경로도 가능.
--------------------------------------------------------

app.post('/', )req, res) => {
  res.send(This is post!")
});

위와 같이 POST 요청을 할때는 METHOD를 post로 입력.

아래와 같은 HTTP 메소드들을 전부 지원한다.
get, post, put, head, delete, options, trace, copy, lock, mkcol, move,
 purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, 
m-search, notify, subscribe, unsubscribe, patch, search 및 connect

응답 메소드

res.download() → 파일이 다운로드 되도록 프롬프트

res.end() -> 응답 프로세스 종료

res.json() → JSON 응답 전송

res.jsonp() → JSONP 지원을 통해 JSON 응답 전송

res.redirect() → 요청의 경로를 재지정 res.render() → 보기 템플릿을 렌더링

res.send() → 다양한 유형의 응답을 전송

res.sendFIle() → 파일을 옥텟 스트림의 형태로 전송

res.sendStatus() → 응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로서 전송

Chaining

route() 를 이용해 경로에 대해 체이닝을 할 수 있다.

app.route('/chaining')
  .get((req, res) => {
    res.send('route를 이용한 get')
})
.post((req, res) => {
  res.send('route를 이용한 post')
})
.put((req, res) => {
  res.send('route를 이용한 put')
})

위와 같이 체이닝 되면, /chaining 경로에 대해 체이닝된 Method들을 사용할 수 있다.

미들웨어 함수

app.get('/', (req, res, next) => {
  next();
});

여기서 get은 미들웨어 함수가 적용되는 HTTP 메소드
'/' 미들웨어 함수가 적용되는 경로 (라우트)
화살표 함수로 작성된 함수는 미들웨어 함수
res는 미들웨어 함수에 대한 HTTP요청 인수
rep는 미들웨어 함수에 대한 HTTP 응답 인수
next는 미들웨어 함수에 대한 콜백 인수
next() 함수를 호출하면,  내의  다음 미들웨어 함수가 호출된다.

미들웨어 함수를 로드하려면, 미들웨어 함수를 지정하여 app,use() 호출한다.

Updated: