백엔드 API를 개발 도중 어떤 기준에 의해 상태코드가 정해지는지 궁금했다.
내가 주로 사용한건 200,201,400,404다.
여기서 내가 사용한것이 어떤 식으로 사용 되어야 하는지 좀 더 알아보기로 했다.
200 : 클라이언트가 서버로 GET요청을 보내고 서버가 정상적으로 그 요청을 처리할 때 200 코드를 반환한다.
201 : 클라이언트가 서버로 POST,PUT 요청을 보내고 서버는 그 요청을 받아 새로운 리소스를 반환할 때 보통 쓰인다. POST 요청에만 사용했었는데 PUT 요청에도 사용해야겠다. 물론 200으로 사용해도 되지만 좀 더 명확히 하기 위해 사용했다.
400 : 클라이언트의 요청이 더 이상 유효하지 않아 작업을 진행하지 않을 때 쓰인다. 400번대가 특히 중요하다고 생각했다. 왜냐하면 요청이 거부되었을때 400번 코드만 달랑 받는다면 클라이언트는 매우 혼란스러울 것이다. 때문에 오류가 어디서 어떻게 발생했는지 구체적으로 명시해 주는게 좋아보인다.
404 : 클라이언트가 유효하지 않은 경로 혹은 자원을 요청 했을 때 사용하는 코드다. 경로 or 자원이라고 했는데 각 케이스 별로 어떻게 응답해야 하는지 좀 더 알아보자.(사실 REST에서 URI가 곧 자원이기에 경로와 자원을 딱 잘라 구분하는것은 옳지 않다. 단지 설명을 위하고자 구분했다.)
경로가 잘못된 경우 : 존재하지 않는 경로는 단순하게 404 코드만 보내면 된다.
자원이 잘못된 경우 : 자원의 경로는 개발자가 처리해줘야 한다. 아래 코드를 보면 /goods 까진 맞는 경로라고 하더라도 :goodsId(자원)이 먼저 유효한지를 확인해야 한다. 만약, 검사하지 않고 그냥 넘어가버리면 후속 작업 시 오류가 발생할 수 있다. 그 오류는 곧 서버의 오류로 이어진다. 즉, 경로가 옳다 하더라도 자원이 존재하지 않는다면 404 코드로 반환할 것.
router.put("/goods/:goodsId/cart", async (req, res) => {
const { goodsId } = req.params;
const { quantity } = req.body;
if (quantity < 1) {
res.status(400).json({ errorMessage: "수량은 1 이상이어야 합니다." });
return;
}
const existsCarts = await Cart.find({ goodsId: Number(goodsId) });
if (existsCarts.length) {
await Cart.updateOne({ goodsId: Number(goodsId) }, { $set: { quantity } });
}
res.json({ success: true });
});
오늘 공부하면서 클라이언트와 백엔드의 원활한 소통을 위해서라도 상태코드를 깊이 이해해야겠다고 생각했다. 소통은 쌍방이니 어느 한쪽만 고려할 수 없다!