유데미 강의 JavaScript 완벽 가이드 : 초급 + 고급 마스터 과정을 들으면서 자바스크립트를 다시 한 번 익히는 중이다. 계속되는 포스팅에서 강의를 듣고 미처 몰랐던 부분, 심화 이해가 필요한 부분에 대해 주제별로 간단하게 기록하겠다.
https://jsonplaceholder.typicode.com/posts에서
도메인 : jsonplaceholder.typicode.com
경로(path) : /posts
const listEl = document.querySelector('.posts');
const postTemplate = document.getElementById('single-post');
const form = document.querySelector('#new-post form');
const fetchBtn = document.querySelector('#available-posts button');
const postList = document.querySelector('ul');
function sendHttpRequest(method, url, data) {
// fatch 자체가 프로미스이기 때문에 프로미스 래퍼를 생성할 필요없음
// response 객체에 대해 JSON을 호출하면 fetch API가 해당 response 본문을 파싱하고 이를 JSON에서 JavaScript 객체와 배열로 변환하는 작업을 한다.
return fetch(url, {
method,
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json',
},
})
.then((response) => {
if (response.status >= 200 && response.status < 300) {
return response.json();
} else {
return response.json().then((errData) => {
console.log(errData);
throw new Error('something Wrong! - server-side');
});
}
})
.catch((error) => {
console.log(error);
throw new Error('something Wrong!');
});
}
async function fetchPosts() {
try {
const responseData = await sendHttpRequest(
'GET',
'https://jsonplaceholder.typicode.com/posts'
);
const posts = responseData;
for (const post of posts) {
const postEl = document.importNode(postTemplate.content, true);
postEl.querySelector('h2').textContent = post.title.toUpperCase();
postEl.querySelector('p').textContent = post.body;
postEl.querySelector('li').id = post.id;
listEl.append(postEl);
}
} catch (error) {
alert(error.message);
}
}
async function createPost(title, content) {
const userId = Math.random();
const post = {
title,
body: content,
userId,
};
sendHttpRequest('POST', 'https://jsonplaceholder.typicode.com/posts', post);
}
fetchBtn.addEventListener('click', fetchPosts);
form.addEventListener('submit', (e) => {
e.preventDefault();
const enteredTitle = e.currentTarget.querySelector('#title').value;
const enteredContent = e.currentTarget.querySelector('#content').value;
createPost(enteredTitle, enteredContent);
});
postList.addEventListener('click', (e) => {
if (e.target.tagName === 'BUTTON') {
const postId = e.target.closest('li').id;
sendHttpRequest(
'DELETE',
`https://jsonplaceholder.typicode.com/posts/${postId}`
);
}
});