
API, 백엔드와 연관이 많은 개념이다. 오늘 건 콜백 지옥때문에 어려운 부분이 있었다. 그리고 자바에도 있긴 했지만, 자바와는 조금 다른 개념이였어서 생소해서 그런지 쉽지 않았다. 코드와 개념을 차근차근 정리해보자!
Application Programming Interface



JSONPlaceholder API
// JSONPlaceholder API 사용해 가짜 데이터로 CRUD 작업 하기
주는 open API
// get 요청
// 특정 게시물을 가져오는 함수
const getPost = () => {
fetch("https://jsonplaceholder.typicode.com/posts/1")
.then((res) => res.json())
.then((data) => {
console.log(data);
});
};

// post 요청
// 새로운 게시물 생성하는 함수
// fetch가 Jsonapi와 통신해서 json형태로 데이터를 가져오기 때문에, js->json 필요
const postPost = () => {
fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
// js -> Json
body: JSON.stringify({
Title: "제목제목제목",
body: "게시물 내용 내용 내용",
userId: 1,
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
},
})
.then((response) => response.json())
.then((data) =>
// 브라우저에 렌더링 등 응답으로 받은 데이터를 사용
console.log(data)
)
.catch((err) => {
// 에러 발생 시 원하는 에러 처리
console.log("err : ", err);
});
};

// delete 요청
const deletePost = () => {
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "DELETE",
})
.then((response) => response.json())
.then((data) => console.log("Delete!"))
.catch((err) => console.log("err : ", err));
};




// promise를 사용해 비동기 처리를 구현하는 예시
const id2 = "layla";
let userId2;
// todo new promise 만들기
const promise = new Promise((resolve, reject) => {
console.log("Promise 시작");
setTimeout(() => {
userId2 = "layla01"; // 서버에서 아이디 받아옴
if (userId2 === id2) {
resolve(userId2); // 성공하면 userId2값 전달
} else {
reject(new Error("서버에서 사용자의 아이디를 받아오는 것을 실패함"));
}
}, 2000);
});
// 성공하면 then부분 코드실행 (resolve)
.then((data) => {
console.log(`userId는 ${data}입니다.`);
})
// 실패하면 catch 실행 (reject)
.catch((error) => {
console.log(error);
})
// 마지막 무조건적으로 실행
.finally(() => {
console.log("Promise 종료");
});
const id = "layla01"; // 성공
// const id = "layla"; // 실패
let userId;
// Promise를 함수에 담아 해당 함수 호출 시 Promise가 실행되도록 작성
const promiseFunc = () => {
return new Promise((res, rej) => {
console.log("promise 시작");
// 서버에서 데이터 받아오는 시간 대체
setTimeout(() => {
userId = "layla01";
if (userId === id) {
res(userId); // 성공하면 아이디 자체 반환
} else {
rej(new Error("서버에서 사용자의 아이디를 받아오는 것을 실패함"));
}
}, 2000);
}); // Promise 자체를 반환
};
const checkUserId = async () => {
try {
const result = await promiseFunc(); // promiseFunc()이 실행될때까지 기다림
console.log(result);
// try하다가 문제발생하면 바로 catch절로 넘어감
} catch (error) {
console.log(error);
} finally {
console.log("Promise 종료");
}
};
checkUserId();

const jsonString =
'{"name":"장화","age":13,"isEmployed":true,"position": "이사", "address":{"gu":"마포구","city":"서울시"}}';
// console.log(jsonString.name); // undefined -> js객체처럼 바로 사용할 수 없음!
// json을 js로 파싱
const obj = JSON.parse(jsonString);
console.log(obj);
console.log(obj.name);
// js객체 -> json으로 파싱
const jsonStr = JSON.stringify(obj);
cosole.log(jsonStr);
// * open API 사용
console.log("------------------open api 사용---------------------");
// 고양이 사진 가져오기
// fetch로 json과 통신
fetch("https://api.thecatapi.com/v1/images/search")
.then((response) => { // response 응답객체 (텍스트)
// response를 파싱하여 json 형식의 (js에서 사용할 수 있는) 객체/배열로 반환
return response.json(); // 파싱
})
// 파싱된 값(json)이 data로 들어감
.then((data) => {
console.log(data);
// img 태그 생성
const img = document.createElement("img");
img.src = data[0].url;
img.setAttribute("width", 500);
// 생성한 img를 div cat에 추가 -> 고양이 사진 화면출력
document.querySelector("#cat").append(img);
});

❓ 여기서, json으로 파싱하는 이유가 이해가지 않았다. fetch하여 api가져온 값은 json값이라고 생각했다.

-> 그러나, fetch를 통해 가져온 값은 http형식의 객체, 즉 텍스트 형식이고 텍스트형식은 자바스크립트에서 사용이 어렵기에 자바스크립트에서 사용가능한 객체인 json으로 변환했다는 것이다.
💡그렇다면, json은 자바스크립트에서 사용가능한 객체인데, 왜 굳이 js코드를 json으로 변환 (stringify)하는걸까 의문이 들었다.
->데이터를 교환하거나 저장하는 과정에서는 자바스크립트 객체를 직접 전송할 수 없기 때문이다.
// * OMDB api 사용해 영화 데이터 받아와 브라우저에 보여주기
async function getMovieData() {
// '영화받아오기' 클릭하면 다음 키워드 뜬다.
let word = "love";
const h3 = document.querySelector("h3");
h3.innerText = `검색된 키워드 : ${word}`;
// 1. fetch로 데이터 불러오기 (api 데이터 불러오기)
// response 변수에는 서버에서 받아온 데이터가 저장됨 (json)
// ! 받은 키는 github에 올리면 안된다.
// 받은키에 &s붙인다.
const response = await fetch(`받은키&s=${word}`); // 객체형태
const movieData = await response.json(); // 객체를 json으로 변환
console.log(movieData.Search);
// ul태그 (포스터)
const ul = document.querySelector("ul");
ul.innerText = ""; // 새로 버튼 눌렀을때, 밑에 포스터 추가 안되게 하는 코드
// 2. 불러온 데이터 각 변수에 담고 태그에 추가하기
// 불러온 데이터는 movieData.Search 배열 안에 각각의 객체로 있음
// movieData.Search 배열을 반복문을 통해 돌아서 각 요소를 만들고 DOM에 추가
for (let movie of movieData.Search) {
// 태그 생성
const img = document.createElement("img"); // 영화 카드 컨테이너
const div = document.createElement("div"); // 영화 포스터
const p = document.createElement("p"); // 영화 제목
// 태그변수에 api 배열 데이터값 넣기
img.src = movie.Poster;
img.alt = movie.Title;
p.innerText = movie.Title;
// div 태그를 ul에 추가
div.append(img, p);
ul.append(div);
}
}

export function consoleName(name) {
console.log(`당신의 이름은 ${name}`);
}
export function consoleName2(name) {
console.log(`당신의 이름은 ${name} 222`);
}
// ? default 키워드 작성 시 해당 함수가 이 파일의 대표 함수가 된다.
export default function consoleName2(name) {
console.log(`당신의 이름은 ${name} main 함수`);
}
// ? 한번에 모아서 export 작성 가능
export { consoleName, consoleName2 };
function consoleName(name) {
console.log(`당신의 이름은 ${name}`);
}
function consoleName2(name) {
console.log(`당신의 이름은 ${name} 222`);
}
// export만 작성시 (default 작성x) 중괄호에 감싸서 작성
import { consoleName, consoleName2 } from "./02_util.js";
// export default 키워드 작성시 중괄호 감싸지 않고 불러옴
// import consoleNameMain from "./02_util.js";
/ 한 줄로 default 함수와 다른 함수들도 불러올 수 있음
// import consoleNameMain, { consoleName, consoleName2 } from "./02_util.js";
consoleName("layla"); // '당신의 이름은 layla'
consoleName2("layla"); // '당신의 이름은 layla 222'
// util.js에서 작성된 consoleName이 불러와져서 사용됨.
<script type="module" src="./02_import.js"></script>