언어 및 도구들 공부/Javascript

axios get, put, post 요청에서의 주소 파라미터 차이

Dr.Mlem 2024. 9. 7. 15:06
response = await axios.get(blogOrCafe, { params:{ query:queryKeyword, page:currentPage, size:10 } });

만약 이런 수식이였다면,

response = await axios.get(blogOrCafe, { query:queryKeyword, page:currentPage, size:10 });

이렇게 바꿔도 되는거야?
 

ChatGPT said:

ChatGPT

params 객체를 생략하고 바로 파라미터를 추가하는 방식으로 코드를 변경하면, 제대로 작동하지 않습니다. 이유는 axios.get 메소드가 받는 옵션 객체에서 params는 특정 역할을 하는 키워드이기 때문입니다.

기존 코드

javascript
Copy code
response = await axios.get(blogOrCafe, { params: { query: queryKeyword, page: currentPage, size: 10 } });

위 코드에서 params는 axios가 요청에 쿼리 문자열을 자동으로 추가하도록 지시하는 데 사용됩니다. params 객체 안에 정의된 키-값 쌍은 쿼리 문자열로 변환되어 URL에 추가됩니다.

변경한 코드 (잘못된 방법)

javascript
Copy code
response = await axios.get(blogOrCafe, { query: queryKeyword, page: currentPage, size: 10 });

이 코드에서 query, page, size는 params 객체로 전달되지 않고, axios가 요청을 보낼 때 사용할 수 없는 일반 객체의 키-값 쌍으로 취급됩니다. 따라서 axios는 이를 쿼리 파라미터로 해석하지 않고, 요청이 제대로 작동하지 않을 것입니다.

올바른 방식

params 키를 유지하여 쿼리 파라미터를 전달해야 합니다:

javascript
Copy code
response = await axios.get(blogOrCafe, { params: { query: queryKeyword, page: currentPage, size: 10 } });

이렇게 하면 axios가 자동으로 쿼리 문자열을 생성하여 요청을 보냅니다.

요약

params를 생략하고 파라미터를 직접 추가하면 작동하지 않습니다. axios가 쿼리 파라미터로 인식할 수 있도록 params 객체를 사용해야 합니다.

 
 

You said:

response = await axios.put(http://localhost:3001/department/${id}, { dname:dname, loc:loc }); 여기서는 이렇게 썼는데, 이건 되는데 무슨 차이야?
 

ChatGPT said:

ChatGPT

좋은 질문입니다! axios.put 요청과 axios.get 요청 사이에는 중요한 차이점이 있습니다. 이 차이점이 바로 당신이 물어본 동작의 차이점에 대한 이유입니다.

차이점: GET과 PUT 요청에서의 데이터 전송 방식

  1. GET 요청:
    • GET 요청은 일반적으로 데이터를 가져올 때 사용됩니다.
    • GET 요청에서는 데이터를 URL의 **쿼리 문자열(query string)**을 통해 서버에 전달합니다. 예를 들어, http://localhost:3001/department?id=123&name=test처럼 URL의 끝에 ? 뒤에 데이터가 붙습니다.
    • axios에서는 params 옵션을 사용하여 이러한 쿼리 문자열을 구성하도록 지원합니다.
  2. PUT 요청:
    • PUT 요청은 일반적으로 서버에 데이터를 업데이트하거나 생성할 때 사용됩니다.
    • PUT 요청에서는 데이터를 **요청 본문(body)**에 포함하여 서버로 전송합니다.
    • axios.put 메소드를 사용할 때, 두 번째 인자로 전달한 객체({ dname: dname, loc: loc })는 요청의 본문(body)에 포함됩니다. 서버는 이 본문을 읽어서 데이터를 처리하게 됩니다.

예시 코드 설명

  • axios.get 코드:
javascript
Copy code
response = await axios.get(blogOrCafe, { params: { query: queryKeyword, page: currentPage, size: 10 } });

여기서 params는 쿼리 문자열에 데이터를 추가하기 위한 옵션입니다. GET 요청은 데이터를 URL의 쿼리 문자열로 서버에 전달하기 때문에, params를 사용해야 합니다.

  • axios.put 코드:
javascript
Copy code
response = await axios.put(`http://localhost:3001/department/${id}`, { dname: dname, loc: loc });

여기서는 PUT 요청이므로 데이터를 요청 본문(body)에 포함하여 전송합니다. 따라서 params 옵션 없이도 axios.put 메소드의 두 번째 인자로 데이터 객체를 직접 전달할 수 있습니다. 이 데이터는 HTTP 요청의 본문으로 전송되며, 서버는 본문에 포함된 데이터를 받아 처리하게 됩니다.

정리

  • GET 요청에서는 데이터를 URL 쿼리 문자열로 전달해야 하므로 params를 사용해야 합니다.
  • PUT 요청에서는 데이터를 요청 본문에 포함하므로, params 대신 데이터를 직접 전달할 수 있습니다.

이 차이가 GET과 PUT 요청에서의 동작 방식 차이로 이어집니다.

 
axios.put이 아니라 post이던데?
 
 

ChatGPT said:

ChatGPT

axios.post와 axios.put 사이의 차이점도 axios.get과 axios.put의 차이와 비슷한 방식으로 설명할 수 있습니다. POST와 PUT 모두 데이터를 서버로 전송할 때 사용되며, 데이터는 요청 본문(body)에 포함됩니다. 따라서, 아래와 같은 axios.post 코드는 동일하게 작동할 수 있습니다.

POST와 PUT의 차이

  1. POST 요청:
    • POST 요청은 일반적으로 서버에 새 리소스를 생성하거나 데이터를 제출할 때 사용됩니다.
    • 데이터는 요청 본문(body)에 포함되며, 서버는 이를 처리하여 새로운 리소스를 생성하거나 기존 리소스를 업데이트합니다.
  2. PUT 요청:
    • PUT 요청은 일반적으로 서버의 기존 리소스를 대체하거나 업데이트할 때 사용됩니다.
    • PUT은 일반적으로 리소스의 전체 교체를 의미합니다. 일부 API에서는 PUT 요청 시 모든 필드를 포함해야 하며, 그렇지 않으면 누락된 필드는 삭제될 수 있습니다.

예시 코드 설명

axios.post 코드

javascript
Copy code
response = await axios.post(`http://localhost:3001/department/${id}`, { dname: dname, loc: loc });
  • 여기서 axios.post 메소드를 사용하여 데이터({ dname: dname, loc: loc })를 요청 본문에 포함하여 서버로 전송합니다.
  • POST 메소드는 새 리소스를 생성하거나, 데이터를 서버에 제출하여 처리하는 데 주로 사용됩니다.
  • PUT과 마찬가지로, params 없이 데이터를 본문으로 직접 전달할 수 있습니다.

POST와 PUT 사용 시의 차이점

  • 데이터의 전송 위치: GET과 달리, POST와 PUT은 둘 다 데이터를 요청 본문에 포함합니다. 따라서, 두 메소드 모두 params 대신 본문 데이터를 전달할 수 있습니다.
  • 사용 목적:
    • POST는 새로운 데이터를 추가하거나 리소스를 생성할 때 사용합니다.
    • PUT은 기존 리소스를 대체하거나 업데이트할 때 사용합니다.

결론

  • axios.post와 axios.put 모두 데이터를 요청 본문에 포함하므로, { dname: dname, loc: loc } 형식으로 전달할 수 있습니다.
  • GET 요청은 데이터를 URL 쿼리 문자열로 전달해야 하므로 params 옵션이 필요하지만, POST와 PUT은 본문에 데이터를 포함하므로 params가 필요하지 않습니다.