6/7 TIL (News Feed Project ์ œ์ถœ)

Hwiยท2024๋…„ 6์›” 10์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
44/96

๐Ÿ“– ์ง„ํ–‰ํ•œ ๊ณต๋ถ€ ๐Ÿ“–

  • ์˜ค๋ฅ˜ ์ˆ˜์ •
  • ๊ธฐ๋Šฅ ์„ค๋ช… ๋ฐ ํŒ€ ํšŒ๊ณ 

ํ™ˆํŽ˜์ด์ง€์—์„œ ์ด๊ฒƒ์ €๊ฒƒ ์‚ดํŽด๋ณด๋‹ค๊ฐ€ 2๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ

๋ฌด์Šจ ์˜ค๋ฅ˜์ธ์ง€?

1.๋กœ๊ทธ์ธ ํ•˜๋ฉด alert์— ๋‹‰๋„ค์ž„์ด ๋œจ์ง€ ์•Š๊ณ undefined๊ฐ€ ๋œจ๋Š” ๋ฌธ์ œ

์ผ๋‹จ 1๋ฒˆ์˜ alert์— undefined๊ฐ€ ๋œจ๋Š” ์˜ค๋ฅ˜๋ถ€ํ„ฐ ์žก์•„๋ดค๋‹ค.

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์€ supabase.auth.signInWithPassword()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•˜์˜€๋Š”๋ฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๋งŒ ์ œ๊ณตํ•˜๊ณ  nickname์€ users ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ธฐ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ

const signInWithEmailPassword = async (e) => {
    e.preventDefault();
    try {
      const { data, error } = await supabase.auth.signInWithPassword({
        email,
        password
      });
      if (error) {
        throw error;
      }

      if (data) {
        dispatch(setSignIn(true));
        alert(`${data.user.user_metadata.nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.`);
        navigate('/');
      } else {
        alert('๋“ฑ๋ก๋œ ์ •๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.');
      }
    } catch (error) {
      console.error('๋กœ๊ทธ์ธ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error.message);
      alert('๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ');
    }
  };

๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์ •๋ณด๋งŒ ์ œ๊ณต๋ฐ›์•˜์ง€ ๋‹‰๋„ค์ž„์€ ๋”ฐ๋กœ ์ œ๊ณต๋ฐ›์ง€ ๋ชปํ•˜์˜€๊ธฐ์— ๋ณ„๋„๋กœ users ํ…Œ์ด๋ธ”์—์„œ ๋‹‰๋„ค์ž„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜์—ฌ์•ผ ํ–ˆ๋‹ค.

๋‹‰๋„ค์ž„ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง

const user = data.user;
const { data:userMetadata, error: userMetadataError }
= await.supabase
.from('users')
.select('nickname')
.eq('id', id)
.single();

if(userMetadataError) {
	throw UserMetadataError;
}

ํ…Œ์ด๋ธ”์—์„œ ๋ญ”๊ฐ€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋• ๋ณดํ†ต ์•„๋ž˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

from() : ํŠน์ • ํ…Œ์ด๋ธ” ์„ ํƒ ์‹œ ์‚ฌ์šฉ
select() : ์ง€์ •ํ•œ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜ฌ ์ปฌ๋Ÿผ์„ ์„ ํƒ
eq() : ํŠน์ • ์ปฌ๋Ÿผ์ด ํŠน์ • ๊ฐ’๊ณผ ์ผ์น˜ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด
single() : ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋‹จ์ผ ํ–‰(single row)์ผ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•  ๋•Œ ์‚ฌ์šฉ

์ˆ˜์ • ํ›„ ์ฝ”๋“œ

 const signInWithEmailPassword = async (e) => {
    e.preventDefault();
    try {
      const { data, error } = await supabase.auth.signInWithPassword({
        email,
        password
      });
      if (error) {
        throw error;
      }

      const user = data.user;
      const { data: userMetadata, error: userMetadataError } = await supabase
        .from('users')
        .select('nickname')
        .eq('id', user.id)
        .single();

      if (userMetadataError) {
        throw userMetadataError;
      }

      dispatch(setSignIn(true));
      alert(`${userMetadata.nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.`);
      navigate('/');
    } catch (error) {
      console.error('๋กœ๊ทธ์ธ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error.message);
      alert('๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ');
    }
  };

๊ธฐ์กด์˜ ์ฝ”๋“œ์—์„œ if๋ฌธ์„ ์—†์• ๊ณ  ๋‹‰๋„ค์ž„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ ํ›„, alert์—์„œ userMetadata.nickname์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋‹ˆ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

1๋ฒˆ์˜ ๊ฒฝ์šฐ์—” ๋กœ์ง ๋ฌธ์ œ์˜€์–ด์„œ ๋กœ์ง ์ˆ˜์ •์„ ํ•ด์ฃผ๋‹ˆ ์ž˜ ์ž‘๋™ํ–ˆ๋‹ค

2.๊นƒํ—ˆ๋ธŒ๋กœ ๋กœ๊ทธ์ธ ํ–ˆ์„ ๋•Œ๋งŒ ๋งˆ์ดํŽ˜์ด์ง€ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ฒ˜์Œ ํ•œ๋ฒˆ์€ ๋งˆ์ดํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ๊ณ ์นจ ๋จ

Github๋กœ ๋กœ๊ทธ์ธ ํ•  ๋•Œ๋Š” ๋‹จ๊ณ„๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ„๋žตํ•˜๊ฒŒ ์ ์–ด๋ณด์ž๋ฉด

OAuth ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ํ•  ๋•Œ, ์•ฑ์—์„œ GitHub๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์—ฌ ๋กœ๊ทธ์ธ => ๋กœ๊ทธ์ธ ํ›„ GitHub์—์„œ ๋‹ค์‹œ ์•ฑ์œผ๋กœ ๋Œ์•„์˜ค๋ฉฐ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌ

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ Github๋กœ ์—ฐ๋™ํ•˜์—ฌ ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ

async function signInWithGithub() {
    const { error, data } = await supabase.auth.signInWithOAuth({
      provider: 'github'
    });

    if (error) {
      console.error('๊นƒํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ ์—๋Ÿฌ', error.message);
      alert('๋กœ๊ทธ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');
      return
    }
    console.log('OAuth ๋ฐ์ดํ„ฐ:', data);

    if (data) {
      dispatch(setSignIn(true));
      navigate('/');
    } else {
      alert('ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');
      navigate('/signup');
    }
  }

ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ์˜ ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ.. ํ˜น์‹œ๋‚˜ ํ•ด์„œ
๋กœ์ง์„ ๋ฐ”๊ฟ”๋ดค๋Š”๋ฐ๋„ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ณ ์น˜์ง€ ๋ชปํ–ˆ๋‹ค ใ… ใ… ใ… ใ…  ๋„˜๋‚˜ ์•„์‰ฌ์šด ๊ฑฐ..

๊ทธ๋ฆฌ๊ณ  vercel๋กœ ๋ฐฐํฌ๋ฅผ ํ•˜๋ฉด ๊ฐ€๋” ๊ฐ€๋‹ค๊ฐ€

์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํŒ€์› ๋ถ„์ด ์˜ค๋ฅ˜๋ฅผ ๊ณ ์ณ์ฃผ์…จ๋‹ค! ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฑธ ํŒ€์› ๋ถ„ ๋•์— ์ข‹์€ ์ •๋ณด๋ฅผ ์–ป์—ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

SPA ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•œ ๋’ค ๋™์ ์œผ๋กœ ๋ผ์šฐํŒ… ์ ‘๊ทผ์‹œ, (์ฆ‰ ๋ผ์šฐํŠธ ์ด๋™ ํ›„ ์ค‘๊ฐ„์— ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜, ํ•˜์œ„ url(ex. moonshot/dashboard)๋กœ ์ ‘๊ทผํ–ˆ์„ ๊ฒฝ์šฐ vercel์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 404 Not_Found ์—๋Ÿฌ๋ฅผ ๋ฑ‰์Šต๋‹ˆ๋‹ค.

SPA์˜ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 404 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” vercel ๋ฌธ์„œ์˜ rewrites ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๊ฒฐํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(1) ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— vercel.json์ด๋ผ๋Š” ๋ฐฐํฌ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
(2) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์šฐํŒ… rewrites ์„ค์ •์„ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.
{
"routes": [{ "src": "/[^.]+", "dest": "/", "status": 200 }]
}

์ด๋ฒˆ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งก์•˜๋˜ ๊ธฐ๋Šฅ, ๊ฒช์—ˆ๋˜ ๊ธฐ์ˆ ์  ์–ด๋ ค์›€, ๋А๋‚€์ ์— ๋Œ€ํ•ด ์ ์–ด๋ณด๊ฒ ๋‹ค.

๋กœ๊ทธ์ธ

ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•œ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๊ณ„์† else์ผ ๋•Œ ๋œจ๋Š” alert์ฐฝ์ด ๊ณ„์† ๋œจ๋Š”๋ฐ, ๋˜ ๋กœ๊ทธ์ธ์€ ๋˜๋Š” ์ด์ƒํ•œ ํ˜„์ƒ์„ ๊ฒช์—ˆ์—ˆ๋Š”๋ฐ ์œ„์—์„œ ๋ฐ›์•„์˜จ ๋ณ€์ˆ˜๋ช…์„ ์•„๋ž˜์—์„œ ์ž˜๋ชป ์ž…๋ ฅํ•ด์„œ ์‚ฌ์†Œํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜๋ก ์˜คํƒ€๋ฅผ ์ž˜ ๋ด์•ผ ํ•˜๋Š” ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฉ”์ผ์„ ํ†ตํ•œ ๋กœ๊ทธ์ธ์€ supabase์—์„œ ์ œ๊ณตํ•˜๋Š” auth ๋ฉ”์„œ๋“œ์ธ signInWitnPassword(), ๊นƒํ—ˆ๋ธŒ๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ์ธ์€ signInWithOAuth()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž…

ํšŒ์›๊ฐ€์ž… ์ ˆ์ฐจ์—์„œ ์ค‘๋ณต๋œ ์ด๋ฉ”์ผ, ์ค‘๋ณต๋œ ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•ด๋„ ์ค‘๋ณต๋œ ์ด๋ฉ”์ผ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋งŒ ์ถœ๋ ฅ๋˜๊ณ  ์ค‘๋ณต๋œ ๋‹‰๋„ค์ž„์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋Š” ์ถœ๋ ฅ์ด ์•ˆ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ค‘๋ณต๋œ ์ด๋ฉ”์ผ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด return์„ ์‹œ์ผœ๋ฒ„๋ ค์„œ ๊ทธ ์•„๋ž˜์— ์งœ์—ฌ์ง„ ๋‹‰๋„ค์ž„ ์ค‘๋ณต ํ™•์ธ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ ์ถœ๋ ฅ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ์ž‘๋™์„ ์•ˆํ–ˆ๋˜ ๊ฑฐ๋ผ์„œ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ค‘๋ณต ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •์„ ํ•จ์œผ๋กœ์จ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋• ๊ฐ€์žฅ ๋จผ์ € auth์˜ ๋ฉ”์„œ๋“œ์ธ signUp() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋“ค์„ supabase์— ๋“ฑ๋กํ–ˆ๊ณ  ๊ทธ ์™ธ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊บผ๋‚ด์“ฐ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‹‰๋„ค์ž„, ์ด๋ฉ”์ผ์€ ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด์•„๋†“์€ ํ…Œ์ด๋ธ” ์•ˆ์— ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด from(), insert(), select(), eq(), single() ๋“ฑ ๋‹ค์–‘ํ•œ supabase ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•œ ์ ์ˆ˜ ๋ฐ ๋А๋‚€ ์ 

ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•œ ์ ์ˆ˜๋Š” 10์  ๋งŒ์ ์— 10์ , ์ €์— ๋Œ€ํ•œ ์ ์ˆ˜๋Š” 6.5์  ์ •๋„ ๋˜๋Š” ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•œ ์ ์ˆ˜๊ฐ€ 10์ ์„ ์ค€ ์ด์œ ๋Š” ํŒ€์›๊ณผ์˜ ํ˜‘์—… ๊ณผ์ •์—์„œ ์›ํ• ํ•œ ์†Œํ†ต ๋ฐ ํšŒ์˜๋ฅผ ํ†ตํ•ด ํ•„์ˆ˜ ๊ตฌํ˜„ ์‚ฌํ•ญ์€ ๋ฌผ๋ก  ์ถ”๊ฐ€์ ์ธ ๋Œ“๊ธ€, ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŠธ ๊ธฐ๋Šฅ, ํ”„๋กœํ•„ ์‚ฌ์ง„ ๋“ฑ๋ก, ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ ๋“ฑ ์ถ”๊ฐ€์ ์ธ ๋„์ „ ๊ณผ์ œ ํ•ญ๋ชฉ์„ ์ž˜ ์ฑ™๊ธด ๊ฑฐ ๊ฐ™์•„์„œ ๋งŒ์ ์ž…๋‹ˆ๋‹ค!
๊ฐœ์ธ์ ์œผ๋กœ ์Šค์Šค๋กœ์— ๋Œ€ํ•œ ์ ์ˆ˜๊ฐ€ ์™œ 6.5์ ์ธ์ง€ ์•„์‰ฌ์šด ์ ์„ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด, ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋””ํ…Œ์ผ์ ์ธ ๋ถ€๋ถ„์„ ์ข€ ๋” ์‚ด๋ฆฌ์ง€ ๋ชปํ•œ ์ ๊ณผ supabase์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ์กฐ๊ธˆ ๋–จ์–ด์ง€๋Š” ๋ฐ”๋žŒ์— ์ฝ”๋“œ๊ฐ€ ์‚ด์ง ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ด ๋งŽ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ "redux๋กœ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ์ดˆ๊ธฐ ์…‹์—…์„ ํ•ด๋’€๋‹ค๋ฉด ์–ด๋• ์„๊นŒ? ์กฐ๊ธˆ์€ ๋” ์ˆ˜์›”ํ•˜์ง€ ์•Š์•˜์„๊นŒ?" ํ•˜๋Š” ์ƒ๊ฐ์€ ๋“ค์—ˆ์œผ๋‚˜, props drilling์œผ๋กœ ์‹œ์ž‘ํ•œ ๊ฑฐ ์น˜๊ณ  ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜จ ๊ฑฐ ๊ฐ™์•„์„œ ์ข‹์Šต๋‹ˆ๋‹ค.

profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์–ด~~~

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