[โœˆ๏ธ ์ตœ์ข…ํ”„๋กœ์ ํŠธ] ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€

โœ๏ธ ๋ฌธ์ œ ์ƒํ™ฉ

๋กœ๊ทธ์ธ ๋กœ์ง์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ "์ž˜๋ชป๋œ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค." ๋ผ๋Š” alert ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ๊ฐœ๋ฐœํ–ˆ๋‹ค.

์ด ๋กœ์ง์€ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ์…˜ ๋ชจ๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์•Œ๋ฆผ์ฐฝ์— ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๐Ÿคฏ

ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์„ ํŒŒ์•…ํ•ด ๋ณด๊ณ  ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด์ž!!

 

โœ๏ธ  ์˜ค๋ฅ˜

ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ

๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ๋‹ค.

 

ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ ์‹ค์ œ ๊ฒฐ๊ณผ

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ์…˜ ๋ชจ๋“œ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜์—ˆ๋‹ค. ใ…œใ…œ

 

โœ๏ธ  ์›์ธ ๋ถ„์„

์ด ๋ฌธ์ œ๋Š” Next.js ์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ํ™˜๊ฒฝ ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

  • ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ๋Š” ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ณ , ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์— ์—๋Ÿฌ์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ธ digest ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์„œ๋ฒ„์—์„œ throw new Error ๋ฅผ ์‚ฌ์šฉํ•ด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์—๋Ÿฌ์˜ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†๊ณ  digest ๊ฐ’๋งŒ ํ‘œ์‹œ๋œ๋‹ค.

Next.js ๊ณต์‹๋ฌธ์„œ ์—์„œ๋„ ์˜ˆ์ƒ๋œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ณ , ํ•ด๋‹น ๋ฐฉ์‹์— ๋”ฐ๋ฅด๋ฉด throw new Error ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ํด๋ผ์ด์–ธํŠธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

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

์•„๋ž˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ธฐ์กด ์ฝ”๋“œ์ด๋‹ค. ์„œ๋ฒ„์—์„œ throw new Error ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•˜๋˜ ๋ฐฉ์‹์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ด๋‹ค.

export const login = async (formData: { email: string; password: string }) => {
  const supabase = createClient();

  const { data, error: loginError } = await supabase.auth.signInWithPassword({
    email: formData.email,
    password: formData.password,
  });

  if (loginError?.code === 'invalid_credentials') throw new Error('์œ ํšจํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.');
  if (loginError) throw new Error('์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');
  console.error(loginError);

  return { message: '๋กœ๊ทธ์ธ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', data: data };
};
  • throw new Error ๋กœ ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋ฉด, ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ digest ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

 

โœ๏ธ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ณต์‹ ๋ฌธ์„œ์˜ ๊ถŒ์žฅ ๋ฐฉ์‹์— ๋‹ค๋ผ, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

export const login = async (formData: { email: string; password: string }) => {
  const supabase = createClient();

  const { data, error: loginError } = await supabase.auth.signInWithPassword({
    email: formData.email,
    password: formData.password,
  });

  console.error(loginError);

  if (loginError?.code === 'invalid_credentials') return { error: { message: '์ž˜๋ชป๋œ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.' } };
  if (loginError) throw new Error('์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');

  return { message: '๋กœ๊ทธ์ธ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' };
};

 

โœ๏ธ  ๊ฒฐ๊ณผ

  • ๊ฐœ๋ฐœ ๋ชจ๋“œ์™€ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ ๋ชจ๋‘์—์„œ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” "์ž˜๋ชป๋œ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค." ๋ฉ”์‹œ์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.
  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋Š” ๊ธฐ์กด ๋ฐฉ์‹๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆจ๊ฒจ์ง„๋‹ค.

 

โœ๏ธ ๊ฒฐ๋ก 

์ด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์ค‘์š”์„ฑ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŠนํžˆ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ , ๊ณต์‹ ๋ฌธ์„œ์˜ ๊ถŒ์žฅ ๋ฐฉ์‹์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด ๋ด์•ผ๊ฒ ๋‹ค๊ณ  ๋‹ค์งํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.