출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

상세 컨텐츠

본문 제목

res.json과 res.send의 차이

nodejs

by 장동균 2020. 9. 6. 16:59

본문

haeguri.github.io/2018/12/30/compare-response-json-send-func/

 

Express res.json과 res.send 비교 · Devlog

개인 프로젝트를 개발하면서 서버가 필요하게 되었는데 자바스크립트를 더 공부해보고 싶어서 서버를 Node.js, Express를 사용하여 개발하고 있다. 지금 작성된 모든 서버 API는 Express를 통해서 JSON �

haeguri.github.io

먼저, 이 글을 참고했다.

 

인스타그램 클론코딩에서 사용한 router 3개를 통해 설명하겠다.

 

router.post("/createpost", requireLogin, upload.single("image"), (req, res) => {
  const { title, body } = req.body;
  const { filename } = req.file;
  if (!title || !body || !filename) {
    return res.status(422).json({ error: "Plase add all the fields" });
  }
  req.user.password = undefined;
  //password의 값이 Post 내용에 저장되면 안되기 때문에 따로 처리해준다.
  const post = new Post({
    title,
    body,
    photo: filename,
    postedBy: req.user,
    //이곳에서 req.user를 가질 수 있는 이유는!!! 이 하나의 router가 실행되기 전 requireLogin
    // 미들웨어가 실행되기 때문이다. 미들웨어에서 토큰을 찾고 이 토큰을 바탕으로 사용자를 찾아
    // req.user에 저장했기 때문에 이곳에서 이런 식으로 사용이 가능해진다.
  });
  post
    .save()
    .then((result) => {
      res.send(result);
    })
    .catch((err) => {
      console.log(err);
    });
});

 

router.get("/mypost", requireLogin, (req, res) => {
  Post.find({ postedBy: req.user._id }) //이런 식의 비교가 잘 이해안가. 더 확인해봐야해 nodejs 339쪽을 참고해
    .populate("postedBy", "_id name")
    .then((mypost) => {
      res.json({ mypost });
    })
    .catch((err) => {
      console.log(err);
    });
});

 

 

router.delete("/deletepost/:postId", requireLogin, (req, res) => {
  Post.findOne({ _id: req.params.postId })
    .populate("postedBy", "_id")
    .exec((err, post) => {
      if (err || !post) {
        return res.status(422).json({ error: err });
      }
      if (post.postedBy._id.toString() === req.user._id.toString()) {
        post
          .remove()
          .then((result) => {
            res.json(result);
          })
          .catch((err) => {
            console.log(err);
          });
      }
    });
});

 

다른 코드는 볼 것 없이 then 부분을 중점적으로 보면 된다. 총 3가지의 것들이 나타나는데

 

1. res.send(result)

 

2. res.json(result)

 

3. res.json({result})      //코드에서는 mypost로 되어 있지만 비교를 위해 result로 명명하겠다.

 

 

먼저, 1번과 2번을 비교하겠다. (1번과 2번의 비교는 참고한 깃허브에 굉장히 자세히 설명되어 있다.) 처음에 이 두개가 무슨 차이가 있는지 몰라서 굉장히 헷갈렸는데 사실상 하는 기능은 동일하다고 생각하면된다.

 

하지만, json type을 전달하는 것이 확실하다면 res.send보다는 res.json을 활용하는 것이 훨씬 좋은 선택이다.

크게 두가지 이유가 있는데

 

첫째, res.json 이라는 표기를 통해 응답의 data type이 json이라는 것을 보는 사람이 쉽게 예측할 수 있게 된다.

 

두번째, res.send가 실행되는 순서는 사실상 res.send => res.json => res.send 라고 한다.

반면, res.json이 실행되는 순서는 res.json => res.send 라고 한다. 결국 res.json이 한단계 덜 거치게 되는 것이다.

 

 


2번과 3번의 차이는 오픈채팅에 물어보니 없다고 한다. 뭘 써도 상관없겠지만 2번을 쓰는 것이 더 가독성 있어 보일 것이라 생각한다.

 

이러한 이유들로 인해 res.json을 사용하는 것에 익숙해질 필요가 있겠다.

'nodejs' 카테고리의 다른 글

connect to mongoose  (0) 2020.09.06
multer를 통해 upload 폴더 속에 저장한 이미지 접근하기  (0) 2020.09.03

관련글 더보기

댓글 영역