개발

BE (1) - res.json() vs. res.send() vs. res.end()

dongsunseng 2024. 1. 24. 13:18
반응형

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.send(<h1>Hi</h1>);는 괄호 안에 html 코드를 전송하는 의미를 담고 있고 res.end(<h1>Hi</h1>);html을 전송한 뒤 작업을 종료한다는 의미를 담고 있습니다. 
    • 수행하는 작업은 거의 동일하지만 함수를 사용하는 의도는 다릅니다.
    • 차이점
      • res.end()를 사용한 response header에는 Content-TypeETag가 없습니다.
      • 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