[React] ๐Ÿ‘ป Soul Pick ๐ŸŽธ

์ดˆ์ดยท2024๋…„ 6์›” 7์ผ

๐Ÿ’ป ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
8/13
post-thumbnail

๐Ÿ‘ป Soul Pick ๐ŸŽธ


ํ˜ผ์ž๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ์•„๊นŒ์šด ๋…ธ๋ž˜, ๋‚˜๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋ช…๊ณก์„ ๊ณต์œ ํ•˜๋ฉฐ ์˜๊ฒฌ์„ ์†Œํ†ตํ•ด๋ณด์„ธ์š”!



๐Ÿ—“๏ธ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ


  • ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ React ํŒ€ ํ”„๋กœ์ ํŠธ
  • ๊ฐœ๋ฐœ๊ธฐ๊ฐ„: 2024.05.31 ~ 2024.06.06
  • github: github ์ฃผ์†Œ
  • ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ: Soul Pick
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

    FrontEndBackEnd๋ฒ„์ „๊ด€๋ฆฌ๋ฐฐํฌ
    - React
    - Styled-Components
    - Redux
    SupabaseGitHubVercel


๐Ÿ—ƒ๏ธ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


  • react-youtube

    react-youtube๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ youtube url์— ๋งž๋Š” ๋™์˜์ƒ์„ ํ‹€ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • uuid

    comment list๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, supabase์—์„œ๋Š” uuid๊ฐ’์„ ๋ฐ›์•„์™€์„œ item์˜ key๊ฐ’์ด ๊ณ ์œ ํ•˜์ง€๋งŒ, ์ถ”๊ฐ€ํ•œ comment๊ฐ€ state์— ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•  ๋•Œ๋Š” ๊ณ ์œ ํ•œ id๊ฐ’์ด ์—†์–ด์„œ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • styled-reset

    ์Šคํƒ€์ผ์„ reset ์‹œ์ผœ์„œ grobal style๋กœ ์ ์šฉ์‹œํ‚ค๋Š”๋ฐ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.



๐Ÿ› ๏ธ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ


  • Detail Page READ/UPDATE/DELETE

    ๊ฒŒ์‹œ๊ธ€ READ

    supabase๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ redux์•ˆ์— state์— post ๊ฐ’์„ ๋„ฃ์–ด์„œ ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    ๊ฒŒ์‹œ๊ธ€ UPDATE/DELETE

    ์šฐ์„  user๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€์ด๋ผ๋ฉด ์ˆ˜์ •, ์‚ญ์ œ ๋ฒ„ํŠผ์ด ๋ณด์ด๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€์„ updateํ•  ๋•Œ๋Š” redux์— ์ €์žฅํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ˆ˜์ •ํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐ”๋กœ ๋ฐ˜์˜๋˜๊ฒŒ ํ•œ ๋‹ค์Œ, supabase์— ๋ฐ”๋€ ๊ฐ’์„ ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€ delete๋Š” supabase์— ํ•ด๋‹น post๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋žœ๋”ฉํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๋Œ“๊ธ€ CRUD

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ redux์™€ supabase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    post ํŽ˜์ด์ง€๋ฅผ ์ง„์ž…ํ•  ๋•Œ, useEffect๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ์ดˆ ์ง„์ž… ์‹œ supabase ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€์„œ redux์— initComment๋กœ ๋ฆฌ์ŠคํŠธ์— state๋ฅผ ์ €์žฅํ•˜๊ณ 
    Create ์‹œ, redux์™€ supabase์— ๊ฐ’์„ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ฒŒ ํ•˜์˜€๊ณ  update/delete๋„ ํ•ด๋‹น ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋งŒ ์ˆ˜์ • ์‚ญ์ œ ๋ฒ„ํŠผ์ด ๋ณด์ด๊ฒŒ ํ•˜์˜€์œผ๋ฉฐ ๊ฐ’์ด ๋ณ€๊ฒฝ(์ˆ˜์ •/์‚ญ์ œ)์‹œ์—๋„ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•ด redux์™€ supabase์—์„œ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • User Data

    User fetch

    ํ™ˆํ™”๋ฉด์— ์ง„์ž…ํ•  ์‹œ, ํ˜„์žฌ ์ง„์ž…ํ•œ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์œ ์ €๋ผ๋ฉด, redux state์— ๊ฐ’์„ ์ €์žฅํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ, header ์˜ค๋ฅธ์ชฝ์— ์œ ์ € ํ”„๋กœํ•„, mypage ์œ ์ € ์ •๋ณด, detailpage์—์„œ input ์ฐฝ์— ์ž‘์„ฑ์ž์˜ ํ”„๋กœํ•„์— ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์œ ์ €์ธ์ง€ ์•„๋‹Œ์ง€ ๊ฒ€์ฆ์ž‘์—…์ด ํ•„์š”ํ•œ post ์ž‘์„ฑ ์‹œ, comment ์ž‘์„ฑ ์‹œ, my page ์ง„์ž… ์‹œ์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    User logout

    header์— ์žˆ๋Š” ํ”„๋กœํ•„ ํด๋ฆญ ์‹œ, ๋กœ๊ทธ์ธ ์œ ์ €๋ผ๋ฉด ๋œจ๋Š” select์—์„œ ๋กœ๊ทธ์•„์›ƒ์„ ๋ˆŒ๋ €์„ ๋•Œ, supabase ๋กœ์ง์„ ํ†ตํ•ด ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฉฐ ๋˜ํ•œ ๋ฐ”๋กœ ์ƒํƒœ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด user data๋ฅผ ์ €์žฅํ–ˆ๋˜ state์— ๊ฐ’์„ ๋นˆ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ guest(๋กœ๊ทธ์ธ์ด ์•ˆ๋œ ์ƒํƒœ)๋กœ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  • Style ์ž‘์—…

    figma๋ฅผ ์ด์šฉํ•˜์—ฌ ์™€์ด์–ด ํ”„๋ ˆ์ž„๊ณผ ๋ฉ”์ธ์ปฌ๋Ÿฌ ์ง€์ •, ๋ชจ๋“  ๋””์ž์ธ ๊ตฌ์ƒ์„ ๋งก์•˜์Šต๋‹ˆ๋‹ค.



๐Ÿ“ ์™€์ด์–ด ํ”„๋ ˆ์ž„




๐ŸŽจ Figma ๋””์ž์ธ




๐Ÿ—จ๏ธ ํšŒ๊ณ 

ํ”„๋กœ์ ํŠธ ์ผ์ •์— ๋Œ€ํ•ด

ํŒ€์žฅ์„ ๋งก์•„์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ˆ resourse๋ฅผ ํŒ€์›๋“ค์—๊ฒŒ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ์งง์€ ๊ธฐ๊ฐ„์— ๋งˆ๊ฐ๊ธฐํ•œ์— ๋งž๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜๋„ ๊ธฐํ•œ๋‚ด์— ๋ชจ๋“  ํ•„์ˆ˜ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ๋งŒ๋“ค๊ณ  ๋””ํ…Œ์ผ ํ•œ ๋””์ž์ธ๋„ ์ž˜ ์‚ด๋ ค์„œ ์™„์„ฑ๋„ ์žˆ๊ฒŒ ๋งˆ๋ฌด๋ฆฌ ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋ฟŒ๋“ฏํ•˜๋‹ค.

redux toolkit์— ๋Œ€ํ•ด

์ €๋ฒˆ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ redux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์ง€๋งŒ, ์•„๋ฌด๋ž˜๋„ page๊ฐ€ ๋งŽ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ์“ฐ์ด์ง€ ์•Š์•„์„œ ์‚ฌ์šฉ์˜ ์žฅ์ ์ด ํฌ๊ฒŒ ๋ถ€๊ฐ๋˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ, ์š”๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด state๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์›Œ์ง€๋Š”์ง€์™€ react toolkit์œผ๋กœ immer๋ฅผ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ ๊ฐ„๊ฒฐํ•ด์ง„๊ฒŒ ๋„ˆ๋ฌด ๋งค๋ ฅ์ ์ด์—ˆ๋‹ค.

supabase์— ๋Œ€ํ•ด

์ฒ˜์Œ ๋‹ค๋ฃจ๋Š” sql ์„œ๋น„์Šค์˜€์ง€๋งŒ ๋‚ด์žฅ๋œ ๋กœ์ง์œผ๋กœ ์—„์ฒญ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒฝํ—˜์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค. apiํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์™€ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ ธ์„œ ๋งŒ์กฑ์Šค๋Ÿฌ์› ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… ์†Œ์…œ ๋กœ๊ทธ์ธ ์ชฝ์„ ๋‹ค๋ฃจ์ง€ ๋ชปํ•ด์„œ ์•„์‰ฌ์› ๋‹ค. ๋‹ค์Œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค๋ฃจ๊ณ  ์‹ถ๋‹ค.

vercel ๋ฐฐํฌ

์ด ๋ถ€๋ถ„๋„ ํŒ€์›์ด ๋งก์•„ ์ฃผ์…”์„œ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌ๊ฐ€ ๋œ๋‹ค๋Š”๋ฐ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋Š” ๊ผญ vercel๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ๋‹ค!

loader์— ๋Œ€ํ•ด

react router v6์œผ๋กœ routing ์ž‘์—…์„ ํ–ˆ๋Š”๋ฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋ ๋•Œ loader๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋งˆ๊ฐ์— ๊ธ‰๊ธ‰ํ•ด์ ธ์„œ ๋ฏธ์ฒ˜ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ๊ฒŒ ๋„ˆ๋ฌด ์•„์‰ฝ๋‹ค.. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„  ๊ผญ ๋„ฃ์–ด์„œ ๋”์šฑ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๊ณ  ์‹ถ๋‹ค.

profile
๊ฐœ๋ฐœ ์ผ๊ธฐ์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€