์ธ๋ฒ์งธ๋ก ์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก์ ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก์ ๊ตฌํํ api๋ ๋ฐ๋ก ์ฃผ์ด์ง์ง ์์ ์ ๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค ! ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฒ์์ด๋ผ ํค๋งค๋ ๋ถ๋ถ์ด ๋ง์๋๋ฐ์ .. ํท๊ฐ๋ ธ๋ ๋ถ๋ถ๊ณผ ์์ ํ๋ฉฐ ๋ฐฐ์ด ๋ถ๋ถ์ ์์ฃผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋น
์น์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ ์ ์๋ ์ ์ฅ์์ ๋๋ค. ํค์ ๊ฐ์ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค. ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ์ง์ฐ์ง ์๋ ์ด์ ๋ธ๋ผ์ฐ์ ์ ๊ณ์ํด์ ๋จ์์์ผ๋ฉฐ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ Application ํญ์์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
localStorage.setItem(key, value) //๋ฐ์ดํฐ ์ถ๊ฐ
localStorage.getItem(key) //๋ฐ์ดํฐ ์ฝ๊ธฐ
localStorage๋ setItem() ํจ์๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ , getItem() ํจ์๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ฃผ์ํ ๊ฒ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ ๋ฌธ์๋ง ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ์ด๋ผ๋ ์ ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ JSON์ผ๋ก ๋ณํํด์ ์ ์ฅํด์ผ ํฉ๋๋ค.
localStorage.setItem("obj", { name: "Haechan" });
๋ง์ผ ์ด๋ ๊ฒ ์ต์ง๋ก ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ ๊ฒฝ์ฐ,
[object Object]๋ก ์๋ฃ๊ฐ ๊นจ์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
localStorage.setItem(โobjโ, JSON.stringify({name: โHaechanโ})
๋ฐ๋ผ์ array๋ objct๋ JSON.stringify๋ฅผ ํตํด JSON ๋ฌธ์์ด๋ก ๋ณํํด ์ ์ฅํด์ผ ํฉ๋๋ค.
์ง ! ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ํ์ธํด๋ณด๋ ์ ๊ฐ ์ํ๋๋๋ก ๊ฐ์ฒด ํํ๋ก ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ถ์ ๊ฒฝ์ฐ,
JSON.parse(localStorage.getItem(โobjโ))
getItem() ํจ์์ JSON.parse()๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ต๊ทผ ๋ณธ ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ ํ ์์ธํ์ด์ง์ ์ ์ํ ๊ฒฝ์ฐ
- ํด๋น ์ํ์ id๋ฅผ ๊ฐ์ ธ์์
- ๋ก์ปฌ์คํ ๋ฆฌ์ง watch์ ์ถ๊ฐํฉ๋๋ค.
์๋๋ ์ต๊ทผ ๋ณธ ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ฝ๋ ์ผ๋ถ์ ๋๋ค.
if(localStorage.watched === undefined) {
localStorage.setItem('watched', JSON.stringify([]));
}
const watched = localStorage.getItem('watched');
const watchedArr = JSON.parse(watched)
watchedArr.unshift(id);
localStorage.setItem('watched', JSON.stringify(watchedArr));
const watchedSet = new Set(watchedArr);
const watchedProducts = [...watchedSet].slice(0,8)
localStorage.setItem('watched', JSON.stringify(watchedProducts)
๋จผ์ setItem์ ํตํด ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ๋ฌธ์์ด๋ก ๋น๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ ,
watched ๋ณ์์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋ด์ต๋๋ค. ์ด ์ ๋ณด๋ฅผ ํ์ฉํ๊ธฐ ์ํด watchedArr ๋ณ์์ JSON.parse()๋ก ๋ฐฐ์ด ํํ๋ก ๊ฐ๊ณตํ watched ์ ๋ณด๋ฅผ ๋ฃ์ต๋๋ค.
์ต๊ทผ์ ๋ณธ ์ ํ์ ๋งจ ์์ ์ถ๋ ฅํ๊ธฐ ์ํด unshift()๋ก ์ ํ์ id๋ฅผ ์ถ๊ฐํ๊ณ , ์ค๋ณต๋ ์ํ์ ํ ๋ฒ๋ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด set ๊ฐ์ฒด๋ฅผ ํ์ฉํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก set๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ์ต๋ 8๊ฐ์ ์ํ ์ ๋ณด๊ฐ ๋ด๊ธธ ์ ์๋๋ก slice๋ก ๋ฐฐ์ด์ ์์ ํ์ต๋๋ค.
import { getProductDetail } from '../total-product/fetch'
const [products, setProducts] = useState([]);
const watchedProducts = JSON.parse(localStorage.getItem('watched'))
useEffect(() => {
if(watchedProducts) {
for(let products of watchedProducts){
let details = getProductDetail(products)
details.then((data) => {
setProducts((curArr)=>[data, ...curArr])
});
}
}
}, [])
๋ค์์ผ๋ก watchedProducts์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์๋ ์์ด๋ ๋ฐฐ์ด์ ๋ด๊ณ ์ํ ์ ๋ณด๋ฅผ ๋ถ๋ฌ ๊ทธ ์ ๋ณด๋ฅผ products ๋ณ์์ ํ ๋นํด์ฃผ์์ต๋๋ค.
details.then((data) => {
setProducts([data, ...products])
});
์ฒ์์๋ ๊ธฐ์กด ๋ฐฐ์ด์ ์๋ก์ด ์ํ์ ์ถ๊ฐํ๊ธฐ ์ํด useState์ setํจ์๋ฅผ ์์ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
ํ์ง๋ง ์ ๊ฐ ์ํ๋๋๋ก ๊ฐ์ด ์ถ๊ฐ๋์ง ์๊ณ ๊ฐ๋ณ์ ์ธ ๋ฐฐ์ด์ด ์ด์ํ ๋ชจ์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
details.then((data) => {
setProducts((curArr)=>[data, ...curArr])
});
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ดํ ํจ์์ ๊ธฐ์กด ๋ฐฐ์ด์ ๋งค๊ฐ ๋ณ์๋ก ๋ฃ์ด ๊ฐ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด ๋ ์ ํ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์ ๋ํ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋์ง ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. if๋ฌธ์ ํตํด ์ํ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ง ํด๋น ๋ฐ๋ณต๋ฌธ์ ์คํํ๋๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋๋
์ต๊ทผ ๋ณธ ์ํ ๊ธฐ๋ฅ์ด (์ผ๋จ์) ๊ตฌํ๋์์ต๋๋ค ..
๊ทธ๋ฐ๋ฐ ์ ํ์ด ๋๋คํ ์์๋ก ์ถ๊ฐ๋๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ์ต๋๋ค ๐ข ๊ฐ์ฅ ์ต๊ทผ์ ๋ณธ ์ํ์ ์ ์ผ ์๋จ์ ์คใ ์ผํ๋๋ฐ .. ์ด ์์๊ฐ ์ง์ผ์ง์ง ์๊ณ ๋ง๊ตฌ์ก์ด๋ก ์ ํ์ด ์ถ๋ ฅ๋์์ต๋๋ค.
if (watchedProducts) {
for (let product of watchedProducts) {
let details = getProductDetail(product);
details//
.then((data) => {
setProducts((curArr) => [data, ...curArr]);
});
}
}
๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๋ ์์๊ฐ ๋ฌธ์ ์ธ๊ฑธ๊น ? ํ์ธํด๋ดค์ผ๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์๋ ์ ๊ฐ ์๋ํ ์์๋๋ก ์ ํ์ id๊ฐ์ด ์ ์ฅ๋๊ณ ์์์ต๋๋ค. ๊ทธ๋ผ ๋ฌธ์ ๋ for๋ฌธ์ ์๋ค๋๊ฑด๋ฐ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ฐพ์๋ณด๋ .. ๋ฐ๋ก getProductDetail ํจ์์์ต๋๋ค!
getProductDetail ํจ์๋ ์ ํ์ ์์ธ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ๋น๋๊ธฐ ํจ์์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์์์๋ ๋ฌด๊ดํ๊ฒ ์ ํ ์ ๋ณด๊ฐ ๋จผ์ ๋๋ฌํ ์ํ์์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ด์์ต๋๋ค ..
if(watchedProducts){
Promise.all(watchedProducts.map(async product =>{
return getProductDetail(product);
})).then((data)=>{
setProducts(data);
}).catch((error) => console.log(error))
}
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Promise.all์ ์ด์ฉํ์ต๋๋ค. Promise.all์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ณ๋ ฌ๋ก ์คํ๋์ง๋ง, ๋ง์ง๋ง์ผ๋ก ์๋ฃ๋ ํจ์๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฐ์ ๋ฐํํฉ๋๋ค.์ด๋ ๊ฐ์ ๋ฐํ์์๋ ์๋ฃ์์๊ฐ ์๋๋ผ ์คํ์์์ ๋์ผํ๊ธฐ ๋๋ฌธ์ Promise.all์ ํตํด ์ํ์ ์๋ํ๋๋ก ์ถ๋ ฅํ ์ ์์์ต๋๋ค.
๊ธฐ์กด์ ์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก์ recoil ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
const viewedListState = atom({
key: 'recentlyViewed',
default: [],
effects_UNSTABLE: [persistAtom],
});
์ ์ญ์์ ์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก์ ๊ด๋ฆฌํ ์ ์๋๋ก atom์ ์์ฑํ๊ณ
const setViewedList = useSetRecoilState(viewedListState)
setViewedList((prevArr) => [
{
id: data.id,
title: data.title,
photo: data.photo,
}, ...prevArr
])
useSetRecoilState ํ ์ ์ฌ์ฉํด ๋ํ ์ผ ํ์ด์ง์ ์ ์ํ์ ๊ฒฝ์ฐ ์ํ์ id, title, photo๋ฅผ ์ ์ฅํฉ๋๋ค.
//atom์ ์ ์ฅ๋ ์ ๋ณด ๋ถ๋ฌ์์
const viewedList = useRecoilValue(viewedListState)
//์ค๋ณต๋ ์ํ ์ ๊ฑฐ
const products = viewedList.reduce((acc, current) => {
const repeatedProduct = acc.find(product => product.id === current.id);
if (!repeatedProduct) {
return acc.concat([current]);
} else {
return acc;
}
}, []);
//์ต์ข
๋ณด์ฌ์ง ์ํ
const viewedProducts = products.slice(0, 3)
useRecoilValue์ ์ฌ์ฉํด ์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์์ ์ค๋ณต๋ ์ํ์ ์ ๊ฑฐํ ๋ค, ์ต์ข ์ ์ผ๋ก ๋ณด์ฌ์ง ์ํ 3๊ฐ๋ง ๋จ๊น๋๋ค.
์ง์ ์ต์ข ์ ์ผ๋ก ์์ฑ๋ ์ต๊ทผ ๋ณธ ์ํ ๋ชฉ๋ก์ ๋ชจ์ต์ ๋๋ค !