HTTP GET 요청과 Body 사용

henry·2024년 10월 15일

웹 개발을 진행하면서 서버에 데이터를 요청할 때 종종 GET 메서드를 사용하게 됩니다.
개발을 진행하면서 GET 요청에서 body에 데이터를 담아 보내려는 시도를 했었습니다.


1. 문제 상황: GET + body?

사용자가 특정 날짜의 식사 기록을 조회하는 기능을 구현해야 했습니다.
서버에 요청을 보내는 부분에서 GET 메서드를 사용했고
데이터를 요청 body에 담아 보냈습니다.
클라이언트와 서버 코드는 아래와 같습니다.

  • 클라이언트 코드 (React + Axios)
// 클라이언트: GET 요청에 body를 담아서 보냄
axios.get('/api/processed-foods', {
  data: { user_id: '123', meal_date: '2024-10-15' },
});
  • 서버 코드 (Express)
// 서버: req.body로 데이터 꺼내기 시도
const getAllProcessedFoods = async (req, res) => {
   let { user_id, meal_date } = req.body; // req.body 사용

   // 데이터 조회
   const { data: allProcessedfood, error } = await supabase
      .from('meal_log')
      .select('*')
      .eq('user_id', user_id)
      .eq('meal_date', meal_date);

   if (error) return res.status(400).json({ error: error.message });

   res.status(200).json(allProcessedfood);
};

클라이언트에서 요청을 보내도 서버가 body에 담긴 데이터를 받아오지 못하는 문제가 발생했습니다.


2. GET + body를 사용할 수 없는 이유

HTTP 표준에 따르면, GET 요청은 서버의 리소스를 조회할 때 사용됩니다.
리소스를 조회하기 위해서는 서버가 동일한 요청을 쉽게 인식할 수 있어야 하며,
이를 위해 URL과 쿼리 스트링만으로 요청을 구분합니다.

따라서 GET 요청에서는 body에 데이터를 담아도 이를 무시하게 됩니다.

GET 메서드의 특징

  • 캐시 가능 :
    같은 요청을 여러 번 보내더라도, 이전 결과를 캐시에서 가져와 응답할 수 있습니다.

  • 멱등성 보장 :
    여러 번 같은 요청을 보내도 서버의 상태가 변하지 않습니다.

  • 데이터 전달은 쿼리 스트링을 통해 이루어짐 :
    body를 통한 데이터 전달은 지원하지 않습니다.


3. 해결 방안

방법 : GET 요청 + 쿼리 스트링 사용하기

GET 요청에서 데이터를 전달할 때는 쿼리 스트링(query string)을 사용해야 합니다.
아래는 기존 코드를 수정하여 쿼리 스트링을 사용하는 예시입니다.

// req.query로 데이터 받기
const getAllProcessedFoods = async (req, res) => {
   let { user_id, meal_date } = req.query;  // req.query에서 데이터 추출

   const { data: allProcessedfood, error } = await supabase
      .from('meal_log')
      .select('*')
      .eq('user_id', user_id)
      .eq('meal_date', meal_date);

   if (error) return res.status(400).json({ error: error.message });

   res.status(200).json(allProcessedfood);
};

이렇게 요청하면 서버는 아래와 같은 URL을 받게 됩니다:

GET /api/processed-foods?user_id=123&meal_date=2024-10-15

4. POST는 대안이 아닌 이유

POST 메서드는 데이터를 서버로 전송하고 서버의 상태를 변경하기 위해 사용되는데,
단순히 데이터를 조회하는 작업이라면 GET을 사용하는 것이 적합합니다.

POST로 데이터를 조회할 수 있지만,
HTTP 메서드의 의도와 맞지 않는 방식이므로 추천되지 않습니다.


5. 결론

HTTP 메서드의 사용법에 대해 아직은 헷갈리는 것 같습니다.
이번 경험을 통해 GET 요청은 body를 지원하지 않고,
데이터를 전달할 때는 쿼리 스트링을 사용해야 한다는 사실을 배우게 되었습니다.

0개의 댓글