Express 어플리케이션 서버는 HTTP 요청을 받아서 res라고 불리는 응답 객체를 제공한다. 이 응답 객체를 이용하여 클라이언트에게 응답이 가능하다. 다만, 그 응답이 다음과 같이 res.json(), res.send(), res.end()로 나눠진다. 이 셋은 같은 기능을 하는 것 같지만 분명 다르다. 그래서 사소하지만 다른 것들에 대해 한 번 알아보겠다.
응답 객체는 노드의 핵심 객체인 http.ServerResponse의 인스턴스. 응답 객체는 요청 핸들러의 두 번째 매개변수로 사용되므로 이름은 원하는 대로 바꿀 수 있지만, 보통 res, resp, response를 사용한다. 익스프레스는 이 객체의 추가적인 기능을 제공.
예시 코드:
<script>
app.get('/api/test', (req, res) => {
// ... write your code ...
}
</script>
기본적으로 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 응답헤더를 따로 설정해 줄 수있다.
많은 개발자들이 Express를 사용하여 RESTful API를 만들고 있고 현대 대부분의 API는 JSON 형식의 데이터를 반환한다. 여기서 많은 사람들이 고민한다. res.send()
vsres.json()
res.send() 메서드로 JSON 형식의 데이터를 전송하는 코드:
<script>
app.get('/api/test', (req, res) => {
res.send({ hello: 'world' });
});
</script>
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.send()로 JSON 형태의 데이터를 보낼 때 사용할 수 없는 몇 가지 기능이 있다. 두 가지 옵션을 통하여 반환할 JSON 데이터의 형식을 정해줄 수 있다.
<script>
app.set('json replacer', replacer); // JSON 문자열에 포함시킬 객체의 프로퍼티를 지정해주는 옵션
app.set('json spaces', 2); // 들여쓰기 공백 수 지정
</script>
두 가지 옵션은 수집되어 내부적으로 JSON.stringify(object, replacer, space)와 같은 형식으로 전달된다. 그 후 res.json() 메서드 내부에서 res.send() 메서드가 호출되어 전송되게 된다.
마지막으로 res.end() 를 살펴보겠다.
응답 관련된 모든 작업이 끝나고 세션을 종료하기 위해서는 res.end() 메서드를 호출해야 한다.
res.end() 메서드는 모든 경우에 필수적인 메서드는 아니다.
예를 들어 데이터를 전송하지 않고 종료하려면 그냥 res.end() 를 사용하면 된다. 404 페이지 같은 경우에 유용하게 사용할 수 있다.
<script>
res.status(404).end();
</script>
이 코드에서는 HTTP 상태 코드를 404로 설정하고 그 후 응답을 바로 종료한다.
하지만 어떠한 전송해야할 데이터가 있다면 res.send() 메서드 혹은 res.json() 메서드를 사용하면, 데이터가 전송된 후 자동으로 응답도 종료되므로 res.end() 메서드를 명시적으로 호출할 필요가 없다.
<요약 정리>
🤙 res.send()는 send에 전해진 argument에 따라서 Content-type이 자동적으로 만들어진다. 이게 기본이다.
🤙res.json()은 json이 아닌 것도 json 형식으로 바꾸어서 보내준다. 즉 content-type 헤더를 application/JSON으로 고정한다. 그런데 결국 res.json()도 마지막에 res.send()를 호출한다.
🤙res.end()는 보내줄 아무 데이터도 없는데 response를 끝내고 싶을 때 사용한다.
ex) res.status(400).end();
다음은 위에서 나온 스테이터스 코드에 대해 한 번 알아보겠다. 스테이터스 코드는 우리가 지금 웹에서 어떤 통신 상태인 지 알 수 있는 코드이기 때문에 꼭 서버 통신에 있어 필수적으로 알아야 한다. 그러면 이만 굿 바이~
-------------to be continued---------------------------