TIL

res.json VS res.send() VS res.end

효모. 2020. 7. 22. 18:43

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-Typeapplication/json으로 설정하고, *인자로 받은 객체를 JSON.stringfy 메서드로 넘긴다. *이는 받은 JSON 데이터를 replacerspacer 두 가지 설정에 의해 변환하여

종국에는 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() 와 똑같이 세션을 종료하는 기능을 가지고 있기 때문이다.

결론적으로, 세 메소드는 궁극적으로 같은 목적을 달성하지만 어떤 데이터를 처리하느냐에 따라 조금씩 달랐다고 볼 수 있겠다.


참고자료

'TIL' 카테고리의 다른 글

쿠키, 세션 기반 인증과 JWT 기반 인증  (0) 2020.08.15