본문 바로가기
프로그래밍/기타

Express

by hustle-ing 2023. 4. 5.

Express

Express는 Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기있는 프레임워크이다.

Express로 구현한 서버가 Node.js HTTP 모듈로 작성한 서버와 다른 점은 다음과 같다.

  1. 미들웨어를 추가할 수 있다.
  2. 라우터를 제공한다.

 

 

라우팅(Rountig)

라우팅은 클라이언트의 요청에 해당하는 Endpoint에 따라 서버가 응답하는 방법을 결정하는 것이다.

추가적인 라이브러리를 사용하지 않고, 순수한 Node.js로 코드를 작성하면 다음과 같다.

 

반면에 Express는 프레임워크 자체에서 라우터 기능을 제공한다. Express의 라우터를 활용하면 아래와 같이 직관적인 코드를 작성할 수 있다.

 

미들웨어(Middleware)

Express의 가장 큰 장점인 미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행한다.

미들웨어를 사용하는 상황은 다음과 같다.

  1. POST 요청 등에 포함된 body(payload)를 구조화 할 때(쉽게 얻어내고자 할 때)
  2. 모든 요청/응답에 CORS 헤더를 붙여야 할 때
  3. 모든 요청에 대해 url이나 메서드를 확인할 때
  4. 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
  5.  

case 1: POST 요청 등에 포함된 body(payload)를 구조화 할 때

Node.js로 HTTP body를 받을 때는 Buffer를 조합해서 다소 복잡한 방식으로 body를 얻을 수 있다.

네트워크상의 chunk를 합치고, buffer를 문자열로 변환하는 작업이 필요하다.

Node.js로 HTTP 요청 body를 받는 코드

Express는 body-parser 미들웨어를 사용하면 이 과정을 간단하게 처리할 수 있다. 

Express v4.16.0 부터는 body-parser를 따로 설치 하지 않고, 내장 미들웨어인 express.json()을 사용한다

express.json 속성 중 strict의 디폴트 값은 true로 되어있어 Object만 허용한다.

아래와 같이 strict의 값을 false로 바꿔주면 다른 형태도 받을 수 있게 된다.

 

 

case 2: 모든 요청/응답에 CORS 헤더를 붙일 때

Node.js HTTP 모듈을 이용한 코드에 CORS 헤더를 붙이려면, 응답 객체의 writeHead 메서드를 이용한다. Node.js에서는 이 메서드를 이용하여 라우팅 마다 헤더를 매번 넣어주어야 한다. 뿐만 아니라, OPTIONS 메서드에 대한 라우팅도 따로 구현해야 한다.

Express는 cors 미들웨어를 사용하면 이 과정을 간단히 처리할 수 있다.

모든 요청에 대해 CORS 허용
특정 요청에 대해 CORS 허용

 

case 3: 모든 요청에 대해 url이나 메서드를 확인할 때

수 많은 미들웨어가 있지만, 가장 단순한 미들웨어 로거를 예로 들어보자. 로거는 디버깅이나, 서버 관리에 도움이 되기 위해 console.log로 적절한 데이터나 정보를 출력한다. 데이터가 여러 미들웨어를 거치는 동안 으답할 결과를 만들어야 한다면, 미들웨어 사이사이에 로거를 삽입하여 현재 데이터를 확인하거나, 디버깅에 사용할 수 있다.

미들웨어의 구성

엔드포인트가 / 이면서, 클라이언트로부터 GET 요청을 받았을 때 적용되는 미들웨어이다.  req, res는 각각 요청과 응답이고 next는 다음 미들웨어를 실행하는 역할을 한다.

만약 특정 endpoint가 아니라, 모든 요청에 동일한 미들웨어를 적용하려면 app.use를 사용하면 된다.

 

 

case 4: 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

요청에 토큰이 있는지를 판단하며, 이미 로그인한 사용자일 경우 성공 / 아닐 경우 에러를 보내는 미들웨어는 아래와 같다.

 

'프로그래밍 > 기타' 카테고리의 다른 글

웹 접근성  (0) 2023.04.27
Redux - 기초  (0) 2023.04.24
Node.js - CORS  (0) 2023.04.04
REST API  (0) 2023.03.29
SSR vs CSR  (0) 2023.03.28

댓글