res.json VS res.send() res.end()
Express 어플리케이션 서버는 HTTP 요청을 받아서 res라고 불리는 응답 객체를 제공한다. 이 응답 객체를 이용하여 클라이언트에게 응답을 할 수 있는데, 코드를 보다 보면 여러가지 방법으로 응답을 하는걸 확인할 수 있었다.. res.json(), res.send(), res.end() 이 셋은 같은 기능을 하는 것 같지만 분명 다르다. 이 세 메서드들의 차이점을 공부해보기로 했다. 언제 무엇을 써야 하는 걸까?
res.send()
res.send() 는 다음과 같이 body를 인자로 받는다. res.send([body])
body에 들어갈 수 있는 것은 다음과 같다. Buffer
, String
, Object
,그리고 Array
이다.
이 메서드는 인자로 전달된 값을 바탕으로 헤더에 Content-Type을 자동으로 설정한다.
만약 수동으로 Content-Type 을 수정하고자 한다면 set() 메소드를 이용해야 한다.
예 : res.set('Content-Type', 'text/html')
res.send()를 부르면 다음과 같은 switch 문을 hit 하게 되는데,
switch (typeof chunk) {
// string defaulting to html
case 'string':
if (!this.get('Content-Type')) {
this.type('html');
}
break;
case 'boolean':
case 'number':
case 'object':
if (chunk === null) {
chunk = '';
} else if (Buffer.isBuffer(chunk)) {
if (!this.get('Content-Type')) {
this.type('bin');
}
} else {
return this.json(chunk);
}
break;
}
만약 res.send()로 보낸 Object가 Buffer가 아닐 때, res.json()을 부르게 된다.
res.json()
res.json()는 JSON객체와 관련해서 res.send()에는 없는 기능을 가지고 있다.
우선 Content-Type
을 application/json
으로 설정하고, *인자로 받은 객체를 JSON.stringfy
메서드로 넘긴다. *이는 받은 JSON 데이터를 replacer
와 spacer
두 가지 설정에 의해 변환하여
종국에는 res.send()를 호출하게 된다.
app.set('json replacer', replacer); // 속성 변환 규칙
app.set('json spaces', 2); // 정렬 시 공백 수
res.end()
요청자에게 응답을 하고 나면, 마지막으로 세션을 종료하는 작업이 필요한데, 이 역할을 하는게 바로 res.end()이다.
res.end()는 어떤 데이터도 담지 않고 보낼 수 있으며, 에러 페이지가 필요할 땐 데이터를 담지 않고 쓸 수 있다.
res. status(404).end();
그런데 만약 res.end()에 데이터를 담아서 세션을 종료하고 싶다면 어떻게 해야할까? 답은 간단하다. res.send()를 사용하는 것이다. (혹은 res.json() ) 위의 두 메소드는 데이터를 보내면서 res.end() 와 똑같이 세션을 종료하는 기능을 가지고 있기 때문이다.
결론적으로, 세 메소드는 궁극적으로 같은 목적을 달성하지만 어떤 데이터를 처리하느냐에 따라 조금씩 달랐다고 볼 수 있겠다.
참고자료
[res.send()VS res.json()VSres.end()]https://blog.fullstacktraining.com/res-json-vs-res-send-vs-res-end-in-express/
{difference-between-res-send-or-res-json}<https://stackoverflow.com/questions/37698782/difference-between-res-send-or-res-json?lq=1>
'TIL' 카테고리의 다른 글
쿠키, 세션 기반 인증과 JWT 기반 인증 (0) | 2020.08.15 |
---|