본문 바로가기

BACKEND

[Express.js] res.json vs res.send vs res.end

Express는 Node.js를 위한 가장 유명한 프레임워크중 하나이다.

 

Express를 사용할 때, 우리는 request, response 객체에 접근할 수 있다. 특히, response 객체는 요청한 클라이언트에게 response를 보낼 때 사용하게 되는데 이때 다양한 메서드들이 사용된다. 바로 json, send, end 메서드들이다.

 

하지만 매번 해당 메서드를 사용하면서 구체적인 차이점을 알지 못했는데 정확한 차이점이 무엇이고 어떤 경우에 사용해야하는지 알아보자.

app.get('/api/test', (req, res) => {
  // ... do something ...
});

 

 

미리보기 결론

💡 res.send( ) 와 res.json( ) 은 사실상 비슷하다! 

res.send( ) 
send에 전달된 argument에 따라 Content-type이 자동적으로 만들어 준다.

res.json( )
json이 아닌 형식도 json 형식으로 바꾸어서 보내준다.

res.end( ) 
보내줄 데이터는 없는데 response를 끝내고 싶을 때 사용한다.
ex) res.status(404).end();

 

 

res.send( )

response를 보낼때 사용한다. 형태는 다음과 같다.

res.send([body])

body는 Buffer, String, Object, Array 형태일 수 있다. 기본적으로 response 처리를 할때 Content-Type을 지정해주어야 하는데 send 메서드는 이를 자동으로 지정해준다. 예를들어, Buffer 데이터를 반환해준다면 res.send는 자동으로 Content-type을 application/octet-stream으로 지정한다.

 

❓ 대부분의 개발자들은 RESTful한 APIs를 만들기 위해 Express를 사용한다. 그리고 RESTful한 APIs들은 JSON 형식의 데이터를 사용한다. 그렇다면 JSON 형식의 데이터를 전달할때 res.send( )를 사용해야 할까 아니면 res.json( )을 사용해야 할까?
app.get('/api/test', (req, res) => {
  res.send({ hello: 'world' });
});

//해당 메서드를 사용했을 때 response 헤더는 다음과 같다
X-Powered-By: Express
Content-Type: application/json; charset=utf-8 //Conten-type 자동으로 생성!!
Content-Length: 17
ETag: W/"11-IkjuL6CqqtmReFMfkkvwC0sKj04"
Date: Fri, 10 Aug 2018 09:34:13 GMT
Connection: keep-alive

 

res.json( )

json 메서드는 send 메서드와 달리 JSON 데이터 객체와 관련된 몇가지 기능들을 가지고 있다.

app.set('json replacer', replacer); // property transformation rules
app.set('json spaces', 2); // number of spaces for indentation

우선 Content-type을 application/json 으로 설정하고 argument로 받은 객체를 JSON.stringfy 메서드로 넘긴다. 해당 메서드들이 실행이 되고난 후에 res.json() 은 res.send() 를 호출하게 된다.결론적으로, 기능은 동일하지만 가독성 및 명시적으로 코드를 작성하기 위해서는 res.json() 을 사용하는 것이 바람직하다.

 

res.end( )

“There's a response and once we have collected the data or did something else we want to present that to the caller and as a last step we should end the session.”

 

전달해줄 데이터 없이 respose를 보내고 싶을때 사용할 수 있다.

res.status(404).end();

//404 응답코드로 응답을 하고 세션을 종료하라는 의미이다.

위의 예시와 달리 어떠한 데이터를 전달해주는 경우에는 어떨까? send 또는 json 메서드를 사용하면 된다! 두 메서드들 모두 데이터를 보내주고 응답을 종료한다. 추가적으로 종료해줄 필요가 없다.

res.end() does not send an ETag(Entity Tag) header for the HTTP response whereas res.send()

res.end() 는 ETag 헤더를 보내주지 않지만 res.send()은 ETag 헤더를 전달한다.

 

 

Conclusion

json, send 두 메소드 모두 응답 객체를 반환하는데 사용할 수 있고 추가작업 없이 응답을 정상적으로 종료시킬 수 있다.

 

차이점은 json 메서드는 데이터를 JSON 데이터로 포멧하는 추가적인 기능을 제공한다. 만약 이런 기능이 불필요하다면 send 메서드를 사용하면 된다.

 

 

Reference

https://yohanpro.com/posts/nodejs/express-response

 

Express res.send() vs res.json() vs res.end() 비교 - Yohan's Developer Diary

express는 Nodejs를 쓰는 사람이라면 모두가 안다고 할 정도로 유명한 웹 프레임워크다. express를 사용해서 response, request를 통해 주고 받고 하게 되는데 이 때 특히 response를 보내줄 때 헷갈리는 부분

yohanpro.com

https://tpiros.dev/blog/res-json-vs-res-send-vs-res-end-in-express/

 

res.json() vs res.send() vs res.end() in Express by Tamas Piros

In this article we are discussing the differences between the json(), send() and end() methods available as part of Express response object.

tpiros.dev

 

'BACKEND' 카테고리의 다른 글

Node.js와 Express.js  (0) 2022.08.19
[Express.js] 미들웨어  (0) 2022.08.19
[Express.js] 에러 핸들링  (0) 2022.08.19