์ด์ ๋ญ ๊ฑด๋๋ ธ๋์ง ํ์๊ฐ์ ์ ์งํํ ์์ด๋, ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ์ ํ๋ฉด ๊ณ์ 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 ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๊ณ ๋์ ์์ ์ ํ๊ณ ๋๋ ๋ก๊ทธ์์์ ํ ํ ์๋ก๊ณ ์นจ์ ํ๋ฉด ์๋์ผ๋ก ๋ก๊ทธ์ธ ์ํ๋ก ๋ฐ๋๋ ์ค๋ฅ๊ฐ ๋ง๋ํ ์กํ๋ค.
๋งก์ ๊ธฐ๋ฅ์ ์ผ์ถ ๋๋๊ฐ๋ ๊ฑฐ ๊ฐ์๋ฐ ๋ค๋ฅธ ๋ํ ์ผ์ ์ธ ๋ถ๋ถ์ด๋, ํ์๊ฐ์ ์ ์ฐจ์์ ์ด๋ฉ์ผ, ๋๋ค์ ์ค๋ณตํ์ธ๋ง ํ๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค