6/3 TIL

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

TIL

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

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

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋ฌธ ๋ฌธ์ œ 2๋ฌธ์ œ
  • ๋‰ด์Šค ํ”ผ๋“œ ํ”„๋กœ์ ํŠธ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

1. ๊ผฌ๋ฆฌ ๋ฌธ์ž์—ด

๋ฌธ์ž์—ด๋“ค์ด ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ๋ฌธ์ž์—ด๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ๊ผฌ๋ฆฌ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ผฌ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ๋•Œ ํŠน์ • ๋ฌธ์ž์—ด์„ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์€ ์ œ์™ธ์‹œํ‚ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ ["abc", "def", "ghi"]๊ฐ€ ์žˆ๊ณ  ๋ฌธ์ž์—ด "ef"๋ฅผ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์€ ์ œ์™ธํ•˜๊ณ  ๊ผฌ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๋ฉด "abcghi"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ str_list์™€ ์ œ์™ธํ•˜๋ ค๋Š” ๋ฌธ์ž์—ด ex๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, str_list์—์„œ ex๋ฅผ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์„ ์ œ์™ธํ•˜๊ณ  ๋งŒ๋“  ๊ผฌ๋ฆฌ ๋ฌธ์ž์—ด์„ returnํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

2 โ‰ค str_list์˜ ๊ธธ์ด โ‰ค 10
1 โ‰ค str_list์˜ ์›์†Œ์˜ ๊ธธ์ด โ‰ค 10
1 โ‰ค ex์˜ ๊ธธ์ด โ‰ค 5

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

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

function solution(str_list, ex) {
    var answer = '';
    answer = str_list.filter((value) => {
        if(value.includes(ex)) {
            return false;
        }
        return true;
    })
    return answer.join("");
}

2. ๋ฌธ์ž ๋ฆฌ์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜

๋ฌธ์ž๋“ค์ด ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐฐ์—ด arr๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. arr์˜ ์›์†Œ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด ๋ถ™์ธ ๋ฌธ์ž์—ด์„ return ํ•˜๋Š” solutionํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

1 โ‰ค arr์˜ ๊ธธ์ด โ‰ค 200
arr์˜ ์›์†Œ๋Š” ์ „๋ถ€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด๊ฐ€ 1์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

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

function solution(arr) {
return arr.reduce((acc,cur) => acc + cur, '');
}

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ์ดˆ ์ˆ˜์ค€์ด๋ผ ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ํ’€์ดํ•œ ๋А๋‚Œ์ด ์žˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ํŒ€ ํ”„๋กœ์ ํŠธ์ธ ๋‰ด์Šค ํ”ผ๋“œ ํ”„๋กœ์ ํŠธ์˜ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค. ๊ณต์‹ ๋ฌธ์„œ, ๊ณผ์ œ ๋ฐœ์ œํ•˜๋ฉด์„œ ์ œ๊ณต๋œ supabase ๊ฐ€์ด๋“œ๋ฅผ ๋ณด๊ณ  ๊ตฌํ˜„์„ ํ•ด๋ดค๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๊ฒŒ ๋ณต์žกํ•ด ๋ณด์ด๊ณ  ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค ใ… ใ… 
API Key, url ๊ฐ™์€ ์ •๋ณด๋Š” ๋นผ๋†“์€ ์ฝ”๋“œ๋ฅผ ์ ์–ด๋ณด๊ฒ ๋‹ค

Login Page

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ํ˜„์žฌ ๋กœ๊ทธ์ธ ์ƒํƒœ, {๋‹‰๋„ค์ž„}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ฐ™์€ ๋ฌธ๊ตฌ ๋“ฑ๋“ฑ ๋””ํ…Œ์ผ์„ ์ฑ™๊ธฐ์ง€ ๋ชปํ•œ ์ ์ด ์•„์‰ฝ์ง€๋งŒ ๋‹น์žฅ์€ ํ•„์ˆ˜ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›„์— ๋””ํ…Œ์ผ์„ ์ถ”๊ฐ€ํ•ด์ค„ ์˜ˆ์ •์ด๋‹ค.

์ฝ”๋“œ

const LoginPage = ({ signIn, setSignIn, signOut }) => {
  const navigate = useNavigate();
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

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

  async function signInWithGithub() {
    const { error, data } = await supabase.auth.signInWithOAuth({
      provider: 'github'
    });

    if (error) {
      console.error('๊นƒํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ ์—๋Ÿฌ', error.message);
      alert('๋กœ๊ทธ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');
    } else {
      const { user } = data;
      if (user) {
        navigate('/');
      } else {
        alert('ํšŒ์›๊ฐ€์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');
        navigate('/signup');
      }
    }
  }

  useEffect(() => {
    const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
      if (session) {
        setSignIn(true);
      } else {
        setSignIn(false);
      }
    });

    return () => {
      authListener?.subscription?.unsubscribe();
    };
  }, [setSignIn]);

  return (
    <Container>
      <Title>๋กœ๊ทธ์ธ ํŽ˜์ด์ง€</Title>
      {signIn ? (
        <>
        <p>`${data.nickname}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!`</p>
        <Button onClick={signOut}>๋กœ๊ทธ์•„์›ƒ</Button>
        </>
      ) : (
        <Form onSubmit={signInWithEmailPassword}>
          <Label htmlFor="email">์•„์ด๋””:</Label>
          <Input type="text" id="email" name="email" value={email} onChange={(e) => setEmail(e.target.value)} />
          <Label htmlFor="password">๋น„๋ฐ€๋ฒˆํ˜ธ:</Label>
          <Input
            type="password"
            id="password"
            name="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
          />
          <Button type="submit">๋กœ๊ทธ์ธ</Button>
          <Button type="button" onClick={signInWithGithub}>
            GitHub๋กœ ๋กœ๊ทธ์ธ
          </Button>
          <Button type="button" onClick={() => navigate('/signup')}>
            ํšŒ์›๊ฐ€์ž…
          </Button>
        </Form>
      )}
    </Container>
  );
};

export default LoginPage;

์ž‘๋™ ํ™•์ธ

์ •์ƒ์ ์œผ๋กœ ์ž‘๋™๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ์ธ์„ ํ•œ ์ƒํƒœ์ผ ์‹œ์— ํ—ค๋” ๋ถ€๋ถ„์˜ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์ด ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ๋” ํ•˜๋Š” ๊ฑด ๋ฉ”์ธํŽ˜์ด์ง€, ํ—ค๋” ๋ถ€๋ถ„์„ ๋งก์œผ์‹  ํŒ€์› ๋ถ„์˜ ๋ชซ์ด์ง€๋งŒ ๊ฐ™์ด ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ

์–ด๋ ต๊ธด ์–ด๋ ค์šด๋ฐ ๋ญ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ฐฉ์ฐฉ ๊ตฌํ˜„๋˜๋Š” ๊ฑธ ๋ณด๋ฉด ๋ฟŒ๋“ฏํ•ด์„œ ํž˜๋“  ๊ฒƒ๋„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฑฐ ๊ฐ™๋‹ค(?)

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

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