HTTP(HyperText Transfer Protocol)
- ์ธํฐ๋ท์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ํ๋กํ ์ฝ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ์ฃผ๋ก HTML, CSS, JavaScript, ์ด๋ฏธ์ง, ๋์์ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ์กํ๋๋ฐ ์ฌ์ฉ
- HTTP๋ ์์ฒญ(Request)๊ณผ ์๋ต(Response)์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ์๋ฒ์ ์ ์กํ๊ณ , ์๋ฒ๋ ์ด์ ๋ํ ์๋ต ๋ฉ์์ง๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์กํฉ๋๋ค.
- ์์ฒญ๊ณผ ์๋ต ๋ฉ์์ง๋ ํค๋์ ๋ฐ๋๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ํค๋์๋ ์์ฒญ ํน์ ์๋ต์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๊ณ , ๋ฐ๋์๋ ์์ฒญ ๋๋ ์๋ต์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์์ผ๋ง ์๋ตํ ์ ์์ต๋๋ค.
- HTTP๋ ๋ณด์์ ์ธ ์ด์ ๋ก HTTPS(HTTP Secure)๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. SSL(Secure Sockets Layer) ๋๋ TLS(Transport Layer Security)๋ฅผ ์ด์ฉํ์ฌ ํต์ ๋ด์ฉ์ ์ํธํํ๋ฏ๋ก, ์ 3์๊ฐ ์ค๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ก์ฑ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- HTTP๋ ์น ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ๋น๋กฏํ ๋ค์ํ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ RESTful API, ์น ์๋น์ค ๋ฑ์์๋ ์ฌ์ฉ๋๋ฉฐ, ์ต๊ทผ์๋ ์น ์์ผ(Web Socket)์ด๋ผ๋ ๊ธฐ์ ์ ์ด์ฉํ์ฌ ์๋ฐฉํฅ ํต์ ์ ์ ๊ณตํ๊ธฐ๋ ํฉ๋๋ค.
ํต์ ๋ฐฉ์
HTTP ํต์ ์ ์์์ ์ธ๊ธํ๋ฏ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์์ฒญ๊ณผ ์๋ต์ผ๋ก ์ด๋ฃจ์ด์ง๋ ํต์ ์ ๋๋ค.
์ด๋ฌํ HTTP ํต์ ๋ฐฉ์์๋ ํฌ๊ฒ GET๊ณผ POST ๋ฐฉ์์ด ์์ต๋๋ค.
์ด์ธ์๋ PUT, DELETE, PATCH, OPTIONS ๋ฑ์ด ์์ต๋๋ค. ์ด๋ค์ ์ฃผ๋ก RESTful API์์ ์ฌ์ฉ ๋ฉ๋๋ค.
GET ๋ฐฉ์
- GET ๋ฐฉ์์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. URL์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ์ ์กํ๋ฉฐ, ๋ณดํต ์น ๋ธ๋ผ์ฐ์ ์์ ๋งํฌ๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ์ฃผ์์ฐฝ์ URL์ ์ง์ ์ ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- GET ๋ฐฉ์์ ์์ฒญ ์ ๋ณด๋ฅผ URL์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์บ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์, ๊ฐ์ ์์ฒญ์ ๋ฐ๋ณตํด์ ๋ณด๋ผ ๋, ์๋ฒ์์ ์ฒ๋ฆฌํ๋ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ํ์ง๋ง, ๋ณด์์ฑ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ ๋น๋ฐ๋ฒํธ๋ ๊ฐ์ธ ์ ๋ณด ๋ฑ์ ์ ์กํ ๋๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
POST ๋ฐฉ์
- POST ๋ฐฉ์์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. HTML form ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ , ์ ์ก ๋ฒํผ์ ๋๋ฌ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ์ ์กํฉ๋๋ค.
- POST ๋ฐฉ์์ ์์ฒญ ์ ๋ณด๋ฅผ URL์ ํฌํจํ์ง ์๊ธฐ ๋๋ฌธ์ ์บ์ฑ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, GET ๋ฐฉ์๋ณด๋ค ๋ณด์์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋น๋ฐ๋ฒํธ๋ ๊ฐ์ธ ์ ๋ณด ๋ฑ์ ์ ์กํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋น๋๊ธฐ ํต์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํต์ ํ ๋ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ์์ HTTP ์๋ต์ ๋ฐ๋ ๊ฒ์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ , ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- HTTP ๋น๋๊ธฐ ํต์ ์ ๊ตฌํํ๊ธฐ ์ํด์๋ XMLHttpRequest ๊ฐ์ฒด๋ Fetch API๋ฅผ ์ด์ฉํฉ๋๋ค. ์ด๋ค์ ์ด์ฉํ์ฌ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋ฐ์์ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
์์ฒญ ๋ฉ์์ง
1. Ajax(Asynchronous JavaScript and XML)
- JavaScript๋ฅผ ์ด์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ธฐ์ ์ ๋๋ค.
- Ajax๋ฅผ ์ด์ฉํ๋ฉด ์น ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ ๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ๋ฐ์ํ ์ ์์ต๋๋ค.
- Ajax๋ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์ด์ ๋ํ ์๋ต์ ์ฒ๋ฆฌ ํฉ๋๋ค.
์ด๋ฅผ ํตํด ์๋ฒ์์ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ํ๋ฉด์ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฅ์
- ์น ํ์ด์ง ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ฉํ์ง ์๊ณ ๋, ์น ํ์ด์ง์ ์ผ๋ถ๋ถ๋ง์ ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
- ์น ํ์ด์ง๊ฐ ๋ก๋๋ ํ์ ์๋ฒ๋ก ๋ฐ์ดํฐ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ์น ํ์ด์ง๊ฐ ๋ก๋๋ ํ์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ญ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
๋จ์
- Ajax๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ํด๋ผ์ด์ธํธ ํด๋ง ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก, ์๋ฒ ํธ์ ๋ฐฉ์์ ์ค์๊ฐ ์๋น์ค๋ ๋ง๋ค ์ ์์ต๋๋ค.
- Ajax๋ก๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ ์ ์์ต๋๋ค.
- Ajax ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ์๋ฒ๊ฐ ์๋ ๋ค๋ฅธ ์๋ฒ๋ก Ajax ์์ฒญ์ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ์ PC๋ก Ajax ์์ฒญ์ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
XMLHttpRequest ๊ฐ์ฒด
Ajax์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ตฌ์ฑ ์์๋ XMLHttpRequest ๊ฐ์ฒด ์ ๋๋ค.
์ด ๊ฐ์ฒด๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๐ฉ๐ป ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ํด์ ์๋ฒ์ ํต์ ํ ์ ์๋ ๊ฒ์ ๋ฐ๋ก ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ฉ๐ป ์ ์ฒด ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นจํ์ง ์์๋ URL์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฒ๋ฆฌ์ ํ๋ฆ
- XMLHttpRequest ๊ฐ์ฒด ์์ฑ
- ์์ฒญ ์ ์ก
- ์๋ต ์ฒ๋ฆฌ
1๏ธโฃ ๊ฐ์ฒด ์์ฑ
XMLHttpRequest ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ์ ์์ ์ผ๋ก ๋์๋ฉ๋๋ค.
(node.js ํ๊ฒฝ์์๋ ์ ๊ณต X)
const xhr = new XMLHttpRequest();
2๏ธโฃ ์์ฒญ ์ ์ก
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด์๋ HTTP Method, ์์ฒญ URL์ ์ ์ํ๋ ๊ฒ ๋ถํฐ ์์ํฉ๋๋ค.
(XMLHttpRequest์ ๋ด์ฅ ํจ์์ธ open()
์ ์ด์ฉ)
xhr.open('HTTP Method', '/์๋ฒ ์ฃผ์', ๋น๋๊ธฐ ์ฌ๋ถ(boolean));
// HTTP Method
// (1) GET(์์ฒญํ ๋(๋จ์ ์กฐํ, ๊ฒฝ๋ก๊ฐ ๋๋ฌ๋จ))
// (2) POST(์ธํ
ํ ๋(ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๋ฑ), ๊ฒฝ๋ก๊ฐ ๋๋ฌ๋์ง ์์)
// ์๋ฒ ์ฃผ์ : IP์ฃผ์, port๋ฒํธ, ๋ฐฑ์๋๊ฐ ์์ ํ ์ปจํธ๋กค๋ฌ
// ์ง ์ฃผ์(==ip์ฃผ์)์ ์ฌ๋ ๋๊ตฌ(==port๋ฒํธ)์ผ, ์ด๋ฐ ์ผ์ ํด!(์ปจํธ๋กค๋ฌ)
๐ก๋น๋๊ธฐ ์ฌ๋ถ(๊ธฐ๋ณธ ๊ฐ true)
open()
ํจ์์์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ HTTP Method, ์ฆ HTTP ์์ฒญ ๋ฐฉ์ ์
๋๋ค.
๐กDB์ CRUD์ ์ ์ฌํ..?!
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก HTTP ์์ฒญ์ ํ๊ธฐ ์ ์ ์์ฒญ์ ๋ง๋ ํค๋๊ฐ์ ์ค์ ํด์ผ ํฉ๋๋ค.
setRequestHeader()
ํจ์๋ฅผ ํตํด์ ์์ฒญ ํค๋ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ฒญํ ๋ ์๋ฒ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ์ ํ์ ์ ์ ์ธํ๊ธฐ ์ํ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
xhr.setRequestHeader('content-type','application/json');
๐ open()
ํจ์์ setRequestHeader()
ํจ์๋ก ์์ฒญ์ ํ์ํ ์ ์๊ฐ ๋๋๋ฉด ์ต์ข
์ ์ผ๋ก send()
ํจ์๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด ์์ฑ
xhr.open("POST", "/posts"); // HTTP Method, URL ์ ์
xhr.setRequestHeader("content-type", "application/json"); // ํค๋๊ฐ์ content-type ์ ์
const data = {
id : 100,
title :"XMLHttpRequest ์ ์กํ๊ธฐ",
author : "ํ๊ธธ๋"
};
xhr.send(JSON.stringify(data)); // JSON.stringify๋ฅผ ํตํด ์ค๋ธ์ ํธ๋ฅผ ๋ฌธ์์ด ํํ๋ก ๋ณ๊ฒฝํด์ ์ ์ก
3๏ธโฃ ์๋ต ์ฒ๋ฆฌ
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์์ฒญ์ ์ ์กํ๋ฉด ์๋ฒ๋ ์์ฒญํ ๊ฒฐ๊ณผ๋ฅผ ์๋ต ํฉ๋๋ค!!
๐ ํ ์คํธ
JSONPlaceHolder(https://json-placeholder.typicode.com/)์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ JSON ๋ฐ์ดํฐ API ์๋น์ค ์ ๋๋ค. ์ด ์๋น์ค๋ JSON ํ์์ผ๋ก ๊ตฌ์ฑ๋ ๋ค์ํ ์ ํ์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ค์ REST API๋ฅผ ํ ์คํธ ํ๊ฑฐ๋ ํ๋กํ ํ์ ์ ์์ฑํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ๋ฑ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ์ด์ฉํ ์ ์์ต๋๋ค.
JSONPlaceHolder์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์คํธ๋ฅผ ์ํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณต ํฉ๋๋ค.
- /posts
- /comments
- /albums
- /photos
- /todos
- /users
์ ํ ์คํธ ์ฌ์ดํธ๋ฅผ ์ด์ฉํ์์ต๋๋ค.
// XMLHttpRequest()๋ ํ์ ์์ ๊ฑธ ๋๊ฐ ์์ด์ ์๋ฒ์์ ์๋ต ์์ผ๋ฉด ๋ฌดํ๋๊ธฐ ๊ฑธ๋ ค๋ฒ๋ฆฌ๋ ๋จ์ ์ด ์๋ค.)
const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด ์์ฑ
xhr.open("POST", "https://jsonplaceholder.typicode.com/posts"); // HTTP Method, URI
xhr.setRequestHeader("content-type", "application/json"); // ํค๋ ๊ฐ content-type ์ ์
const data = {
// ์๋ ๋ณ์๋ค์ ์ถํ์๋ input์์ ๋ฐ์์จ ๊ฐ(~.value)์ด ๋ค์ด๊ฐ.
id : "test1",
pwd : "test!@#$1",
name : "ํ๊ธธ๋",
addr : "์์ธ์ ๊ฐ๋จ๊ตฌ"
}
xhr.send(JSON.stringify(data)); // XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋ฉ์๋
// GET์ open()์ ์ ๋ณด๋ฅผ ๋ค ๋ด์์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ send()๋ parameter๊ฐ ์์.
// POST๋ send()์ ์ ๋ณด๋ฅผ ๋ด์์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ํ์ธ ๋ถ๊ฐ
// XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ HTTP ์๋ต์ ๋ฐ์์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค์ ํ๋ ํ๋กํผํฐ
xhr.onload = () => { // onload() : ๋ก๋ฉ์ด ๋๋ฉด ...(์๋ฒ๊ฐ ์๋ต์ ์ฃผ๋ฉด) 'onload()'๊ฐ ๋ถ๋ ค์ง๋..์ฝ๋ฐฑ ํจ์
// XMLHttpRequest ๊ฐ์ฒด์์ ์์ฒญ์ด ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๋ ํธ์ถ๋๋ ํธ๋ค๋ฌ
if (xhr.status === 201) {
// ์ ์์ ์ผ๋ก ์๋ต๋๋ฉด status๊ฐ 200์ด๋ ํด๋น test ์ฌ์ดํธ๋ 201์ด ์ ์ ์๋ต์ธ๊ฐ ๋ด.
// const res = JSON.parse(xhr.response); // ์๋ต ๋ฐ์ดํฐ๋ฅผ JSON.parse ํจ์๋ก JSON ๊ฐ์ฒด๋ก ๋ณ๊ฒฝ
console.log(xhr.response);
} else {
// ์๋ฌ ๋ฐ์
console.error(xhr.status, xhr.statusText); // ์๋ต ์ํ์ ์๋ต ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ
}
};
2. Promise
Promise๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๋ด์ฅ ๊ฐ์ฒด ์ ๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋? ํน์ ์ฝ๋์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐฉ์์ ์๋ฏธ ํฉ๋๋ค.
์๋ ์น์ ์์ฒญ(request)์ ๋ํ ๋ฐ์(response)์ด ์์ฐจ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ณ , ๋จผ์ ์คํ๋ ์ฝ๋๊ฐ ์คํ์ด ์๋ฃ๋์ด์ผ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ Ajax(Asynchronous JavaScript and XML)๊ฐ ์ถ๊ฐ๋๋ฉด์ XMLHttpRequest ํต์ ์ด ๊ฐ๋ฅํด์ก๊ณ , ๊ทธ๋ผ์ผ๋ก์จ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ ํ ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์ ์์ด ๋ค์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ๋์์ต๋๋ค.
Promise๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ๋น๋๊ธฐ ํจ์์ธ Web API๋ฅผ ์คํํ ๋ ์คํํ ์ฝ๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ , ๋ฐ๋ก ๋ค์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ํด์ฃผ๊ณ , ๋น๋๊ธฐ ํจ์์ ์คํ์ด ์๋ฃ๋๋ฉด then() ํจ์๋ฅผ ํตํด์ ๊ทธ ๊ฒฐ๊ณผ์ ๋ํ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด๋ฅผ ์ฝ๊ฒ ์์๋ฅผ ํตํด ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
A๋ ํ์์ ํ ์์ ์ปค๋ฆฌํ๋ผ์ ๋ณด๊ณ ์ ์ฒญ์ ํ๊ณ ์ ํฉ๋๋ค. ํ์ง๋ง ์์ง ๋ชจ์ง ์ธ์์ด ๋ค ๋ชจ์ด์ง ์์์ ๊ฐ๊ฐํ๊ธฐ๊น์ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. ๊ทธ๋์ A๋ ํ์ ํ์ ์ค์ ๊ฐ๊ฐ ๋ ์ง๊ฐ ํ์ ์ด๋๋ฉด ์๋ ค๋ฌ๋ผ ํ๊ณ , ๋๊ธฐ๋ฅผ ๊ฑธ์ด๋๊ณ ์ง์ ์์ต๋๋ค.
A๋ ์์ ์ด ๊ฐ๊ฐ๋ ๋๊น์ง ๋ฏธ๋ฆฌ ๊ณต๋ถ๋ฅผ ํ๊ณ , ์๋ฐ๋ฅผ ํ๋ฉฐ ์ผ์ ์ํ์ ๋ณด๋ ๋๋ค.
๋ฉฐ์น ํ, ํ์์์ ๊ฐ๊ฐ ๋์๋ค๋ ์ฐ๋ฝ์ ๋ฐ๊ณ A๋ ์์ ์ ๋ค์ผ๋ฌ ํ์์ ๊ฐ๋๋ค.
์ด๋ค๊ฐ์? ์ดํด๊ฐ ์ฝ๊ฒ ๋์๋์? ใ ใ
๋จธ๋ฆฌ๋ก ์ดํดํ ๊ฒ์ ๊ธ๋ก ์ค๋ช ํ๋ ๊ฒ์ ์ธ์ ๋ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค.๐
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
// GET - ์ ๋ณด ์กฐํ
// ์
๊ณ ๊ธฐ๋ณธ ๊ฐ์ GET ๋ฐฉ์, JSON ํํ์ด๊ธฐ ๋๋ฌธ์ ์๋ฃ์ด๋ ์ ๋ณด๋ ๋์ด์ด.
fetch("https://jsonplaceholder.typicode.com/posts/1") // userId 1์ธ ๊ฐ์ฒด๋ง ์์ฒญ
.then((response) => response.json())
.then((json) => console.log(json))
.catch((error) => console.error(error));
// POST - ๋ฐ์ดํฐ ์์ฑ
fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
body: JSON.stringify({
//์ ์กํ ๋ฐ์ดํฐ
title: "ํ
์คํธ ์
๋๋ค.",
userName: "ํ๊ธธ๋",
userId: "test1",
}),
headers: {
//ํค๋ ๊ฐ ์ ์
"content-type": "application/json; charset=UTF-8", //content-type ์ ์
},
})
.then((response) => response.json())
.then((json) => console.log(json));
// PUT - ๋ฐ์ดํฐ ์์
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "PUT",
body: JSON.stringify({
id: 1,
title: "PUT ํ
์คํธ",
body: "bar",
userId: 1,
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
},
})
.then((response) => response.json())
.then((json) => console.log(json));
// DELETE - ๋ฐ์ดํฐ ์ญ์
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "DELETE",
});
// ์๋ก์ด Promise๋ฅผ ๋ง๋ค ๋, executor ํจ์๊ฐ ์๋์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ํ์ํ ๋์๋ง ํต์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ ๋์๋ ์ ํฉํ์ง ์์.
// ์ฆ ๋ถํ์ํ ๋คํธ์ํฌ ํต์ ์ ํ๊ฒ ๋ ์ ์์
const promise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์์
()...(๋คํธ์ํฌ, ํ์ผ ์ฝ๊ธฐ ๋ฑ)
console.log("์์
์ค...");
setTimeout(() => {
// resolve('kongmi');
reject(new Error("๋คํธ์ํฌ๊ฐ ์์ต๋๋ค."));
}, 2000);
});
promise
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
})
.finally(() => { // ์ฑ๊ณต ์ฌ๋ถ ์๊ด์์ด ๋ฌด์กฐ๊ฑด.
console.log('finally!!!');
});
// ์ฐ๊ฒฐํ๊ธฐ
const fetchNumber = new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000);
});
fetchNumber
.then(num => num * 2)
.then(num => num * 3)
.then(num => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num - 1), 1000);
});
})
.then(num => console.log(num)); // 5
3. Async / Await
Async/Await ์ญ์ Promise์ ๋์ผํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
Async๋ ๋ง ๊ทธ๋๋ก ๋น๋๊ธฐ ์คํ์ ๋งํ๋ฉฐ, Await์ ๋น๋๊ธฐ๋ฅผ ์คํํ๋๋ฐ ๊ฒฐ๊ณผ๊ฐ ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค๋ ์๋ฏธ ์ ๋๋ค.
Async/Await์ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ๋์ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ ๋ ํจ์ ์์ await์ ์ ์ํ๋ฉด ๋น๋๊ธฐ ํจ์๊ฐ ์คํ๋๊ณ , ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ ๋๊น์ง ๋๊ธฐํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ผ๋ฉด ์คํ๋๋๋ก ํด์ค๋๋ค.
await์ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ฑ๋ ํจ์๋ ๋ฐ๋์ async์ฌ์ผ ํฉ๋๋ค.
ํจ์ ํค์๋์ธ function ์์ async ํค์๋๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
async function myFunction() {
const res1 = await fetch(
"https://jsonplaceholder.typicode.com/posts/1"
);
const res1Json = await res1.json();
console.log(res1Json);
const res2 = await fetch(
"https://jsonplaceholder.typicode.com/posts/1",
{
method: "PUT",
body: JSON.stringify({
id: 1,
title: "foo",
body: "bar",
userId: 1,
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
},
}
);
const res2Json = await res2.json();
console.log(res2Json);
}
myFunction();
'๐จ Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript/HTML - DOM์ด๋? (0) | 2025.01.08 |
---|---|
๐ฆVanilla JS (12) ES5, ES6 (0) | 2023.04.08 |
๐ฆVanilla JS (10) JSON (0) | 2023.04.05 |
๐ฆVanilla JS (9) ์ ๊ท ํํ์ (0) | 2023.04.05 |
๐ฆVanilla JS 8-(2) ์ด๋ฒคํธ ๊ฐ์ฒด์ this + ์ํ ์๋งค ํ๋ก๊ทธ๋จ (2) | 2023.04.03 |