res.send() vs res.json() vs res.end()

yezo cha·2021년 9월 2일
0

Express를 사용해서 작업할 때 요청 및 응답 객체에 접근할 수 있는데, 응답을 요청한 쪽에 다시 보낼 수 있다.
이 경우 Express에서는res.json(), res.send(), res.end()와 같은 메서드를 사용할 수 있다..
어떤 걸 써야하는 지 가끔 헷갈릴 때가 있어 정리하고자 한다.
구글 엔지니어 타마스 피로스의 글을 참고했다.

Response Object 응답 객체

응답 객체는 노드의 핵심 객체인 http.ServerResponse의 인스턴스이다.
응답 객체는 요청 핸들러의 두 번째 매개변수로 사용된다.
이름은 원하는 대로 바꿀 수 있지만 보통 res, resp, response를 사용한다.

Express 서버가 HTTP 요청을 받으면 response를 반환한다.

app.get('/api/test', (req, res) => {
  //  write code..
}

응답을 보내는 메서드

res.send()

기본적으로 res.send() 메서드를 호출하여 응답response을 보낼 수 있다.
서버에서 response 처리를 할 때 content-type을 지정해주어야 한다.

res.send()메서드는 res.send(body) 형태로 사용할 수 있다.
body 인자에는 Buffer, String, Object, Array를 사용할 수 있다.
res.send() 메서드는 전달된 body argument에 따라 content-type이 자동적으로 만들어진다.
기본 컨텐츠 타입은 text/html이다.

res.type()메서드를 호출해서 content-type 응답 헤더를 따로 설정해 줄 수 있다.

res.send()메서드로 JSON 형식의 데이터를 전송해보자.

app.get('/api/test', (req, res) => {
  res.send({ hello: 'world' });
});

응답 헤더

  X-Powered-By: Express
  Content-Type: application/json; charset=utf-8
  Content-Length: 17
  ETag: W/"11-IkjuL6CqqtmReFMfkkvwC0sKj04"
  Date: Thu, 2 Sep 2021 22:40:43 GMT
  Connection: keep-alive

Express가 정상적으로 컨텐츠 타입을 설정했음을 알 수 있다.
res.send()로 잘 보내는데 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()를 사용하면 된다.
404 상태를 보낼 때 유용하게 사용할 수 있다.

// 상태코드 404로 설정하고 그 후 응답을 바로 종료.
res.status(404).end();

정리

res.json()메서드는 JSON타입 데이터에 대해 형식을 추가 설정할 수 있다.
이런 옵션이 필요하지 않을 경우 res.send()를 사용하여 응답 객체를 반환하면 된다.
res.json()res.send(), 두 가지 메서드 모두 데이터를 전송한 후 세션을 종료하므로 추가적으로 res.end()메서드를 호출할 필요가 없다.

profile
(ง •̀_•́)ง

0개의 댓글