ํํ์ด์ง์์ ์ด๊ฒ์ ๊ฒ ์ดํด๋ณด๋ค๊ฐ 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์ผ๋ก ์์ํ ๊ฑฐ ์น๊ณ ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ ๊ฑฐ ๊ฐ์์ ์ข์ต๋๋ค.