res.json() vs. res.send()
- 기능상으로 수행하는 작업은 거의 동일합니다.
- res.json() 와 res.send()로 object를 보냈을 때의 차이점
- object를 보내는 작업을 처리하는 순서에서 차이가 있습니다.
- res.json():
- 1. 전달하려는 object를 문자열로 stringify합니다.
- 2. 만약 Content-Type header이 세팅되지 않았을 경우 res 객체의 Content-Type header를 this를 사용해서 "application/json"으로 세팅 해줍니다.
- 3. res.send()를 사용해서 stringify해준 object를 보내줍니다.
- → 1. res.json(object) 2. res.send(string)
- res.send():
- 1. res.send()를 사용해서 무엇을 보내줬는지(type)를 파악합니다.
- 2. 만약 type이 object(객체)일 경우에는 res.json()을 사용합니다.
- res.json()은 객체를 stringify해서 res.send()를 호출하기 때문에 res.send()에서 string일 경우에 해당하는 코드를 결국 실행하게 됩니다.
- 3. type에 따라 Content-Type header를 설정해주고 전달받은 값을 return하게 됩니다.
- → 1. res.send(object) 2. res.json(object) 3. res.send(string)
- 결론:
- object를 전달할 때 res.json()과 res.send()의 차이점은 코드의 실행결과는 동일하지만 res.send()을 사용하면 코드(함수)를 한 번 더 실행하게 됩니다.
- res.json()을 사용하는 것이 함수명 자체가 무엇을 수행하는지에 대해서 더 직관적이기도 하기 때문에 object를 전송하는 경우에는 res.json()을 사용하는 것이 더 낫습니다.
- 코드 참고: https://github.com/expressjs/express/blob/master/lib/response.js
res.send() vs. res.end()
- res.send()와 res.end()는 기본적으로 수행하는 작업은 같을 수 있으나 함수를 사용하는 의도 자체가 다릅니다.
- res.send()는 직관적으로 무언가를 전송하는 작업을 수행하고 res.end()는 작업(세션)을 종료할 때 사용합니다.
- 그렇다면 res.end()는 언제 사용하는 것일까요?
- res.end()를 사용해야할 경우:
- 아무 데이터를 전송하지 않고 응답(response)를 종료하고 싶은 경우에는 res.end()를 사용해서 세션을 종료시켜줘야 합니다.
- Ex) res.status(404).end();
- res.end()를 사용하지 않아도 되는 경우:
- res.json() 혹은 res.send()를 사용하여 무언가를 전송하는 작업을 수행하면 자동으로 세션을 종료해줍니다.
- res.end()를 사용해야할 경우:
- res.send(<h1>Hi</h1>);는 괄호 안에 html 코드를 전송하는 의미를 담고 있고 res.end(<h1>Hi</h1>);는 html을 전송한 뒤 작업을 종료한다는 의미를 담고 있습니다.
- 수행하는 작업은 거의 동일하지만 함수를 사용하는 의도는 다릅니다.
- 차이점:
- res.end()를 사용한 response header에는 Content-Type와 ETag가 없습니다.
- ETag는 리소스의 버전 식별자입니다.
- 캐시의 효율적 사용과 대역폭을 절약할 수 있는 등 퍼포먼스에 좋은 영향을 끼치는 header 입니다.
- res.end()는 ETag가 없기 때문에 퍼포먼스의 이유 때문에 무언가를 전송할 때는 res.end()보다는 res.send()를 사용하는 것이 좋습니다.
Conclusion
- res.send()와 res.json()은 같은 작업을 수행하지만 res.send()는 함수를 한 번 더 실행해야 한다는 퍼포먼스 상의 이슈가 있기 때문에 object를 전송해야 하는 경우에는 더 직관적이기도 한 res.json()을 사용하는 것이 좋습니다.
- res.end()는 세션을 종료할 때만 사용합니다(무언가를 전송할 때는 res.json() 혹은 res.send()를 사용하는 것이 퍼포먼스가 더 좋습니다).
게으른 천재는 그냥 게으름뱅이일 뿐이다.
- @motive_write -
'개발' 카테고리의 다른 글
BE (3) - Express 백엔드 token 관련 해킹 예방하기 (0) | 2024.01.31 |
---|---|
BE (2) - PUT vs. PATCH (0) | 2024.01.25 |