Express는 Node.js에 가장 많은 사용자를 보유하고 있는 웹 프레임워크 중 하나이며, 아마도 대부분의 Node.js 개발자가 사용하고 있을 것입니다. Express는 수많은 HTTP 유틸리티 메서드를 가진 뛰어난 프레임워크이며 성능 역시 우수합니다.
Express를 사용하여 요청 객체 및 응답 객체에 접근할 수 있으며, 요청 객체 및 응답 객체를 사용하여 응답 중 일부를 요청한 쪽에 다시 보낼 수 있습니다. 이 경우 Express에서는 res.json()
, res.send()
및 res.end()
와 같은 다양한 메서드를 사용할 수 있습니다. 위 세가지 메서드가 어떻게 다른지 알아봅시다.
응답 객체는 노드의 핵심 객체인 http.ServerResponse의 인스턴스입니다. 응답 객체는 요청 핸들러의 두 번째 매개변수로 사용되므로 이름은 원하는 대로 바꿀 수 있지만, 보통 res, resp, response를 사용합니다. 익스프레스는 이 객체의 추가적인 기능을 제공합니다.
예시:
app.get('/api/test', (req, res) => {
// ... write your code ...
}
여기서 사용한 res 객체는 Node.js에 있는 http 응답 객체에 express에서 제공하는 추가 기능들도 탑재되어 있습니다.
Express에서 응답을 보내는 메서드는 여러가지가 존재합니다.
res.send()
기본적으로 res.send()
메서드를 호출하여 응답을 전송할 수 있습니다.
res.send()
메서드는 다음과 같이 사용할 수 있습니다: res.send(body)
여기서 body
인자에는 Buffer
, String
, Object
, Array
를 사용할 수 있습니다.
res.send()
메서드는 전달된 body 인자에 따라 자동으로 Content-Type
응답 헤더가 정해지며, 기본 콘텐츠 타입은 text/html
입니다. 예를 들어 body
인자가 Buffer
라면 따로 헤더를 설정하지 않는 이상 콘텐츠 타입은 application/octet-stream
으로 설정됩니다.
res.type()
메서드을 호출하여Content-Type
응답헤더를 따로 설정해 줄 수있습니다.
res.send()
메서드로 JSON 형식의 데이터를 전송하는 코드:
app.get('/api/test', (req, res) => {
res.send({ hello: 'world' });
});
res.send()
메서드로 JSON 형식의 데이터를 전송할 경우 응답 헤더:
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 17
ETag: W/"11-IkjuL6CqqtmReFMfkkvwC0sKj04"
Date: Sun, 11 Aug 2019 12:40:43 GMT
Connection: keep-alive
Express가 정삭적으로 컨텐츠 타입을 설정했음을 알 수 있습니다. 그렇다면 res.json()을 굳이 사용해야 하는 이유는 뭘까요?
res.json()
res.json()
은 res.send()
로 JSON 형태의 데이터를 보낼 때 사용할 수 없는 몇 가지 기능이 있습니다. 두 가지 옵션을 통하여 반환할 JSON 데이터의 형식을 정해줄 수 있습니다.
app.set('json replacer', replacer); // JSON 문자열에 포함시킬 객체의 프로퍼티를 지정해주는 옵션
app.set('json spaces', 2); // 들여쓰기 공백 수 지정
두 가지 옵션은 수집되어 내부적으로 JSON.stringify(object, replacer, space)
와 같은 형식으로 전달됩니다. 그 후 res.json()
메서드 내부에서 res.send()
메서드가 호출되어 전송되게 됩니다.
마지막으로 res.end()
를 살펴보겠습니다.
res.end()
응답 관련된 모든 작업이 끝나고 세션을 종료하기 위해서는 res.end()
메서드를 호출해야 합니다.
res.end()
메서드는 모든 경우에 필수적인 메서드는 아닙니다.
예를 들어 데이터를 전송하지 않고 종료하려면 그냥 res.end()
를 사용하면 됩니다. 404 페이지 같은 경우에 유용하게 사용할 수 있습니다.
res.status(404).end();
이 코드에서는 HTTP 상태 코드를 404로 설정하고 그 후 응답을 바로 종료합니다.
하지만 어떠한 전송해야할 데이터가 있다면 res.send()
메서드 혹은 res.json()
메서드를 사용하면, 데이터가 전송된 후 자동으로 응답도 종료되므로 res.end()
메서드를 명시적으로 호출할 필요가 없습니다.
결론적으로 res.json()
메서드는 JSON 타입의 데이터에 대해 형식을 추가적으로 설정할 수있습니다. 이런 설정들이 필요하지 않을 경우 res.send()
를 사용하여 응답 객체를 반환해도 됩니다. 또한 이 두 가지 메서드 모두 데이터를 전송 후 세션을 종료하므로 추가적으로 res.end()
메서드를 호출할 필요가 없습니다.