200 (정상)
, 400 (잘못된 요청)
, 401 (보안 토큰 에러)
, 403 (권한 없음)
, 404 (찾을 수 없음)
정도가 있었다.404 Not Found
에러 코드로 같게 응답할 경우 다음과 같은 애매한 상황이 펼쳐질 수 있다.404
에러에 대한 대응을 에러로 표시할지 데이터 없음으로 표시할지 상황에 따라 다르게 정의해줘야 한다. 결과적으로 클라이언트에서 API 요청에 대한 처리가 복잡해진다.// front-endimport fetch from 'node-fetch'; function fetchUserList() { // 유저 목록을 가져오는 API를 사용한다고 가정 return fetch('https://api.exmaple.com/users') .then((response) => { if (response.statusCode === 404) { // 이 404 Http 상태 코드를 에러로 처리할 것인가? 데이터 없음으로 처리할 것인가? // 에러일 경우 : throw new Error('Not Found'); // 데이터 없음일 경우 : return []; } else if (response.statusCode === 200) { return response.json(); } else { throw new Error('Unexpected Http Status Code'); } }) .then(result => render(successPage, result)) .catch(error => render(failurePage, error));}
위에서 나온 결론을 조금 더 자세히 풀어보면 다음 내용이다.
// server-sideAPI.get('/orders/date/:date', async (request, response) => { // 특정 날짜의 주문을 검색. 특정 날짜에 주문이 없을 수도 있다. const { date } = request.params; const orders = await Repository.Order.findByDate(date); // 200: OK // 204: No Contents response.statusCode(orders.length > 0 ? 200 : 204).json(orders);});
API.get('/orders/:orderId', async (request, response) => { // 특정 ID의 주문을 검색. 데이터가 없으면 에러다. const { orderId } = request.params; const order = await Repository.Order.find(orderId); if (order.length > 0) { response.statusCode(200).json(order); } else { // 404: Not Found response.statusCode(404).json({ message: `${orderId} is Not Found` }); };});
404 Not Found
가 통상적으로 사용되지만 우리는 이미 404를 다른 용도로 사용하고 있다. 다행히도 HTTP 상태 코드에는 501 Not Implemented
이라는 좋은 친구가 있다. 이 친구를 사용할 수 있다.import { Users, Orders } from './Routes'; app.route('/users', Users);app.route('/orders' Orders);app.all('*', (request, response) => { // 501: Not Implemented (구현되지 않음) response.statusCode(501).json({ message: 'This Method is Not Implemented', });})
#플레이팅 #개발 #개발자 #인사이트 #경험공유 #조언 #꿀팁 #HTTP #버그 #버그수정 #문제해결