์ฃผ์ ์์
- ์๋ฒ
- GET : ํค๋๋ผ์ธ ๊ฐ์ ธ์ค๊ธฐ
- GET: ๊ตฌ๋ ํ ์ธ๋ก ์ฌ ๊ฐ์ ธ์ค๊ธฐ
- GET: ๋ชจ๋ ์ธ๋ก ์ฌ ๊ฐ์ ธ์ค๊ธฐ
- GET: ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ (์นดํ ๊ณ ๋ฆฌ โ ๋ด๋ถ ์ธ๋ก ์ฌ โ ๋ด๋ถ ๊ธฐ์ฌ) ๊ฐ์ ธ์ค๊ธฐ
- POST: ๋๋ฏธ ๋ฐ์ดํฐ๋ค ์ถ๊ฐ(ํ๊ธฐ)
ํ์ต ํค์๋
- suspense์ concurrent mode
- firebase functions
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
fetching ๋ก์ง์ ๊ณ ๋ฏผ
Error boundary์ Suspense๋ฅผ ํฉ์ณ๋์ AsyncBoundary๋ ์ด์ ๊น์ง ๋ฐ์ด๋๋ฆฌ ์์ ์์๋ค์ ๋ฃ์ด ๋๊ณ , ์์ชฝ ์ปดํฌ๋ํธ์์ ๋ ๋๋ง ํ๋ ๋ฐฉ์์ผ๋ก ํ์๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ์์์ fetch๋ฅผ ํ๊ฒ ๋๋ฉด, ๊ณ์ํด์ ๋ฆฌ์กํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ ์คํํ๊ฒ ๋๊ณ , ์ด ๊ณผ์ ์์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ http ์์ฒญ์ด ๋ ๋ผ๊ฐ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ๊ณ์ํด์ ๋ ๋๋ง์ด ์คํ๋ ๋, ์์์ state๋ก ๊ด๋ฆฌํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋๋ ๊ณผ์ ์์ ๊ณ์ํด์ ์ด๊ธฐํ๋๋ ๋ฌธ์ ๊ฐ ์์ธ์ด์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ๋งจ ์ฒ์์๋ cache๋ผ๋ ๊ฐ์ฒด๋ฅผ fetchingํ๋ ํจ์์ ๋ฐ๊นฅ์ ๋๊ณ key๊ฐ์ ์๋ํฌ์ธํธ๋ก ํ์ฌ ๊ด๋ฆฌํ๊ณ ์ ํ๋ค. ํ์ง๋ง ์ด๋ฌํ ๊ฒฝ์ฐ๋ ์์๋ฐฉํธ์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ํ๋ฉด ๋ Suspense์ Fetching ๋ก์ง์ ์ ์ด์ฉํ ์ ์์๊น๋ฅผ ๊ณ ๋ฏผํ์๋ค.
export default function getHeadlines() {
return fetchData<Article[]>(fetcher.get(HEADLINE_URI));
}
...
const response = getHeadlines();
export default function ShortNews() {
const headlines = response.read();
return (
<div className="flex gap-4">
<AutoRollingNews
newsList={headlines?.slice(0, Math.floor(headlines.length / 2))}
direction="LEFT"
/>
<AutoRollingNews
newsList={headlines?.slice(0, Math.floor(headlines.length / 2))}
direction="RIGHT"
/>
</div>
);
}
๋ฐ๋ผ์ fetchํ๋ ํจ์ ์์ฒด๋ฅผ ์ปดํฌ๋ํธ์ ๋ฐ๊นฅ์์ ์คํํ๊ณ , ๋ฐ์ดํฐ ํ์นญ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํจ๊ณผ ๋์์ ์ปดํฌ๋ํธ๋ฅผ ๋ณด๋ค ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
๋ฆฌ๋ทฐ ์์ฒญ
์๋ ํ์ธ์ ๋ฉํ ๋! ํญ์ ๊ณ ์ ๋ง์ผ์ญ๋๋ค๐โโ๏ธ ๋ฒ์จ ๋ง์ง๋ง ๋ฆฌ๋ทฐ๋ค์ ๐ฅฒ ๋ฉํ ๋ ํผ๋๋ฐฑ์ ๋ฃ๊ณ ์๋กญ๊ฒ ๋ฐฐ์ด ๊ฒ๋ค์ด ์ ๋ง ๋ง์๋๋ฐ ๋ง์ด ์์ฝ์ต๋๋คใ ใ
NOSQL์ ํ์ฉ
์ด๋ฒ์ firestore์ ์กฐ๊ธ์ฉ ์์๊ฐ๋ฉด์ NOSQL์ด ์ฌ๋ฐ๊ธฐ๋ ํ๋ฉด์ ์๊ฐ๋ณด๋ค ๋ ์ค๊ณ๊ฐ ์ด๋ ค์ ์ต๋๋ค.. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค๊ณํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ๊ฐ๊ฐ์ collection์ ๋ํด์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํ ์ง์ ๋ํด์ ๊ณ ๋ฏผ์ด ๋ง์ด ๋๋๋ผ๊ณ ์..
์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ด๋ฒ์ category, article, publisher๋ฑ์ ๋๋ฉ์ธ์ ๊ฐ๊ฐ ๋ฃจํธ ์์ค์ ์ปฌ๋ ์
์ผ๋ก ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ด ๊ฒฝ์ฐ์ ๋ง์ฝ publisher(์ธ๋ก ์ฌ)์์ ์์ฑํ ๊ธฐ์ฌ์ ๊ฒฝ์ฐ์ ๋ํด์ ๊ฐ ๊ธฐ์ฌ document์ id๋ง์ ๋ด์๋์ ์ ์๋๋ก ํ์๊ณ , ์ด๋ฅผ ์ํํ๋ฉด์ ๊ทธ๋๋ง๋ค db์ ์ ๊ทผํ์ฌ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ ํ๋ฒ์ ๊ฐ์ ธ์ค์ง ์๊ณ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์์ฐจ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ฒ์ด ๊ณผ์ฐ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ผ์ง ๊ฐ์๊ธฐ ๊ถ๊ธํด์ ธ์ ์ง๋ฌธ๋๋ฆฝ๋๋ค!
ํด๋๊ตฌ์กฐ ํผ๋๋ฐฑ ์์ฒญ
entities : ๋๋ฉ์ธ๋ณ ์ปดํฌ๋ํธ์ ํ์ ๋๋ ํ ๋ฆฌ๋ค
- widget: entities๋ค์ด ๋ชจ์ฌ ํ๋์ ์น์ , ์ฆ ํ์ด์ง์์ ํ์ฉํ๋ ํฐ ๋จ์์ ๋ ๋ฆฝ์ ์ปดํฌ๋ํธ๋ค. entities๋ค์ ๋ฌถ๊ณ ํ์ entites๋ก ํ์ํ state๋ฅผ ๋ด๋ ค์ฃผ๋ ์ญํ
- app : ์ํธ๋ฆฌ ํฌ์ธํธ์ด์ ์ ์ญ ์คํ์ผ, ํ์ฌ๋ ๋จ์ผ ํ์ด์ง๋ฏ๋ก ํด๋น app์ ์์ชฝ ์์๋ฅผ ์ฑ์๋ฃ์ ์์
- shared: ๊ณตํต์ ์ผ๋ก ์ด๋์๋ ์ฐ์ผ ์ ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ง ์๋ ์ปดํฌ๋ํธ๋ค
ํ์ ๋๋ ํ ๋ฆฌ๋ก๋
- ui: ๊ธฐ๋ณธ์ ์ธ ๋์์ธ ์์
- api: ํ์ํ api fetchingํ๋ ํจ์๋ค
- lib: ์ปดํฌ๋ํธ์์ ํ์ํ ์ ํธํจ์๋ค์ด๋ ์ฌ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ์ปดํฌ๋ํธ
- model: ๋น์ฆ๋์ค ๋ก์ง(ํ )์ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ํ์
์ด์ ๊น์ง ๊ณ์ํด์ ์กฐ๊ธ์ฉ ๊ณ ์น๋ฉด์ ํด๋ ๊ตฌ์กฐ๋ฅผ ์ด๋ฐ ์์ผ๋ก ๋๋์ด ๋ณด์์ต๋๋ค. ์ฒซ ์ฃผ์ ๋ง์๋๋ ธ๋ ๋ถ๋ถ์์ ์กฐ๊ธ์ฉ ๊ณ ์ณ์ง ๋ฒ์ ์ด ์์ต๋๋ค. ์ ๋ model์์ ํ ๊ณผ ํ์ , ์์๊ฐ ๋ฐ๋ก ๋ถ๋ฆฌ๋์ด ์์๋ค๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ธด ํ์ง๋ง ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ๋ถํธํ ์ ์ด ๋ง์ง๋ ์์๋๋ฐ, ํน์ ์๊ฐํ์๋ ๊ฐ์ ๋ฐฉ์์ด ์์ผ์๋ค๋ฉด ์กฐ๊ธ ๋ ๋ง์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๊ทธ ์ธ์..
๊ทธ ์ธ์๋ ์ ์ฒด์ ์ผ๋ก ํผ๋๋ฐฑ์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ์ด๋ฒ์ฃผ ์คํฐ๋ ๊ทธ๋ฃน์์ ์ ๋ ๊ฐ์ฅ ๋ง์กฑ์ค๋ฝ๊ฒ ๋๊ผ๋ ๋ถ๋ถ์ด ์๋ง ์ ๊ฐ ๋ชฐ๋๋ ํ์ต ํค์๋๋ฅผ ๋ง์ด ์ป์๋ ๋ถ๋ถ ๊ฐ์ต๋๋ค! ๋ฉํ ๋ ๋ฟ๋ง ์๋๋ผ ๊ทธ๋ฃน์๋ถ๋ค์ด ๋์ ธ์ฃผ์๋ ํค์๋๋ค๋ ๋ชจ๋ฅด๋๊ฒ ๋ง์์ ์ฑ์ฅํ๋ ๋๋์ด ๋ง์ด ๋ค๋๋ผ๊ตฌ์ใ ใ ๊ทธ๋์ ์ถ๊ฐ์ ์ผ๋ก ์์ฒญ๋๋ฆฌ๊ณ ์ถ์๋ ๊ฒ์ด ํน์ ์ ๊ฐ ๋ณด๋ค ํ์ตํ์ผ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ์๋ ํค์๋๊ฐ ์์ผ์๋ค๋ฉด ๋ง์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋คใ ใ 2์ฃผ์ผ๋์ ์ ๋ง ๊ฐ์ฌํ์ต๋๋ค!!