[Express] res.send() VS res.json() VS res.end()

DaiVernon·2021년 7월 10일
1

Node.js / Express

목록 보기
1/2
post-thumbnail

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 응답헤더를 따로 설정해 줄 수있습니다.


많은 개발자들이 Express를 사용하여 RESTful API를 만들고 있고 현대 대부분의 API는 JSON 형식의 데이터를 반환합니다. 여기서 많은 사람들이 고민하는건 `res.send()` 를 사용해야하는가 아니면 `res.json()` 을 사용해야 하는가 하는 부분입니다.

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() 메서드를 호출할 필요가 없습니다.

참고 자료


profile
클린 코드, 클린 아키텍처

0개의 댓글