● 이론0_GET 리퀘스트 복습
○ API 데이터 GET 하여, 출력 해보기
- js 코드 :
const url = new URL('https://learn.codeit.kr/api/color-surveys');
const res = await fetch(url);
const data = await res.json();
console.log(data);
- 출력 결과 :
{
count: 40,
next: 'https://learn.codeit.kr/api/color-surveys/?offset=10&limit=10',
previous: null,
results: [
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#33A560',
id: 40,
mbti: 'ESFJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#F011E5',
id: 39,
mbti: 'ISTP'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#771880',
id: 38,
mbti: 'INFJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#DB72B0',
id: 37,
mbti: 'ENTJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#AAF9A3',
id: 36,
mbti: 'INFJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#457E5A',
id: 35,
mbti: 'ESFP'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#C842CA',
id: 34,
mbti: 'ENFJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#4A2FE0',
id: 33,
mbti: 'ESFJ'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#DC7970',
id: 32,
mbti: 'INTP'
},
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#171823',
id: 31,
mbti: 'ESTJ'
}
]
}
○ API 데이터 중 원하는 특정 프로퍼티의 값만 추출 //Ex_ id값
- js 코드 :
const id = 20//id 변수수
const url = new URL(`https://learn.codeit.kr/api/color-surveys/${id}`);//id 대입
const res = await fetch(url);
const data = await res.json();
console.log(data);
- 출력 결과 :
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#EFB578',
id: 20,
mbti: 'ENFP'
}
○ API 데이터에 객체 데이터 추가하기 => POST 리퀘스트
- js 코드 :
//추가할 data 객체형
const surveyData = {
mbti :"ISTJ",
colorCode : "#ABCDEF",
password : "0000",
}
const res = await fetch('https://learn.codeit.kr/api/color-surveys',{
method : "POST",
body : JSON.stringify(surveyData),
headers :{
"Content-type" : "application/json",
}
});
const data = await res.json();
console.log(data);
- 출력 결과 :
{
createdAt: 1733544196518,
updatedAt: 1733544196518,
colorCode: '#ABCDEF',
id: 42,
mbti: 'ISTJ',
password: '0000'
}
● 이론1_API.js 제작 , export 호출 사용해보기 => [api.js] 생성 후, 사용
○ Argument를 limit, offset을 넣으면, API 데이터 반환하는 메소드 만들기
- api.js
//api.js
export async function getColorSurvey(params = {}) //디폴트 Parameter : 빈 객체
{
const url = new URL('https://learn.codeit.kr/api/color-surveys');
//전달받은 Parameter를 url에 전달하기
//문법이 좀 어려운데?
Object.keys(params).forEach((key)=>{
url.searchParams.append(key,params[key]);
});
const res = await fetch(url);
const data = await res.json();
return data;
}
//main.js
import { getColorSurvey } from './api.js';
//getColorSurvey()는 Promise 객체를 반환하므로, await을 해야 한다.
const data = await getColorSurvey({
offset : 10 , limit : 10 //queryParameter 대입
});
consolel.log(data);
※참고_ Parameter의 offset , limit를 전달하는 부분의 문법 정리
위 코드에서 사용된 문법은 JavaScript의 최신 기능을 활용한 부분입니다. 한 줄씩 나눠서 자세히 설명하겠습니다.
1. Object.keys(params)
- Object.keys: 주어진 객체의 "키"를 배열로 반환합니다.
const params = { offset: 10, limit: 10 }; const keys = Object.keys(params); // ['offset', 'limit']
- 여기서는 params 객체의 모든 키(속성 이름)를 배열로 반환합니다.
2. .forEach((key) => { ... })
- forEach: 배열의 각 요소에 대해 주어진 콜백 함수를 실행합니다.
- Object.keys(params)로 반환된 배열 ['offset', 'limit']의 각 요소에 대해 한 번씩 실행됩니다.
- 화살표 함수 ((key) => { ... })가 각 키에 대해 실행됩니다.
['offset', 'limit'].forEach((key) => { // 'key'는 배열의 각 요소 ('offset'과 'limit')가 순차적으로 대입됩니다. });
3. url.searchParams.append(key, params[key])
- url.searchParams: URL의 query string을 쉽게 관리할 수 있는 URLSearchParams 객체입니다.
- append(key, value): 특정 쿼리 파라미터를 추가합니다.
- key는 파라미터 이름 (예: 'offset').
- params[key]는 해당 키의 값 (예: 10).
const key = 'offset'; url.searchParams.append('offset', params['offset']); // offset=10 추가
- append(key, value): 특정 쿼리 파라미터를 추가합니다.
- 결과적으로 params 객체의 키-값 쌍이 URL의 쿼리 파라미터로 추가됩니다. 예를 들어:
- const params = { offset: 10, limit: 10 }; Object.keys(params).forEach((key) => { url.searchParams.append(key, params[key]); }); // url은 ?offset=10&limit=10 쿼리를 갖게 됨
전체 동작을 이해하기
- params 객체의 각 키-값 쌍을 query string 형태로 URL에 추가하는 역할입니다.
- 예제:
const params = { offset: 10, limit: 10 }; const url = new URL('https://learn.codeit.kr/api/color-surveys'); Object.keys(params).forEach((key) => { url.searchParams.append(key, params[key]); }); console.log(url.toString()); // 출력: "https://learn.codeit.kr/api/color-surveys?offset=10&limit=10"
코드 문법의 구성 요약
- Object.keys(params): 객체의 키를 배열로 반환.
- forEach: 각 키에 대해 반복 실행.
- url.searchParams.append: 키-값 쌍을 URL에 추가.
이를 통해 URL 쿼리 파라미터를 동적으로 생성할 수 있습니다.
○ Argument를 id을 넣으면, 특정 id의 API 데이터 반환하는 메소드 구현
//api.js
export async function getColorSurveyId(id)
{
const url = new URL(`https://learn.codeit.kr/api/color-surveys/${id}`);
const res = await fetch(url);
const data = await res.json();
return data;
}
//main.js
import { getColorSurveyId } from './api.js';
const data = await getColorSurveyId(19);
console.log(data);
- 출력 결과 :
{
createdAt: 1733540117000,
updatedAt: 1733540117000,
colorCode: '#10E479',
id: 10,
mbti: 'ESTJ'
}
○ Argument를 추가할 데이터로 설정하고, API에 데이터 추가해보기
//api.js
export async function createColorSurvey(surveyData)
{
const res = await fetch('https://learn.codeit.kr/api/color-surveys',{
method : "POST",
body : "application/json",
headers : {
"Content-tyoe" : "application/json",
},
});
return await res.json();
}
//main.js
import { createColorSurvey } from './api.js';
//추가할 설문 데이터
const surveyData = {
colorCode : "#ABCDEF",
mbti : "ISTJ",
password : "0000",
};
const data = await createColorSurvey(surveyData);
console.log(data);
- 출력결과 :
{
createdAt: 1733546203228,
updatedAt: 1733546203228,
colorCode: '#ABCDEF',
id: 43,
mbti: 'ISTJ',
password: '0000'
}
◎ 연습문제 :
실습 설명
API를 호출하는 함수들을 api.js 파일에 모아 놨습니다.
아바타를 수정하는 patchAvatar() 함수와 아바타를 삭제하는 deleteAvatar() 함수를 완성해 주세요.
patchAvatar() 함수는 https://learn.codeit.kr/api/avatars/:id에 PATCH 리퀘스트를 보내고 수정할 데이터를 리퀘스트 바디로 전달합니다.
이때 :id 부분에는 id 값이 들어갑니다. 리퀘스트가 성공하면 수정된 아바타 객체를 돌려줍니다.
deleteAvatar() 함수는 https://learn.codeit.kr/api/avatars/:id에 DELETE 리퀘스트를 보내고 바디로는 아무 내용도 전달하지 않습니다.
리퀘스트가 성공하면 삭제된 아바타 객체를 돌려줍니다.
실습 결과
{
createdAt: 1688090371000,
updatedAt: 1688461728468,
id: 3,
hairType: 'short3',
hairColor: 'blonde',
skin: 'tone300',
clothes: 'collarBasic',
accessories: 'headset'
}
● 해결 전략 :
API 리퀘스트에서 POST를, 수정은 "PATCH" , 삭제는 "DELETE"로 하면 된다.
=> DELETE 는 res 객체에 method만 적용하면 된다.
- 답 :
export async function getAvatars(params = {}) {
const url = new URL('https://learn.codeit.kr/api/avatars');
Object.keys(params).forEach((key) =>
url.searchParams.append(key, params[key])
);
const res = await fetch(url);
const data = await res.json();
return data;
}
export async function getAvatar(id) {
const res = await fetch(`https://learn.codeit.kr/api/avatars/${id}`);
const data = await res.json();
return data;
}
export async function createAvatar(avatarData) {
const res = await fetch('https://learn.codeit.kr/api/avatars', {
method: 'POST',
body: JSON.stringify(avatarData),
headers: {
'Content-Type': 'application/json',
},
});
const data = await res.json();
return data;
}
export async function patchAvatar(id, avatarData) {
const res = await fetch(`https://learn.codeit.kr/api/avatars/${id}`, {
method : "PATCH",
body : JSON.stringify(avatarData),
headers : {
"Content-Type" : "application/json",
},
});
const data = await res.json();
return data;
}
export async function deleteAvatar(id) {
const res = await fetch(`https://learn.codeit.kr/api/avatars/${id}`, {
method : "DELETE",
});
const data = await res.json();
return data;
}