express란 무엇인가?
express는 Node.js 환경에서 웹서버 혹은 API 서버를 구축하기 위해서 사용되는 프레임워크이다. Node.js 내장 모듈인 http 모듈을 기반으로 만들어졌으며, 웹서버를 구축하기 위해 필요한 다양한 함수와 서브 모듈을 포함하고 있다. (여기서 웹서버란 http 서버를 의미한다.)
http 모듈이 독립적인 모듈이기 때문에 server, request, response 객체를 사용해 직접 이벤트를 달아 요청을 받고 응답하도록 코드를 짜야한다면, Express는 모든 것이 포함된 '프레임워크'이기 때문에, 이런 과정을 간소화 시켜주는 편리한 기능들을 가지고 있다.
express는 어떻게 시작하는가?
먼저 express 프레임워크 사용을 위한 기본 명령어를 입력하여 초기 셋팅을 진행한다. 공식 설치 가이드
# package.json 생성
npm init
# express 설치
npm install express --save
# 혹은
npm install express
# nodemone 설치 및 package.json > scripts 추가
npm install nodemon
# "start": "nodemon app.js"
그리고 app.js 파일을 새로 만들어 아래와 같이 코드를 입력한다.
포트 3000으로 get 요청을 받아 처리할 수 있는 간단한 웹서버를 만들었다. 공식 문서 가이드
브라우저에서 localhost:3000으로 접속하면 화면에 'Hello Wolrd!' 가 떠 있는 것을 확인할 수 있다.
const express = require('express'); // express를 import 한다.
const app = express(); // express의 애플리케이션인 app 객체를 생성한다.
const port = 3000; // 응답을 받을 포트
// '/' 경로로 get 요청 받기
// res객체에 send 메서드로 응답을 보낼 수 있다.
app.get('/', (req, res) => {
res.send('Hello Wolrd!');
});
// port 로 서버를 열어 요청을 받는다.
app.listen(port, () => {
console.log('서버 실행중!');
});
라우팅이란 무엇인가?
라우팅Routing 이란 클라이언트의 요청에 대해 애플리케이션이 응답하는 방법을 결정하는 것을 의미한다. 즉 클라이언트가 특정 http 메서드, 특정 경로(path)로 요청을 보냈을 때 서버가 어떻게 응답하느냐를 정하는 것이다. 앞서'/' 경로로 get 요청이 들어왔을 때 'Hello Wolrd!'라는 내용으로 응답해준것처럼, 특정 메서드에 따라, 특정 경로에 따라 다른 응답을 해줄 수 있다. 라우트는 아래와 같이 정의할 수 있다.
app.METHOD(PATH, HANDLER)
여기서 METHOD 란 GET, POST, PUT, DELETE, OPTIONS 와 같은 HTTP 메서드를 의미하고, PATH는 서버에서의 경로를 의미한다. 서버로 온 요청이 이 METHOD와 PATH에 일치할 때 실행되는 것이 HANDLER 함수이다.
아래 코드와 같이 특정 메서드, 특정 경로에 따라 응답해줄 내용을 정해줄 수 있다.
// /upper path에 대한 POST 요청 응답
app.post('/upper', (req, res) => {
res.send('대문자');
});
// /user path에 대한 DELETE 요청 응답
app.delete('/user', function (req, res) {
res.send('Got a DELETE request at /user');
});
express 에서는 위와 같이 라우트 메서드를 제공하기 때문에 http 모듈에 비해 가독성이 좋고 코드가 짧아진다. 라우트의 두번째 인자인 라우트 핸들러 함수는 request와 response 에 접근해 요청을 처리하는 로직을 작성할 수 있게 해준다. request와 response를 줄여서 순서대로 req, res 라고 작성한다. (더 자세한 내용은 공식문서-라우팅 하단의 '라우트 핸들러'를 참고하면 좋겠다.)
요청에 대한 응답 보내기 : res.json / res.send
앞선 내용을 통해 요청 메서드와 URI(경로) 를 확인해 어떤 요청이 왔는지, 요청에 따라 라우팅을 할 수 있다는 것을 알게 되었다. 그렇다면 그 요청에 어떻게 응답할 수 있을까?
먼저 핸들러 함수에서 매개변수로 정의된 req와 res 는 각각 request 객체와 response 객체를 의미한다. response 객체는 http 모듈에 의해 자동으로 생성되는 http.ServerResponse 인스턴스의 연장선이고, 따라서 우리는 두 번째 인자 res 에 대해서 기본적으로 제공되는 메서드 및 express에서 추가된 메서드를 사용해 응답을 해줄 수 있다.
응답을 할 때 자주 사용하게되는 두 가지 메서드 res.json과 res.send를 간단하게 비교해보자.
res.json([body])
함수 이름에서 알 수 있듯, 괄호 안에 전달되는 body 데이터를 JSON.stringify() 를 사용하여 - 즉 JSON 형식으로 변환하여 응답으로 보내준다. 내부적으로 JSON 변환을 거쳐서 전송되는데, 이름만 보고도 JSON 데이터를 응답한다는 것을 알 수 있기 때문에 편리하다.
res.send([body])
가장 기본적으로 응답을 보내주는 함수이다. 만약 클라이언트에서 JSON 형태로 데이터를 받아온다면 에러가 발생할 수 있으므로 주의해야한다.
// 서버 코드
app.post('/upper', (req, res) => {
res.json(req.body.toUpperCase());
});
// 클라이언트 코드
//..생략
.then(res => res.json())
.then(res => this.render(res))
.catch(err => {
console.log(err);
}
위와 같은 코드가 있다고 할 때, 서버 코드의 res.json을 res.send로 변경하면 아래와 같은 에러를 만나게 된다.
이는 클라이언트에서 받으려는 데이터가 JSON 형식이 아니기 때문에 발생하는 에러로, 데이터를 주고 받을 때 형식을 잘 살펴봐야함.
다음에 살펴볼 내용들...
1. express.route() : express 에서는 라우트를 별도의 모듈로 분리하여 사용할 수 있도록 express.route()라는 함수를 제공하고 있다. 한 파일에서 모든 라우팅을 처리하면 코드 가독성이 떨어지는데 이 때 활용하면 좋다.
2. 미들웨어 : 미들웨어란 중간에서 특정한 역할을 수행하는 함수를 의미한다. express 프레임워크의 중요한 특징 중 하나인데, 예시로 request body의 내용에 접근하기 위한 파싱을 별도의 내장 미들웨어 (express.json)를 import 하여 처리한다.
'Stacks > Node.js' 카테고리의 다른 글
[Node.js / express] 미들웨어를 알아보자! (0) | 2022.08.17 |
---|