6/4 TIL

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

TIL

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

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

  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ˆ˜์ •
  • ๋‰ด์Šค ํ”ผ๋“œ ํ”„๋กœ์ ํŠธ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ˆ˜์ •

์–ด์ œ ๋ญ˜ ๊ฑด๋“œ๋ ธ๋Š”์ง€ ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•œ ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๊ณ„์† else์ผ ๋•Œ ๋œจ๋Š” alert์ฐฝ์ด ๊ณ„์† ๋œจ๋Š”๋ฐ, ๋˜ ๋กœ๊ทธ์ธ์€ ๋˜๋Š” ์ด์ƒํ•œ ํ˜„์ƒ์„ ๊ฒช๊ณ  ์žˆ๋‹ค.

์ฝ˜์†”๋กœ๊ทธ์—๋„ ์ž˜ ์ฐํžˆ๋Š”๋ฐ ๋„๋Œ€์ฒด ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ฝ”๋“œ์—์„œ ํ•œ ๋ฒˆ ์ฐพ์•„๋ดค๋‹ค..

 const signInWithEmailPassword = async (e) => {
    e.preventDefault();
    try {
      const { data, error } = await supabase.auth.signInWithPassword({
        email,
        password
      });
      if (error) {
        throw error;
      }
      console.log(data);
      if (data) {
        setSignIn(true);
        alert(`${session.user.user_metadata.nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.`);
        navigate('/');
      } else {
        alert('๋“ฑ๋ก๋œ ์ •๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.');
      }
    } catch (error) {
      console.error('๋กœ๊ทธ์ธ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error.message);
      alert('์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.');
    }
  };

์–ด์ œ์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‹ˆ๊น ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋‹จ ๋ฒˆ์— ์ฐพ์•„๋ฒ„๋ ธ๋‹ค..

์ฝ˜์†”์ฐฝ์„ ๋ณด๋‹ˆ data๋Š” ์ž˜ ์ฐํžˆ๋Š”๋ฐ 82๋ฒˆ์งธ ์ค„์ธ alert๊ฐ€ ๋ฌธ์ œ์ธ ๊ฑธ ๋ณด๋‹ˆ๊น ๋”ฑ ๋“œ๋Š” ์ƒ๊ฐ

๋„๋Œ€์ฒด ๋‚œ ์™œ data๋ฅผ ๋ฐ›์•„๋†“๊ณ  alert์—๋Š” session.user์˜ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ๋Š”๊ฐ€.. ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋ฐ”๋กœ ์ˆ˜์ •ํ•ด์คฌ๋‹ค.

alert(`${data.user.user_metadata.nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.`);

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ์ž‘๋™์„ ์‹œ์ผœ๋ดค๋‹ค!! ๋‘๊ทผ๋‘๊ทผ

์ด์ œ์„œ์•ผ ๋กœ์ง์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.. ๊ฐ๊ฒฉ

ํ™•์‹คํžˆ ์ €๋Ÿฐ ๋‹จ์–ด ์‹ค์ˆ˜ ํ•˜๋‚˜๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋จนํ†ต์ด ๋˜์–ด๋ฒ„๋ฆฌ๋‹ˆ
์กฐ์‹ฌ ๋˜ ์กฐ์‹ฌํ•ด์•ผ๊ฒ ๋‹ค..

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ์ง๋ฉด..

์ด๋ฒˆ์—๋Š” Github๋กœ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์˜ ๊ธฐ๋Šฅ์ด ๋จนํ†ต์ด๋‹ค.

์›๋ž˜ Github๋กœ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ฒซ ๋กœ๊ทธ์ธ ์‹œ์—๋งŒ Github ํŽ˜์ด์ง€์—์„œ ์—ฐ๋™์ฐฝ์ด ๋œจ๊ณ , ํ•œ ๋ฒˆ ์—ฐ๋™์„ ํ•˜๊ณ  ๋‚˜๋ฉด ๋ฒ„ํŠผ ํด๋ฆญ๋งŒ ํ•ด๋„ ์•Œ์•„์„œ Github๋กœ ๋กœ๊ทธ์ธ์ด ๋˜๋ฉด์„œ ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™์ด ๋ผ์•ผ ํ•˜๋Š”๋ฐ ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•˜๋‹ค๋Š” alert์ฐฝ์ด ๋œจ๊ณ ๋‚œ ํ›„, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ๊ฑฐ์ณ ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.. ์ด๊ฒŒ ๋ฌด์Šจ ๋‚œ์žฅํŒ์ธ๊ฐ€?
๋ฌธ์ œ์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

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

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

   const signOut = (e) => {
    e.preventDefault();
    setSignIn(false);
   }

์ง„์งœ ๋‚˜๋Š” ๋ฐ”๋ณด์ธ๊ฐ€ ๋ณด๋‹ค ์ฝ˜์†”๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด data ์•ˆ์— user๋ผ๋Š” ์ •๋ณด๊ฐ€ ์—†๋Š”๋ฐ ๊ณ„์† if๋ฌธ์—๋‹ค๊ฐ€ data์™€ ๊ทธ data ์•ˆ์— user๊ฐ€ ์žˆ์„ ์‹œ์— ๋กœ๊ทธ์ธ์„ ์‹œํ‚ค๊ณ , ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ๋” ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์žˆ์ง€๋„ ์•Š์€ user์˜ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ์žˆ์œผ๋‹ˆ ๊ณ„์† else๋ฌธ์ด ์ž‘๋™๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค

๊ธฐ์กด์˜ ์ฝ”๋“œ์—์„œ && data.user๋ฅผ ์ง€์›Œ์ฃผ๊ณ , setSignIn ์ƒํƒœ๋Š” ๋”ฐ๋กœ true,false๋กœ ์ •ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฑฐ ๊ฐ™์•„์„œ ์ง€์›Œ์คฌ๋‹ค.

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

์ˆ˜์ •์„ ํ•ด์ฃผ๋‹ˆ ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•˜๋‹ค๋Š” alert๋Š” ๋ณด์ด์ง€๋„ ์•Š๊ณ  ์ž˜๋งŒ ์ž‘๋™ํ•œ๋‹ค.

ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

์œ—๋ถ€๋ถ„ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๋Š” ์ œ์™ธํ•˜๊ณ  ๊ธฐ๋Šฅ์ ์ธ ๋™์ž‘์„ ํ•˜๋Š” ์ฝ”๋“œ๋“ค๋งŒ ์ ์—ˆ๋‹ค.

const SignUpPage = () => {
  const navigate = useNavigate();
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [nickname, setNickname] = useState('');
  const [isSubmitting, setIsSubmitting] = useState(false);

  const signUpWithEmail = async (e) => {
    e.preventDefault();
    try {
      setIsSubmitting(true);
      const { error } = await supabase.auth.signUp({
        email,
        password,
        options: {
          data: {
            nickname,
          }
        }
      });

      if (error) {
        throw error;
      }

      navigate('/login');
    } catch (error) {
      console.error('ํšŒ์›๊ฐ€์ž… ์˜ค๋ฅ˜ ๋ฐœ์ƒ', error.message);
    } finally {
      setIsSubmitting(false);
    }
  };

  const handleSignUp = async () => {
    try {
      setIsSubmitting(true);
      const { error } = await supabase.auth.signInWithOAuth({
        provider: 'github'
      });

      if (error) {
        throw error;
      }

      navigate('/');
    } catch (error) {
      console.error('GitHub ๋กœ๊ทธ์ธ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error.message);
    } finally {
      setIsSubmitting(false);
    }
  };

  return (
    <Container>
      <Title>ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€</Title>
      <Form onSubmit={signUpWithEmail}>
        <Input 
          type="email" 
          name="email" 
          placeholder="์ด๋ฉ”์ผ" 
          value={email} 
          onChange={(e) => setEmail(e.target.value)} 
          required 
        />
        <Input 
          type="password" 
          name="password" 
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ" 
          value={password} 
          onChange={(e) => setPassword(e.target.value)} 
          required 
        />
        <Input 
          type="text" 
          name="nickname" 
          placeholder="๋‹‰๋„ค์ž„" 
          value={nickname} 
          onChange={(e) => setNickname(e.target.value)} 
          required 
        />
        <Button type="submit" disabled={isSubmitting}>
          {isSubmitting ? '๊ฐ€์ž… ์ค‘...' : 'ํšŒ์›๊ฐ€์ž…'}
        </Button>
      </Form>
      <Button onClick={handleSignUp} disabled={isSubmitting}>
        {isSubmitting ? '๋กœ๋”ฉ ์ค‘...' : 'GitHub๋กœ ํšŒ์›๊ฐ€์ž…'}
      </Button>
      <Button onClick={() => navigate('/login')}>๋กœ๊ทธ์ธ</Button>
    </Container>
  );
};

export default SignUpPage;

๋”ฐ๋กœ ํŠน๋ณ„ํ•œ ๊ฑด ์—†์ง€๋งŒ disabled={isSubmitting}๋ฅผ ์จ์คŒ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํด๋ฆญํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์คฌ๋‹ค.

isSubmitting์€ ํšŒ์›๊ฐ€์ž… ์–‘์‹์ด ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ธ๋ฐ ์ด ๊ฐ’์ด true๋ฉด ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ž„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, false๋ผ๋ฉด ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์™„๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

isSubmitting ์ƒํƒœ ๋ณ€์ˆ˜๋Š” ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์˜ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋ณต์œผ๋กœ ํšŒ์›๊ฐ€์ž…์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ์„ ํ•œ ํ›„์— setSignIn์ด false๊ฐ€ ๋๋Š”๋ฐ๋„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ๋‹ค์‹œ ์ž๋™ ๋กœ๊ทธ์ธ์ด ๋ผ๋ฒ„๋ ค์„œ ๊ฐ•์ œ๋กœ true๋กœ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ๋‹ค.

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

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด.. try, catch๋ฅผ ์–ด๋”ฐ ๊ฐ–๋‹ค ํŒ”์•˜๋Š”์ง€ ์ฐ๋ ํ•œ ์ฝ”๋“œ๋งŒ ๋ฉ๊ทธ๋Ÿฌ๋‹ˆ ๋‚จ์•„์žˆ์—ˆ๋‹ค

const signOut = async(e) => {
	e.preventDefault();
  	setSignIn(false);
}

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

  const signOut = async (e) => {
    e.preventDefault();
    try {
      const { error } = await supabase.auth.signOut();
      if (error) {
        throw error;
      }
      setSignIn(false);
    } catch (error) {
      console.error('๋กœ๊ทธ์•„์›ƒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ', error.message);
    }
  };

supabase sign out ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ ๋‚˜์„œ ์ˆ˜์ •์„ ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋กœ๊ทธ์•„์›ƒ์„ ํ•œ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ๋กœ ๋ฐ”๋€Œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ง๋”ํžˆ ์žกํ˜”๋‹ค.

๋งก์€ ๊ธฐ๋Šฅ์€ ์–ผ์ถ” ๋๋‚˜๊ฐ€๋Š” ๊ฑฐ ๊ฐ™์€๋ฐ ๋‹ค๋ฅธ ๋””ํ…Œ์ผ์ ์ธ ๋ถ€๋ถ„์ด๋‚˜, ํšŒ์›๊ฐ€์ž… ์ ˆ์ฐจ์—์„œ ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„ ์ค‘๋ณตํ™•์ธ๋งŒ ํ•˜๋ฉด ๋  ๊ฑฐ ๊ฐ™๋‹ค

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

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