6/5 TIL

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

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
42/96
post-thumbnail

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

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋ฌธ ๋ฌธ์ œ ํ™€์ˆ˜vs์ง์ˆ˜
  • ํ—ค๋” ์ปดํฌ๋„ŒํŠธ ๋””ํ…Œ์ผ ์ˆ˜์ •
  • ํšŒ์›๊ฐ€์ž… ์ ˆ์ฐจ ์ค‘๋ณตํ™•์ธ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ™€์ˆ˜ vs ์ง์ˆ˜

๋ฌธ์ œ ์ •์˜ : ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ num_list๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ 1๋ฒˆ ์›์†Œ๋ผ๊ณ  ํ•  ๋•Œ, ํ™€์ˆ˜ ๋ฒˆ์งธ ์›์†Œ๋“ค์˜ ํ•ฉ๊ณผ ์ง์ˆ˜ ๋ฒˆ์งธ ์›์†Œ๋“ค์˜ ํ•ฉ ์ค‘ ํฐ ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”. ๋‘ ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์„ returnํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ
5 โ‰ค num_list์˜ ๊ธธ์ด โ‰ค 50
-9 โ‰ค num_list์˜ ์›์†Œ โ‰ค 9

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ ๋ฐ ์„ค๋ช…

๋‚˜์˜ ํ’€์ด

function solution(num_list) {
    let evenNumber = 0;
    let oddNumber = 0;
    
    for(let i = 0; i < num_list.length; i++) {
        if((i + 1) % 2 === 0) {
            evenNumber += num_list[i]
        } else {
            oddNumber += num_list[i]
        };
    }
    return evenNumber > oddNumber ? evenNumber : oddNumber;
}

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

function solution(num_list) {
    let even = 0;
    let odd = 0

    num_list.map((v, idx) => {
        !(idx % 2) ? even += v : odd += v; 
    })

    return odd > even ? odd : even; 
}

map ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€์ดํ•  ์ˆ˜๋„ ์žˆ๊ตฌ๋‚˜ ํ•˜๊ณ  ๋ฐฐ์›Œ๊ฐ”๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ ๋‚˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€๋ฉด ๊ฑฐ์ง„ for๋ฌธ์„ ๋งŽ์ด ์• ์šฉํ•˜๋Š” ๊ฑฐ ๊ฐ™์€๋ฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฐ์Šต์„ ์ข€ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.

ํ—ค๋” ์ปดํฌ๋„ŒํŠธ ๋””ํ…Œ์ผ ์ˆ˜์ •

ํ—ค๋” ๋ถ€๋ถ„์— ๋””ํ…Œ์ผ์ ์ธ ๊ฒฐํ•จ์ด ์žˆ์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ์—ญํ• ์„ ๋งก์€ ํŒ€์› ๋ถ„์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์‹œ๋А๋ผ ๋‚˜์ค‘์— ํ•˜์‹ ๋‹ค ํ•˜์…จ์—ˆ๋Š”๋ฐ
๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๋ถ€๋ถ„๋„ ์•„๋‹ˆ๊ณ  ํ•ด์„œ ๋Œ€์‹  ์ˆ˜์ •์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

๋ชจ๋“  ๋ผ์šฐํ„ฐ๋“ค์„ ๊ฐ์‹ธ์ฃผ๋Š” HomeHeader ๋ถ€๋ถ„์ธ๋ฐ props๋กœ signIn, signOut์„ ๋ฐ›์•„์™€์„œ ํ˜„์žฌ ๋กœ๊ทธ์ธ์ด ๋ผ์žˆ๋Š” ์ƒํƒœ๋ฉด ํ—ค๋” ๋ถ€๋ถ„์˜ ๋ฒ„ํŠผ์„ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์œผ๋กœ, ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋ฉด ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์œผ๋กœ ๋ณด์ด๊ฒŒ๋” ํ–ˆ๋‹ค.

๊ทผ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ํ—ค๋” ๋ถ€๋ถ„์ด ํ™ˆํŽ˜์ด์ง€์—์„  ๋กœ๊ทธ์ธ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์ž˜ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ ๊ธ€์“ฐ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ commitdetail๋กœ ํŽ˜์ด์ง€๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋ฉด ํ—ค๋”์—์„œ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ์ผ ๋•Œ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ์‚ฌ์‹ค์ƒ signIn ์ƒํƒœ๋Š” true์ด๋ฏ€๋กœ ํ—ค๋” ๋ถ€๋ถ„์˜ ๋ฌธ์ œ์˜€๋‹ค.

์ด ๋ฌธ์ œ๋Š” HomeHeader ์ปดํฌ๋„ŒํŠธ์˜ ์ค‘๋ณต์ด ๋ฌธ์ œ์˜€๋‹ค.
HomeFeed, HomeHeader ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” Home.jsx์—์„œ๋„ HomeHeader๋ฅผ ์“ฐ๊ณ  ์žˆ์—ˆ๊ธฐ์— Home.jsx์—์„œ HomeHeader๋ฅผ ์—†์• ์ฃผ๋‹ˆ๊น ๋ฐ”๋กœ ์ •์ƒ ์ž‘๋™์„ ํ–ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ์ ˆ์ฐจ ์ค‘๋ณต ํ™•์ธ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

์ผ๋‹จ supabase์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ์€ ์ค‘๋ณต์œผ๋กœ ํšŒ์›๊ฐ€์ž…์ด ์•ˆ๋˜๊ฒŒ๋” ๋ผ์žˆ๋Š”๋ฐ, ๊ธฐ๋ณธ ํƒ‘์žฌ๋œ ๊ธฐ๋Šฅ ์™ธ์— ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ์‹œ์— ์ด๋ฉ”์ผ ์ธํ’‹์ฐฝ ์•„๋ž˜์— ์ค‘๋ณต ์—๋Ÿฌ ๋ฉ”์„ธ์ง€๋ฅผ ๋„์›Œ์ฃผ๊ณ  ์‹ถ์—ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ์ ˆ์ฐจ ์ค‘๋ณต ํ™•์ธ ์ฝ”๋“œ

const SignUpPage = () => {
  const navigate = useNavigate();
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [mismatchPassword, setMismatchPassword] = useState(false);
  const [confirmPassword, setConfirmPassword] = useState('');
  const [nickname, setNickname] = useState('');
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [emailError, setEmailError] = useState(false);
  const [nicknameError, setNicknameError] = useState(false);

  const signUpWithEmail = async (e) => {
    e.preventDefault();
    setIsSubmitting(true);
    setEmailError(false);
    setNicknameError(false);
    setMismatchPassword(false);

    if(password !== confirmPassword) {
      setMismatchPassword(true);
      setIsSubmitting(false);
      return;
    }
    try {
      const { data: existEmail, error: existEmailError } = await supabase
        .from('users')
        .select('email')
        .eq('email', email)
        .single();

      if (existEmailError) {
        throw existEmailError;
      }

      if (existEmail) {
        setEmailError(true);
        setIsSubmitting(false);
        return;
      }

      const {data: existNickname, error: existNicknameError } = await supabase
      .from('users')
      .select('nickname')
      .eq('nickname', nickname)
      .single();

      if(existNicknameError) {
        throw existNicknameError;
      }

      if(existNickname) {
        setNicknameError(true);
        setIsSubmitting(false);
        return;
      }

      const { error } = await supabase.auth.signUp({
        email,
        password,
        options: {
          data: {
            nickname
          }
        }
      });

      if (error) {
        throw error;
      }

      const { error: insertError } = await supabase
      .from('users')
      .insert({nickname, email})

      if(insertError) {
        throw insertError;
      }
      
      navigate('/login');
    } catch (error) {
      console.error('ํšŒ์›๊ฐ€์ž… ์˜ค๋ฅ˜ ๋ฐœ์ƒ', error);
    } 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
        />
        {emailError && <DoubleCheck>์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค ๋‹ค๋ฅธ ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <Input
          type="password"
          name="password"
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
          required
        />
        <Input
          type="password"
          name="confirmPassword"
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ"
          value={confirmPassword}
          onChange={(e) => setConfirmPassword(e.target.value)}
          required
        />
        {mismatchPassword && <DoubleCheck>๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <Input
          type="text"
          name="nickname"
          placeholder="๋‹‰๋„ค์ž„"
          value={nickname}
          onChange={(e) => setNickname(e.target.value)}
          required
        />
        {nicknameError && <DoubleCheck>์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ๋‹‰๋„ค์ž„์ž…๋‹ˆ๋‹ค ๋‹ค๋ฅธ ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <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;

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌธ์ œ์˜ ๊ทผ์›์ง€๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ single() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ธ ๊ฑฐ ๊ฐ™์•˜๋‹ค.

single() ๋ฉ”์„œ๋“œ๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ–‰์„ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋‚˜์˜ ํ–‰๋งŒ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ƒ๊ฐํ•ด ๋ณด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ๊ฒฐ๊ณผ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ ์ด๋ฉ”์ผ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ๊ฒŒ ๋‚ด ์˜๋„์ธ๋ฐ
single() ๋ฉ”์„œ๋“œ์˜ ํŠน์„ฑ์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ณด๋‚ด์„œ ๋ฌธ์ œ๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ signUp์„ ํ†ตํ•ด ๋‹‰๋„ค์ž„์„ ๋ฐ›๊ณ  ์žˆ๋Š”๋ฐ, ์•„๋ž˜์— insert๋ฅผ ํ†ตํ•ด ๋‹‰๋„ค์ž„์„ ๋˜ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๊ธฐ์— ๋กœ์ง์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฑฐ ๊ฐ™์•˜๋‹ค.

const { error } = await supabase.auth.signUp({
        email,
        password,
        options: {
          data: {
            nickname
          }
        }
      });

      if (error) {
        throw error;
      }

      const { error: insertError } = await supabase
      .from('users')
      .insert({nickname, email})

      if(insertError) {
        throw insertError;
      }

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด์„œ ์ค‘๋ณต๋œ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ , ์“ธ๋ชจ์—†๋Š” ๋ณ€์ˆ˜๋ช…์„ ์ œ๊ฑฐํ•ด์คฌ๋‹ค.

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


const SignUpPage = () => {
  const navigate = useNavigate();
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [mismatchPassword, setMismatchPassword] = useState(false);
  const [confirmPassword, setConfirmPassword] = useState('');
  const [nickname, setNickname] = useState('');
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [emailError, setEmailError] = useState(false);
  const [nicknameError, setNicknameError] = useState(false);

  const signUpWithEmail = async (e) => {
    e.preventDefault();
    setIsSubmitting(true);
    setEmailError(false);
    setNicknameError(false);
    setMismatchPassword(false);

    if(password !== confirmPassword) {
      setMismatchPassword(true);
      setIsSubmitting(false);
      return;
    }
    try {
      const { data: existEmail } = await supabase
        .from('users')
        .select('email')
        .eq('email', email)
        .single();

      if (existEmail) {
        setEmailError(true);
        setIsSubmitting(false);
        return;
      }

      const {data: existNickname } = await supabase
      .from('users')
      .select('nickname')
      .eq('nickname', nickname)
      .single();

      if(existNickname) {
        setNicknameError(true);
        setIsSubmitting(false);
        return;
      }

      const { error } = await supabase.auth.signUp({
        email,
        password,
      });

      if (error) {
        throw error;
      }

      const { error: insertError } = await supabase
      .from('users')
      .insert({nickname, email})

      if(insertError) {
        throw insertError;
      }
      
      navigate('/');
      alert(`ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ${nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!`);
    } 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
        />
        {emailError && <DoubleCheck>์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค ๋‹ค๋ฅธ ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <Input
          type="password"
          name="password"
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
          required
        />
        <Input
          type="password"
          name="confirmPassword"
          placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ"
          value={confirmPassword}
          onChange={(e) => setConfirmPassword(e.target.value)}
          required
        />
        {mismatchPassword && <DoubleCheck>๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <Input
          type="text"
          name="nickname"
          placeholder="๋‹‰๋„ค์ž„"
          value={nickname}
          onChange={(e) => setNickname(e.target.value)}
          required
        />
        {nicknameError && <DoubleCheck>์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ๋‹‰๋„ค์ž„์ž…๋‹ˆ๋‹ค ๋‹ค๋ฅธ ๋‹‰๋„ค์ž„์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.</DoubleCheck>}
        <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;

์ค‘๋ณต ํ™•์ธ ๋ถ€๋ถ„ ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ณ  ๊ณ ์น˜๋А๋ผ ๋จธ๋ฆฌ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋น ์ง€๋Š” ๊ฒŒ ๋А๊ปด์ง€๋Š” ๊ฑฐ ๊ฐ™๋‹ค.. ์ง€๋ˆ์ง€๋ˆ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” 1๊ฐœ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด„


์ค‘๋ณต๋œ ์ด๋ฉ”์ผ์˜ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ์— ๋Œ€ํ•ด์„  ์ž˜ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ ์ด๋ฏธ khj5 ๋ผ๋Š” ๋‹‰๋„ค์ž„์ด ์žˆ์Œ์—๋„ ๋‹‰๋„ค์ž„์— ๋Œ€ํ•œ ์ค‘๋ณต ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋Š” ์ถœ๋ ฅ์ด ์•ˆ ๋˜๋Š” ์ƒํ™ฉ์ด ์ผ์–ด๋‚ฌ๋‹ค.

๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ดค๋‹ค.

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

      const { data: existEmail } = await supabase
        .from('users')
        .select('email')
        .eq('email', email)
        .single();

      if (existEmail) {
        setEmailError(true);
        setIsSubmitting(false);
        return;
      }

      const {data: existNickname } = await supabase
      .from('users')
      .select('nickname')
      .eq('nickname', nickname)
      .single();

      if(existNickname) {
        setNicknameError(true);
        setIsSubmitting(false);
        return;
      }

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ์ด ์žˆ์„ ๊ฒฝ์šฐ์— ์ด๋ฉ”์ผ ์ค‘๋ณต ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•จ๊ณผ ๋™์‹œ์— return์„ ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ๋‹‰๋„ค์ž„ ์ค‘๋ณต ๋ฌธ๊ตฌ ์ถœ๋ ฅ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™์ด ์•ˆ ํ•˜๋Š” ๊ฑธ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ฝ”๋“œ์˜ ๋กœ์ง์„ ์‚ด์ง ์ˆ˜์ •ํ–ˆ๋‹ค.

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

const { data: existEmail } = await supabase
        .from('users')
        .select('email')
        .eq('email', email)
        .single();

      const {data: existNickname } = await supabase
      .from('users')
      .select('nickname')
      .eq('nickname', nickname)
      .single();

      if(existEmail || existNickname) {
        if(existEmail) {
          setEmailError(true);
        }
        if(existNickname) {
          setNicknameError(true);
        }
        setIsSubmitting(false);
        return;
      }

๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต ํ™•์ธ ์ ˆ์ฐจ๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋‚œ ํ›„ ์ž‘๋™ ๊ฒฐ๊ณผ๋ฌผ์„ ์‚ดํŽด๋ณด๊ฒ ์Œ

์ด๋ฉ”์ผ๊ณผ ๋‹‰๋„ค์ž„์˜ ์ค‘๋ณต ํ™•์ธ ๋ฌธ๊ตฌ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜ ๋ฌธ๊ตฌ๊นŒ์ง€ ๋‹ค ๋œจ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!!

์ด๋ฉ”์ผ๋งŒ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ๋ฐ”๊ฟ”๋ดค๋Š”๋ฐ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ ์ถœ๋ ฅ์ด ์ด์ œ์„œ์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฑฐ ๊ฐ™๋‹ค.

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

supabase์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ์กฐ๊ธˆ๋งŒ ๋” ๊นŠ์—ˆ๋‹ค๋ฉด ๋””ํ…Œ์ผ์ ์ธ ๋ถ€๋ถ„์„ ๋” ์ž˜ ์‚ด๋ฆด ์ˆ˜ ์žˆ์—ˆ์„ ํ…๋ฐ ํ•˜๋Š” ์•„์‰ฌ์›€์ด ์žˆ๋‹ค.

์˜ค๋Š˜ redux๋กœ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๊นŒ์ง€ ๋๋‚ด๋ณด๋ ค ํ–ˆ๋Š”๋ฐ redux๊ฐ€ ๋„ˆ๋ฌด ๊ณจ์น˜์•„ํ”„๋„ค?

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

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