๐Ÿ”ฅ Trouble Shooting - ๋ชจ๋ฐ”์ผ์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์•ˆ ๊บผ์ง€๋Š” ์ด์œ 

์Š˜ยท2025๋…„ 5์›” 29์ผ

๐Ÿ”ฅ Trouble Shooting

๋ชฉ๋ก ๋ณด๊ธฐ
17/23

๐Ÿšจ ๋ฌธ์ œ ์ƒํ™ฉ

ํฌํŠธํด๋ฆฌ์˜ค ๋งŒ๋“ค๋ฉด์„œ ๊ธฐ์ˆ  ์Šคํƒ ์„น์…˜์— ๋ฌธ ์—ด๋ฆฌ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„ฃ์—ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ์—์„œ๋Š” ์‹œ๋„ค๋งˆํ‹ฑํ•˜๊ฒŒ ๋ฌธ์ด ์—ด๋ฆฌ๋ฉด์„œ ๋‚ด์šฉ์ด ๋‚˜ํƒ€๋‚˜๊ณ , ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ๊ทธ๋ƒฅ ๋ฐ”๋กœ ๋‚ด์šฉ๋งŒ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ...

๋ถ„๋ช…ํžˆ useIsMobile ํ›…์œผ๋กœ ๋ชจ๋ฐ”์ผ ๊ฐ์ง€ํ•ด์„œ ์กฐ๊ฑด๋ถ€๋กœ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ, ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๊ณ„์† ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋Š” ๊ฑฐ๋‹ค. ๊ทธ๊ฒƒ๋„ ์ค‘๊ฐ„์— ๋ฉˆ์ถฐ์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ณ ์ •๋˜์–ด ๋ฒ„๋ ธ๋‹ค.

๐Ÿ’ป ๋ฌธ์ œ ๋ฐœ์ƒ ์ฝ”๋“œ

// ScrollAnimations.tsx
const ScrollAnimations = ({ children, className = '' }) => {
  const isMobile = useIsMobile(); // ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ!

  useEffect(() => {
    const container = containerRef.current;
    if (!container) return;

    // ๋ชจ๋ฐ”์ผ์ด ์•„๋‹ ๋•Œ๋งŒ ๋ฌธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ...
    if (!isMobile) {
      const sections = container.querySelectorAll('section');
      
      sections.forEach((section) => {
        const doorContent = section.querySelector('[data-direction="doorContent"]');
        
        if (doorContent) {
          doorTimeline.fromTo(
            doorContent,
            { scale: 0.9, opacity: 0, y: 10 }, // ์ดˆ๊ธฐ ์ƒํƒœ
            {
              scale: 1,
              opacity: 1,
              y: 0,
              duration: 0.7,
              ease: 'back.out(1.2)',
            }
          );
        }
      });
    }
  }, [isMobile]);
};
// useMediaQuery.ts - ๋ฌธ์ œ์˜ ์›์ธ์ด ์—ฌ๊ธฐ ์žˆ์—ˆ์Œ
export function useMediaQuery(query: string): boolean {
  const [matches, setMatches] = useState<boolean>(false); // ๐Ÿšจ ํ•ญ์ƒ false๋กœ ์‹œ์ž‘!

  useEffect(() => {
    if (typeof window === 'undefined') return;
    const mql = window.matchMedia(query);
    setMatches(mql.matches); // ์—ฌ๊ธฐ์„œ ์‹ค์ œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ

    const handler = (e: MediaQueryListEvent) => {
      setMatches(e.matches);
    };

    mql.addEventListener('change', handler);
    return () => mql.removeEventListener('change', handler);
  }, [query]);

  return matches;
}

๋ชจ๋ฐ”์ผ์—์„œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™•์ธํ•ด๋ณด๋‹ˆ:

<div 
  style="opacity: 0; transform: translate(0px, 10px) scale(0.9, 0.9);"
>
  ...
</div>

๐Ÿค” ์›์ธ ๋ถ„์„

์™„์ „ ํƒ€์ด๋ฐ ๋ฌธ์ œ์˜€๋‹ค.

  1. ์ดˆ๊ธฐ ๋ Œ๋”๋ง: useState(false) โ†’ isMobile = false
  2. useEffect ์‹คํ–‰ ์ „: ScrollAnimations๊ฐ€ ์‹คํ–‰๋˜์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค์ •
  3. GSAP์ด ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ ์šฉ: opacity: 0, scale: 0.9 ๋“ฑ๋“ฑ
  4. useEffect ์‹คํ–‰ ํ›„: setMatches(true) โ†’ isMobile = true๋กœ ๋ณ€๊ฒฝ
  5. ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋Šฆ์Œ: ์š”์†Œ์— ์ด๋ฏธ ์Šคํƒ€์ผ์ด ๋ฐ•ํ˜€๋ฒ„๋ฆผ

์ฆ‰ useState ์ดˆ๊ธฐ๊ฐ’์ด false๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์„œ, ์‹ค์ œ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋„ ์ฒ˜์Œ์—๋Š” ๋ฐ์Šคํฌํ†ฑ์œผ๋กœ ์ธ์‹ํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์˜€๋‹ค.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

React์˜ useState Lazy Initialization์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

// ์ˆ˜์ •๋œ useMediaQuery.ts
export function useMediaQuery(query: string): boolean {
  const [matches, setMatches] = useState<boolean>(() => {
    <// ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ๋Š” false
    if (typeof window === 'undefined') return false;
    // ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์‹ค์ œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ
    return window.matchMedia(query).matches;
  });

  useEffect(() => {
    if (typeof window === 'undefined') return;
    const mql = window.matchMedia(query);
    
    const handler = (e: MediaQueryListEvent) => {
      setMatches(e.matches);
    };

    mql.addEventListener('change', handler);
    return () => mql.removeEventListener('change', handler);
  }, [query]);

  return matches;
}

์ฐจ์ด์ :

  • Before: useState(false) - ๋ฌด์กฐ๊ฑด false๋กœ ์‹œ์ž‘
  • After: useState(() => window.matchMedia(query).matches) - ์‹ค์ œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ ์‹œ์ž‘

๐ŸŽฏ ํ•ด๊ฒฐ ํฌ์ธํŠธ

useState์˜ Lazy Initialization ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

// ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•
const [state, setState] = useState(initialValue);

// Lazy Initialization
const [state, setState] = useState(() => initialValue);

ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด:

  • ์ดˆ๊ธฐ๊ฐ’ ๊ณ„์‚ฐ์ด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ
  • ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด๋„ ๋‹ค์‹œ ์‹คํ–‰ ์•ˆ ๋จ
  • ์™ธ๋ถ€ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์ดˆ๊ธฐ๊ฐ’์— ํŠนํžˆ ์œ ์šฉ

๐Ÿ“ ๋ฐฐ์šด ์ 

useState ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •ํ•  ๋•Œ ์ข€ ๋” ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ํŠนํžˆ:

  • window ๊ฐ์ฒด ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ SSR ๊ณ ๋ ค
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ์˜์กดํ•˜๋Š” ์ƒํƒœ๋Š” lazy initialization ๊ณ ๋ ค
  • ํƒ€์ด๋ฐ์ด ์ค‘์š”ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ๋Š” ์ดˆ๊ธฐ๊ฐ’์ด ๋”์šฑ ์ค‘์š”

๊ทธ๋ฆฌ๊ณ  React ๋ Œ๋”๋ง ์ˆœ์„œ๋„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌ๋๋‹ค:
1. useState ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
2. ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง
3. useEffect ์‹คํ–‰

๐Ÿ”„ ๊ฐœ์„ ๋œ ์ 

Before

const [matches, setMatches] = useState<boolean>(false);
// ๋ชจ๋ฐ”์ผ์—์„œ๋„ ์ฒ˜์Œ์—” false โ†’ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ๋จ

After

const [matches, setMatches] = useState<boolean>(() => {
  if (typeof window === 'undefined') return false;
  return window.matchMedia(query).matches;
});
// ๋ชจ๋ฐ”์ผ์—์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ true โ†’ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์•ˆ ์ ์šฉ๋จ

๊ฒฐ๊ณผ์ ์œผ๋กœ:

  • โœ… ๋ชจ๋ฐ”์ผ์—์„œ ์ •ํ™•ํ•œ ์ดˆ๊ธฐ๊ฐ’
  • โœ… ๋ถˆํ•„์š”ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฉ์ง€
  • โœ… SSR ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „

๐Ÿ’ก ์ถ”๊ฐ€ TIP

๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด๋“ค:

// ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ์ดˆ๊ธฐ๊ฐ’
const [theme, setTheme] = useState(() => {
  if (typeof window === 'undefined') return 'light';
  return localStorage.getItem('theme') || 'light';
});

// ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ
const [processedData, setProcessedData] = useState(() => {
  return expensiveComputation(initialData);
});

// ํ˜„์žฌ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜
const [timestamp, setTimestamp] = useState(() => Date.now());

๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ Network ํƒญ โ†’ Disable cache ์ฒดํฌํ•˜๊ณ  ์ƒˆ๋กœ๊ณ ์นจํ•ด์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด ์ดˆ๊ธฐ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.


๊ฒฐ๊ตญ useState ํ•˜๋‚˜ ๋•Œ๋ฌธ์— ์ƒ๊ธด ๋ฌธ์ œ์˜€์ง€๋งŒ, ๋•๋ถ„์— React์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋๋‹ค.

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

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