๋ถ€์บ /Trouble Shooting

[NEXT]React ์‹ฌํ™” Intro : ์‹ค๋ฌด์™€ ๊ฐ€๊นŒ์šด ์ˆ˜์ค€์˜ ํ”„๋กœ์ ํŠธ - Trouble Shooting

FS29 2024. 12. 29. 13:38

 

 

๐Ÿž Trouble Shooting

 

 

 

1. ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋กœ๊ทธ์•„์›ƒ ๋ฌธ์ œ

  • ๋ฌธ์ œ: ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™.
  • ์›์ธ: ํด๋ผ์ด์–ธํŠธ์™€ Zustand ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด user ๊ฐ’์ด null๋กœ ์„ค์ •.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
    • Zustand ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  supabase.auth.getSession()์œผ๋กœ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ฒดํฌ.
    • useEffect์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฏธ user๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์„ธ์…˜ ํ™•์ธ์„ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ์ˆ˜์ •
       
useEffect(() => {
  const checkSession = async () => {
    if (user) {
      setIsPending(false)
      return
    }
    const { data, error } = await supabase.auth.getSession()
    if (error || !data.session) {
      router.push('/auth/login')
      return
    }
    setIsPending(false)
  }
  checkSession()
}, [router, user])

 

 

2. ์œ ์ € ์ƒํƒœ์™€ ์ฝ˜์†” ์ถœ๋ ฅ ๋ถˆ์ผ์น˜

  • ๋ฌธ์ œ: console.log(user)๋Š” null์„ ์ถœ๋ ฅํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ๋Š” ์œ ์ € ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋จ.
  • ์›์ธ: ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”๊ณผ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํƒ€์ด๋ฐ์˜ ์ฐจ์ด.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Zustand์˜ user ์ƒํƒœ์™€ supabase.auth.getSession()์„ ๋™๊ธฐํ™”ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ์„ ์ •ํ™•ํžˆ ์ฒ˜๋ฆฌ.

 

3. ๋ถ๋งˆํฌ ์ƒํƒœ ์œ ์ง€ ๋ฌธ์ œ

  • ๋ฌธ์ œ: ์ƒˆ๋กœ๊ณ ์นจ ํ›„ ๋ถ๋งˆํฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ.
  • ์›์ธ: post.isBookmarked ๊ฐ’์„ ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ํ™•์ธํ•˜์ง€ ๋ชปํ•จ.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
    • supabase์—์„œ ๋ถ๋งˆํฌ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  post ๋ฐ์ดํ„ฐ์— ํฌํ•จ.
     
const parsedPosts = postData.map((post) => ({
  ...post,
  isBookmarked: post.bookmarks.some(
    (bookmark) => bookmark.user_id === user.id,
  ),
}))

4. ๋งˆ์ง€๋ง‰ ์นด๋“œ ํ•™์Šต ์™„๋ฃŒ ์‹œ ์•Œ๋Ÿฟ ์ฒ˜๋ฆฌ

  • ๋ฌธ์ œ: ์นด๋“œ ํ•™์Šต ์™„๋ฃŒ ํ›„ ์•Œ๋ฆผ(Swal.fire)์ด ์ •์ƒ์ ์œผ๋กœ ๋œจ์ง€ ์•Š์Œ.
  • ์›์ธ: ๋งˆ์ง€๋ง‰ ์นด๋“œ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ.
const goToNextCard = async () => {
  if (currentIndex < totalCards - 1) {
    setCurrentIndex(currentIndex + 1)
    setIsFlipped(false)
  } else {
    await Swal.fire({
      title: '๐ŸŽ‰ ํ•™์Šต ์™„๋ฃŒ!',
      text: '๋ชจ๋“  ์นด๋“œ๋ฅผ ํ•™์Šตํ•˜์…จ์Šต๋‹ˆ๋‹ค!',
      icon: 'success',
      confirmButtonText: 'ํ™•์ธ',
    })
    router.push('/learning')
  }
}

6. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ํƒ€์ž… ์˜ค๋ฅ˜

  • ๋ฌธ์ œ: postData.map์—์„œ ๋นจ๊ฐ„ ๋ฐ‘์ค„ ๋ฐœ์ƒ.
  • ์›์ธ: postData์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒ.

=>์ œ ํ™”๋ฉด์—์„œ๋Š” ๋นจ๊ฐ„๋ฐ‘์ค„์ด ๋œจ๋Š”๋ฐ ๋‹ค๋ฅธ ๋ถ„์ด ํด๋ก ๋ฐ›์•„์„œ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ, ์•ˆ๋œธ..

 

7. ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ฒดํฌ

  • ๋ฌธ์ œ: ์„ธ์…˜์ด ์—†์„ ๋•Œ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Œ.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
    • useEffect๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ฒดํฌ ํ›„ ์—†์„ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ์ถ”๊ฐ€
useEffect(() => {
  const checkSession = async () => {
    const { data, error } = await supabase.auth.getSession()
    if (error || !data.session) {
      router.push('/auth/login')
    }
  }
  checkSession()
}, [router])