๐ Chapter 9 : ์ธ๋ถ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ผ.
๐ฏ ํ๋ผ๋ฏธ์ค๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ผ.โ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ์ธ์ด์ด๋ค. ๋น๋๊ธฐ ์ธ์ด๋ ๊ทธ์ ์ด์ ์ ์ฝ๋๊ฐ ์์ ํ ํด๊ฒฐ๋์ง ์์๋ ์ด์ด์ง๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ธ์ด๋ฅผ ์๋ฏธํ๋ค.
- ๋น๋๊ธฐ ์ฝ๋์ ๋๊ธฐ ์ฝ๋์ ์ฐจ์ด์ ์ฐธ๊ณ
- ๋น๋๊ธฐ ์ธ์ด์ ๊ฐ์น๋ ์ง์ฐ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด ์ ๋ณด๊ฐ ํ์ํ์ง ์์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค๋ ์ ์ ์๋ค. (์ง์ฐ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฝ๋๊ฐ ๋ฉ์ถ์ง ์๋๋ค.)
- ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฒ์ธ ํ๋ผ๋ฏธ์ค(Promise)๊ฐ ์๋ค. (๋ชจ๋ JavaScript ํํ ๋ฆฌ์ผ ์ฐธ๊ณ )
- ํ๋ผ๋ฏธ์ค๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์๋ ์ฝ๋ฐฑ(Callback) ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ค.
- ๋ฐ์ดํฐ ์๋ณธ์ ๋น์ฉ์ ์์ฒญํ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๊ณ , ์ด ํจ์๊ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ค. (์:
setTimeout()
) - ๋ค์ ์์ ๋
setTimeout()
์ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฝ๋์ด๋ค.
function getUserPreferences(cb) {
return setTimeout(() => {
cb({
theme: 'dusk',
});
}, 1000);
}
function log(value) {
return console.log(value);
}
log('starting'); // starting
getUserPreferences(preference => {
return log(preference.theme.toUpperCase());
});
log('ending?'); // ending?
// DUSK
- ์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ข์ ๋ฐฉ๋ฒ์ด๊ณ ์ค๋ซ๋์ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ด์๋ค.
- ํ์ง๋ง, ๋ฌธ์ ๋ ๋น๋๊ธฐ ํจ์์์ ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํด ๋ง์นจ๋ด ๋๋ฌด๋ ๋ง์ ์ฝ๋ฐฑ์ด ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ฝ๋ฐฑ ์ง์ฅ(Callback Hell) ์ด๋ผ๊ณ ํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ฝ๋ฐฑ ํจ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ํ๋ผ๋ฏธ์ค๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ํ๋ ๋์ ์ ์ฑ๊ณต๊ณผ ์คํจ์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ ์์ ์ ์ ๋ฌ๋ฐ์์ ์๋ต์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด์ด๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ ์์
์ด ์ฑ๊ณตํ๊ฑฐ๋ ์ถฉ์กฑ๋ ๊ฒฝ์ฐ
then()
๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ์ค๋ค. - ๋น๋๊ธฐ ์์
์ ์คํจํ๊ฑฐ๋ ๊ฑฐ๋ถ๋๋ ๊ฒฝ์ฐ์๋ ํ๋ก๋ฏธ์ค๊ฐ
catch()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. then()
๊ณผcatch()
๋ฉ์๋์๋ ๋ชจ๋ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.- ์ด๋ ๋ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์์๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ์ธ ์๋ต๋ง์ด ์ธ์๋ก ์ ๋ฌ๋๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋ ๊ฐ์ ์ธ์,
resolve()
์reject()
๋ฅผ ์ ๋ฌ๋ฐ๋๋ค. resolve()
๋ ์ฝ๋๊ฐ ์๋๋๋ก ๋์ํ์ ๋ ์คํ๋๊ณresolve()
๊ฐ ํธ์ถ๋๋ฉดthen()
๋ฉ์๋์ ์ ๋ฌ๋ ํจ์๊ฐ ์คํ๋๋ค.
function getUserPreferences() {
const preference = new Promise((resolve, reject) => {
resolve({
theme: 'dusk',
});
});
return preference;
}
// ์ฑ๊ณตํ ๊ฒฝ์ฐ then() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ํธ์ถ
getUserPerferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ค์ ํ ๋
then()
๊ณผcatch()
๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค. - ๋ค์์ ์คํจํ๋ ํ๋ผ๋ฏธ์ค์ด๋ค. ์ธ์์ ์๋
reject()
๊ฐ ํธ์ถ๋๋ค.
function failUserPreference() {
const finder = new Promise((resolve, reject) => {
reject({
type: '์ ๊ทผ ๊ฑฐ๋ถ๋จ',
});
});
return finder;
}
- ํ๋ผ๋ฏธ์ค๋ฅผ ํธ์ถํ ๋
then()
๋ฉ์๋์catch()
๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํด์ ์ถ๊ฐํ ์ ์๋ค.
failUserPreference()
.then(preference => {
// ์คํ๋์ง ์๋๋ค.
console.log(preference.theme);
})
.catch(error => {
console.log(`์คํจ: ${error.type}`);
});
// ์คํจ: ์ ๊ทผ ๊ฑฐ๋ถ๋จ
- ๋ค์ ์์ ๋ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํ๋ผ๋ฏธ์ค๋ก ๋ณ๊ฒฝํ ์ฝ๋์ด๋ค.
function getMusic(theme) {
if(theme === 'dusk') {
return Promise.resolve({
album: 'music for airports',
});
return Promise.resolve({
album: 'kind of blue',
});
}
}
getUserPreferences()
.then(preference => {
return getMusic(preference.theme);
})
.then(music => {
console.log(music.album);
});
// music for airports
- ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋์ ์ฌ๋ฌ ๊ฐ์
then()
๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๋๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ์ด๋ค. - ์์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํด ์ค ์ ์๋ค.
getUserPreferences()
.then(preference => getMusic(preference.theme))
.then(music => { console.log(music.album); });
- ๋์ผ๋ก, ํ๋ผ๋ฏธ์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์๋
catch()
๋ฉ์๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฐ๊ฒฐํ ํ์๊ฐ ์๋ค. catch()
๋ฉ์๋๋ฅผ ํ๋๋ง ์ ์ํด์ ํ๋ผ๋ฏธ์ค๊ฐ ๊ฑฐ์ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
function getArtist(album) {
return Promise.resolve({
artist: 'Brian Eno',
});
}
function failMusic(theme) {
return Promise.reject({
type: '๋คํธ์ํฌ ์ค๋ฅ',
});
}
getUserPreferences()
.then(preference => failMusic(preference.them))
.then(music => getArtist(music.album))
// ๊ฑฐ๋ถ๋ ๋(reject) ์คํ๋๋ค.
.catch(e => {
console.log(e);
});
// {type: "๋คํธ์ํฌ ์ค๋ฅ"}
- ํ๋ผ๋ฏธ์ค๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ๋ฐ์ ๋ชจ๋ ํ๋ผ๋ฏธ์ค๊ฐ ์ข
๋ฃ๋์์ ๋์ ์ฑ๊ณต ๋๋ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋
Promise.all
์ด๋ผ๋ ๋ฉ์๋๋ ์๋ค. (MDN, ๋ชจ๋ javascript ํํ ๋ฆฌ์ผ)
๐ฏ async/await๋ก ํจ์๋ฅผ ๋ช ๋ฃํ๊ฒ ์์ฑํ๋ผ.โ
- ํ๋ผ๋ฏธ์ค๋ ์ฝ๋ฐฑ๊ณผ ๋น๊ตํ๋ฉด ์์ฒญ๋ ๋ฐ์ ์ด์ง๋ง ์ธํฐํ์ด์ค๊ฐ ์ฌ์ ํ ๋ค์ ํฌ๋ฐํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ๋ฉ์๋์์ ์ฝ๋ฐฑ์ ๋ค๋ค์ผ ํ๋ค.
async/await
๋ฅผ ์ด์ฉํด ํ๋ผ๋ฏธ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.async
ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ธํ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.- ๋น๋๊ธฐ ํจ์์ ๋ด๋ถ์์
await
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ๋ฐํ๋ ๋๊น์ง ํจ์์ ์คํ์ ์ค์ง์ํฌ ์ ์๋ค. async/await
๋ ํ๋ผ๋ฏธ์ค๋ฅผ ๋์ฒดํ์ง๋ ์๋๋ค. ๋จ์ง ํ๋ผ๋ฏธ์ค๋ฅผ ๋ ๋์ ๋ฌธ๋ฒ์ผ๋ก ๊ฐ์ธ๋ ๊ฒ์ ๋ถ๊ณผํ๋ค.- ์๋ ์ฝ๋๋ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ ์์ ์ฝ๋๋ฅผ
async/await
๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
getUserPreferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'
async function getTheme() {
const { theme } = await getUserPreferences();
return theme;
}
- ๋น๋๊ธฐ ํจ์๋ ํ๋ผ๋ฏธ์ค๋ก ๋ณํ๋๋ค๋ ์ ์ด๋ค.
- ์ฆ,
getTheme()
๋ฅผ ํธ์ถํด๋ ์ฌ์ ํthen()
๋ฉ์๋๊ฐ ํ์ํ๋ค.
getTheme()
.then(theme => {
console.log(theme);
})
// dusk
async
ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ข๋ค.async/await
๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋ณ ํ๋ผ๋ฏธ์ค์์ ๋ฐํ๋ ๊ฐ์ ๋ณ์์ ๋จผ์ ํ ๋นํ๊ณ ๋ค์์ ์ด์ด์ง ํจ์๋ก ์ ๋ฌํ ์ ์๋ค.- ์ฆ, ์ฐ๊ฒฐ๋ ํ๋ผ๋ฏธ์ค๋ฅผ ํ๋์ ํจ์๋ก ๊ฐ์ธ์ง ์ฌ๋ฌ ๊ฐ์ ํจ์ ํธ์ถ๋ก ๋ณํํ ์ ์๋ค.
async function getArtistByPreference() {
const { theme } = await getUserPreferences();
const { album } = await getMusic(theme);
const { artist } = await getArtist(album);
return artist;
}
getArtistByPreference()
.then(artist => {
console.log(artist);
});
// Brian Eno
- ์ค๋ฅ๋ ๋ค์ ์์ ์ฒ๋ผ
catch()
๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ ์ก์ ์ ์๋ค.
async function getArtistByPreference() {
const { theme } = await getUserPreferences();
const { album } = await failMusic(theme);
const { artist } = await getArtist(album);
return artist;
}
getArtistByPreference()
.then(artist => {
console.log(artist);
})
.catch(e => {
console.log(e);
});
// {type: "๋คํธ์ํฌ ์ค๋ฅ"}
๐ฏ fetch๋ก ๊ฐ๋จํ AJAX ํธ์ถ์ ์ฒ๋ฆฌํ๋ผ.โ
fetch()
๋ฅผ ์ด์ฉํด์ ์๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.- API๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ดํฐ๋ธ ์ํํธ์จ์ด์ฒ๋ผ ์๋ํ๋ ๋งค์ฐ ๋น ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
- AJAX(Asynchronous JavaScript And XML)(๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์ XML)๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ฝค ๋ฒ๊ฑฐ๋ก์ ๋ค.
- AJAX ํธ์ถ์ ์ฒ๋ฆฌํ ์ ์๋
fetch()
๋ผ๋ ๊ฐ๋จํ ๋๊ตฌ๊ฐ ์๊ฒผ๋ค. fetch()
๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ช ์ธ์ ์ผ๋ถ๊ฐ ์๋๋ผfetch()
๋ช ์ธ๋ WHATWG(Web Hypertext Application Technology Working Group)๊ฐ ์ ์ํ๋ค.- ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋์ง๋ง Node.js์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋์ง ์๋๋ค.
- Node.js์์
fetch()
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด node-fetch ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. fetch()
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด API ๋์ (endpoint)์ด ํ์ํ๋ค.- typicode๋ JSONPlaceholder๋ฅผ ํตํด ๊ฐ์ ๋ธ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
- ๋ํ, typicode์์ ์ ๊ณตํ๋ JSON ์๋ฒ๋ผ๋ ๋๊ตฌ๋ฅผ ์ด์ฉํ๋ฉด ๋ก์ปฌ ํ๊ฒฝ์์ ๋ชจ์ API๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๋ค์์
fetch()
๋ฅผ ์ฌ์ฉํGET
์์ฒญ์ด๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1');
// {
// "userId": 1,
// "id": 1,
// "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
// "body": "quia et suscipit\nsuscipit recusandae...",
// }
- ์์ฒญ์ ๋ณด๋ด๊ณ ๋๋ฉด
fetch()
๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์๋ต์ ์ฒ๋ฆฌํ๋ ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค.
then()
๋ฉ์๋์ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ถ๊ฐํ๋ค.fetch()
๋ ๋ค์ํ ๋ฏน์ค์ธ์ ํฌํจํ๊ณ ์์ด์ ์๋ต ๋ณธ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋ณํํด ์ค๋ค.then()
๋ฉ์๋์ ์ฝ๋ฐฑ์์ ํ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
// Responseย {...}
return data.json();
})
.then(post => {
console.log(post.title);
// sunt aut facere repellat provident occaecati excepturi optio reprehenderit
});
fetch()
ํ๋ผ๋ฏธ์ค๋ ์ํ ์ฝ๋๊ฐ404
์ฌ์ ์์ฒญ์ ์คํจํ ๊ฒฝ์ฐ์๋ ์๋ต ๋ณธ๋ฌธ์ ๋ฐํํ๋ค.- ์ฆ, ์์ฒญ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ
catch()
๋ฉ์๋๋ง์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
// 200 ~ 299 ์ฌ์ด์ธ ๊ฒฝ์ฐ true๋ก ์ค์ ๋์ด ์๋ ok ํ๋.
// ์ต์คํ๋ก๋ฌ ์ง์ x
if(!data.ok) {
throw Error(data.status);
}
return data.json();
})
.then(post => {
console.log(post.title);
})
.catch(e => {
console.log(e);
});
fetch()
๋ฅผ ์ฌ์ฉํPOST
๋ฐฉ๋ฒ์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ค์ ์กฐ๊ฑด์ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.- ์ค์ ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๋ค์ํ ์ธ๋ถ ์ฌํญ์ ๋ด์ ์ ์๋ค.
- ์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ์ ๋ณด๋ง ํฌํจํ ๊ฒ์ด๋ค.
- ๋ฉ์๋๋ฅผ
POST
๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ ์ธํด ์ฃผ๊ณ ,JSON
๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค์ผ ํ๋ค. - ๊ทธ๋ฆฌ๊ณ
JSON
๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ํค๋์Content-Type
์application/json
์ผ๋ก ์ค์ ํด์ผ ํ๋ค. - ๋์ผ๋ก
JSON
๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฌธ์์ด๋ก ์์ฒญ ๋ณธ๋ฌธ์ ์ถ๊ฐํ๋ค.
const update = {
title: 'Clarence White Techniques',
body: 'Amazing',
userId: 1,
};
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(update),
};
fetch('https://jsonplaceholder.typicode.com/posts', options)
.then(data => {
if(!data.ok) {
throw Error(data.status);
}
return data.json();
})
.then(update => {
console.log(update);
// {
// title: "Clarence White Techniques",
// body: "Amazing",
// userId: 1,
// id: 101
// }
})
.catch(e => {
console.log(e);
});
- ์์ธํ ์ฌํญ์ MDN ์ฐธ๊ณ
๐ฏ localStorage๋ก ์ํ๋ฅผ ์ฅ๊ธฐ๊ฐ ์ ์งํ๋ผ.โ
localStorage
๋ฅผ ์ด์ฉํ๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ ์ฅํ ์ ์๋ค.localStorage
๋ ๋ธ๋ผ์ฐ์ ์๋ง ์กด์ฌํ๋ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ค.localStorage
์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์๋ ์๋ค.- ๊ฐ์ ์ ์ฅํ๋ ค๋ฉด
localStorage
๊ฐ์ฒด์setItem()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ค์ ํ๋ฉด ๋๋ค. - ์ฒซ ๋ฒ์งธ ์ธ์์๋ ํค, ๋ ๋ฒ์งธ ์ธ์์๋ ๊ฐ์ ์ ๋ฌํ๋ค.
function saveBreed(breed) {
localStorage.setItem('breed', breed);
}
- ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ ๋ฌ๋ค๊ฐ ๋ค์ ๋ฐฉ๋ฌธํ ๋๋ ๋น์ทํ ๋ช ๋ น์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
function getSavedBreed() {
return localStorage.getItem('breed');
}
- ์ถ๊ฐํ๋ ํญ๋ชฉ์ ์ญ์ ํ ์๋ ์๋ค.
function removeBreed() {
return localstorage.removeItem('breed');
}
localStorage
์ ๊ฐ์ ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์์๊ฒ ์ถ๊ฐ์ ์ธ ๋ ธ๋ ฅ์ ์๊ตฌํ์ง ์๊ณ ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.- ์ฆ, ํ์ด์ง๋ฅผ ๋ ๋ฌ๋ค๊ฐ ๋ค์ ๋์์ค๊ฑฐ๋ ์๋ก ๊ณ ์นจ์ ํ๋๋ผ๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ํ ์ ์๋ค.
function applyBreedPreference(filters) {
const breed = getSavedBreed();
if(breed) {
filters.set('breed', breed);
}
return filters;
}
- ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ํ๋ ๋งํผ ํค๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ์ฌ์ฉ์๊ฐ ์ค์ ํ ๋ชจ๋ ์กฐ๊ฑด์ ์ ์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ ํญ๋ชฉ๋ณ๋ก ์ ์ฅํ ์ ์์ง๋ง, ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ์ ์ฅํ๋ฉด ํจ์ฌ ์ฝ๋ค.
localStorage
์ ์ ์ผํ ๋จ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ ๋ฌธ์์ด์ด์ด์ผ ํ๋ค๋ ์ ์ด๋ค.localStorage
์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ ์ ์ฅํ ์ ์๋ค.- ์ด ๋จ์ ์
JSON.stringify()
๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ , ๋ค์ ๊ฐ์ ธ์ฌ ๋๋JSON.parse()
๋ฅผ ์ด์ฉํด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ๋ฉด ๋๋ค. - ์ฌ์ฉ์์ ๊ฒ์ ์กฐ๊ฑด์ ๋ชจ๋ ์ ์ฅํ๋ ค๋ฉด ๋ชจ๋ ์กฐ๊ฑด์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ผ ํ๋ค.
- ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ๋ ๋งต์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋จผ์ ๋ฐฐ์ด์ ํผ์ณ ๋ฃ์ด์ผ ํ๋ค.
let filters = new Map();
filters.set('id','seungmin');
function savePreferences(filters) {
const filterString = JSON.stringify([...filters]);
localStorage.setItem('preferences', filterString);
}
savePreferences(filters);
- ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฌ์ฉํ ๋๋
localStorage
์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ค์ ๋งต์ผ๋ก ๋ณํํ๋ฉด ๋๋ค. - ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ ํ์ฑํ๋ ๊ณผ์ ๋ง ๊ฑฐ์น๋ฉด ๋๋ค.
function retrievePreferences() {
const preferences = JSON.parse(localStorage.getItem('preferences'));
return new Map(preferences);
}
retrievePreferences();
// Map(1)ย {"id" => "seungmin"}
localStorage
๋ฅผ ๋น์์ผ ํ๋ ๊ฒฝ์ฐ๋clear()
๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ํค-๊ฐ ์์ ์ญ์ ํ ์ ์๋ค.
function clearPreferences() {
localStorage.clear();
}
- ๋จ์ ์ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค๋ ๋จ์ ์ด ์์ง๋ง, ๋ก๊ทธ์ธ์ ํผํ ์ ์๋ค๋ ์ด์ ์ด ํจ์ฌ ๋ ํฌ๋ค.
- ๋ง๋ถ์ฌ์
sessionStorage
๋ฅผ ์ฌ์ฉํด๋ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ ์ ์๋ค. - ์ด ๋๊ตฌ๋ ์๋ฒ ์ธก ๋ ๋๋ง๊ณผ ํด๋ผ์ด์ธํธ ์ธก ๊ธฐ๋ฅ์ ํผํฉ๋์ด ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
- ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นจํ๋ฉด ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๊ณ , ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ ๋ฌ๋ค๊ฐ ๋ค์ ๋์์ค๋ฉด ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ์ํ๋ฅผ ๋ณด์ฌ์ค๋ค.
- ์์ ํ ํตํฉ๋ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ด๋ ๋๊ตฌ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ ์ ๋ณด์ API ์ ๊ทผ์ ์ด์ฉํ๋ฉด ์๋ฒ๋ฅผ ํตํ ํ์ด์ง ๋ ๋๋ง์ ํ ๋ฒ์ผ๋ก ์ค์ผ ์ ์๋ค.