์ฃผ์š” ์ž‘์—…

  • ์„œ๋ฒ„
    • 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์ฃผ์ผ๋™์•ˆ ์ •๋ง ๊ฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!!