feature bookmark - boostcampwm-2022/web33-Mildo GitHub Wiki
โ๏ธ ๋ถ๋ฐฐ๋ ์ด์
- ๋ถ๋งํฌ ์ถ๊ฐ/์ญ์ (#48)
- ์ฌ์ด๋ ๋ฐ - ๋ถ๋งํฌ ๋ฆฌ์คํธ(์ต๋ 5๊ฐ) ์ถ๋ ฅ(#40)
๐ฉ ๊ตฌํ ๋ชฉํ
๋ถ๋งํฌ api๋ฅผ ๋ง๋ค๊ณ ์์ธ ์ ๋ณด ๋ชจ๋ฌ ๋ฐ ์ฌ์ด๋๋ฐ์ UI ์ ์ฉ
๐ ์ธ๋ถ ๋ชฉํ
- MongoDB user ์คํค๋ง์ ๋ถ๋งํฌ(๋ฐฐ์ด) ์ถ๊ฐ
- ๋ถ๋งํฌ api ๊ตฌํ
- ์์ธ์ ๋ณด ์ฐฝ์์ ๋ถ๋งํฌ ์ถ๊ฐ, ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
- ์ฌ์ด๋๋ฐ์์ ๋ถ๋งํฌ ๋ถ๋ฌ์ค๊ธฐ, ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
๐ฅ๏ธ ๊ตฌํ ๋ด์ฉ
-
MongoDB User ์คํค๋ง ๋ณ๊ฒฝ
- bookmarks(๋ฐฐ์ด)์ nickname(๋ฌธ์์ด) ์ถ๊ฐ
- nickname์ ๊ฒฝ์ฐ passport์์ user ์ ๋ณด ์์ฑํ ๋ ๋ฃ์ด์ค
- profile์ด ๋ค์ด๋ฒ Oauth์์ ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด
// server/src/apis/passport/naverStrategy.ts const newUser = await User.create({ snsId: profile.id, provider: 'naver', email: profile.email, nickname: profile.nickname });
-
๋ก๊ทธ์ธ User ์ ๋ณด๋ ๋ก๊ทธ์ธ๊ณผ ๋์์ client์์ ๊ณ์ ๊ฐ์ง๊ณ ์์
- ์ด์ ์ isLoggedIn๋ก ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌ ํ์
- ์ ์ญ ์ํ userInfo๋ก client์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ณ์ ๊ฐ์ง๊ณ ์์
// client/src/pages/MainPage/MainPage.tsx useEffect(() => { // ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธํ๊ธฐ -> '๋ก๊ทธ์์' ๊ธฐ๋ฅ ๊ตฌํ ์ ์ฌ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ ์ปค์คํ ํ ์ผ๋ก ๋นผ์ผํจ const checkLoggedInFunction = async () => { const logInStatus = await apis.getWhetherUserLoggedIn(); if (logInStatus.ok === true) { setIsLoggedIn(true); setUserInfo(logInStatus.data); setIsLoginModalOpen(false); return; } setIsLoggedIn(false); setUserInfo(null); }; checkLoggedInFunction(); }, []);
-
bookmark ๊ด๋ จ api๋ ์ฐ์ /api/auth ์๋์ ์ค์
- areaName๊ณผ userId๋ฅผ ๋ฐ์ ์ ์ ๋ณ๋ก ๋ถ๋งํฌ ๋ฑ๋ก, ์ญ์ ์ํ
- client์์ ์ ์ ์ ๋ณด ๋ค๊ณ ์์ด๋ server์์ authMiddleware.authorizationUser ๋ฏธ๋ค์จ์ด ํต๊ณผํด์ผ ํด๋น ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅํจ
- ๋ถ๋งํฌ 5๊ฐ ์ด๊ณผ ๋ง๋ ๊ธฐ๋ฅ์ client์์ ์ค์
-
์์ธ ์ ๋ณด ๋ชจ๋ฌ์์ ๋ถ๋งํฌ ์ญ์ , ์ถ๊ฐ
- client์์ ์ ์ ์ ๋ถ๋งํฌ ๊ด๋ จ ๋ด์ฉ์ ์ ๋ถ userInfo์ ๋ฐฐ์ด๋ก ๋ค์ด ์์ด์, ํด๋น ๋ฐฐ์ด์ ์์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ถ๋งํฌ ์ญ์ , ์ถ๊ฐ ๊ตฌํ
// client/src/components/InfoDetailModal/InfoDetail.tsx const onClickBookmark = async () => { if (!firstLevelInfo || !userInfo) { alert('๋ถ๋งํฌ๋ ๋ก๊ทธ์ธ ํ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.'); return; } const [areaName] = firstLevelInfo; const { _id: userId, bookmarks } = userInfo; if (bookmarks.includes(areaName)) { await apis.deleteBookmark(areaName, userId); setUserInfo({ ...userInfo, bookmarks: bookmarks.filter(bookmark => bookmark !== areaName) }); } else { if (bookmarks.length >= 5) { alert('๋ถ๋งํฌ๋ ์ต๋ 5๊ฐ๊น์ง ๋ฑ๋ก ๊ฐ๋ฅํฉ๋๋ค.'); return; } await apis.addBookmark(areaName, userId); setUserInfo({ ...userInfo, bookmarks: bookmarks.concat(areaName) }); } };
-
์ฌ์ด๋ ๋ฐ์์ ๊ฐ ์ง์ญ์ ํผ์ก๋๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด areas๋ฅผ ์ง์ญ ์ํ์์ ์ ์ญ ์ํ๋ก ๋ณ๊ฒฝ
- ์ฌ์ด๋ ๋ฐ์์ ์ญ์ ํด๋ฆญ ์ ๋ถ๋งํฌ ์ญ์ , ์๋ฆฌ๋ ์์ธ ์ ๋ณด ๋ชจ๋ฌ๊ณผ ๋์ผ
- ์ฌ์ด๋ ๋ฐ์์ ์ฅ์๋ช ํด๋ฆญ ์ ์์น ์ด๋ ์ํค๊ณ ์ถ์๋ฐ ๋ ผ์ ํด๋ณด๊ธฐ
๐ ํ์ต ๋ด์ฉ
-
MongoDB์์ array type์ ์ค์ ํ๊ธฐ ์ํด์๋ interface์๋ Types๋ก ๊ฑธ์ด์ค์ผํ๊ณ ์คํค๋ง์๋ [string]์ผ๋ก ๊ฑธ์ด์ฃผ๋ฉด ๋จ
- ๋ชฝ๊ตฌ์ค ํ์ ์ค์ : https://mongoosejs.com/docs/typescript/schemas.html
-
mongoose์์ array๊ฐ pushํ๋ ๋ฐฉ๋ฒ
- ์ญ์ ํ ๊ฒฝ์ฐ์๋ pull๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
Nft.findOneAndUpdate( { tokenId : tokenId }, { $push: { bids:bid}}, (err, result) => { console.log('autcion is normal, Do not Worry'); res.json({ success: true, detail: 'success set highstbid', }); if (err) console.log(err); } )
๐ฉบ ์์ฌ๊ฒฐ์
- ์ฌ์ด๋ ๋ฐ์์ ์ฅ์๋ช
ํด๋ฆญ ํ์ ๋ ์ง๋ ์์น ๋ฐ๊ฟ์ง?
- ์ง๊ธ ์ฃผ์ ์ฒ๋ฆฌ ํด๋์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด ์ค๊ฐ์ ์์น๊ฐ ํ ๋ฒ ์ด๋ํจ
- naverMap์ ๊ฐ์ ธ์์ผ๋๋ฐ ์ด๊ฒ๋ ์ ์ญ์ผ๋ก ์ ์ธํ๋ฉด ๋๋ฌด ๋ณต์กํจ
โ ๊ถ๊ธํ ์
- setState์ ๋น๋๊ธฐ์ฑ์ ๋ํด ์ดํดํ ํ์๊ฐ ์์