웹 개발을 진행하면서 서버에 데이터를 요청할 때 종종 GET 메서드를 사용하게 됩니다.
개발을 진행하면서 GET 요청에서 body에 데이터를 담아 보내려는 시도를 했었습니다.
사용자가 특정 날짜의 식사 기록을 조회하는 기능을 구현해야 했습니다.
서버에 요청을 보내는 부분에서 GET 메서드를 사용했고
데이터를 요청 body에 담아 보냈습니다.
클라이언트와 서버 코드는 아래와 같습니다.
// 클라이언트: GET 요청에 body를 담아서 보냄
axios.get('/api/processed-foods', {
data: { user_id: '123', meal_date: '2024-10-15' },
});
// 서버: 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에 담긴 데이터를 받아오지 못하는 문제가 발생했습니다.
HTTP 표준에 따르면, GET 요청은 서버의 리소스를 조회할 때 사용됩니다.
리소스를 조회하기 위해서는 서버가 동일한 요청을 쉽게 인식할 수 있어야 하며,
이를 위해 URL과 쿼리 스트링만으로 요청을 구분합니다.
따라서 GET 요청에서는 body에 데이터를 담아도 이를 무시하게 됩니다.
캐시 가능 :
같은 요청을 여러 번 보내더라도, 이전 결과를 캐시에서 가져와 응답할 수 있습니다.
멱등성 보장 :
여러 번 같은 요청을 보내도 서버의 상태가 변하지 않습니다.
데이터 전달은 쿼리 스트링을 통해 이루어짐 :
body를 통한 데이터 전달은 지원하지 않습니다.
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
POST 메서드는 데이터를 서버로 전송하고 서버의 상태를 변경하기 위해 사용되는데,
단순히 데이터를 조회하는 작업이라면 GET을 사용하는 것이 적합합니다.
POST로 데이터를 조회할 수 있지만,
HTTP 메서드의 의도와 맞지 않는 방식이므로 추천되지 않습니다.
HTTP 메서드의 사용법에 대해 아직은 헷갈리는 것 같습니다.
이번 경험을 통해 GET 요청은 body를 지원하지 않고,
데이터를 전달할 때는 쿼리 스트링을 사용해야 한다는 사실을 배우게 되었습니다.