ํญ์ฃฝ์„ ํ„ฐํŠธ๋ ค๋ณด์ž (์ตœ์ ํ™”๋ฅผ ๊ณ๋“ค์—ฌ์„œ)

ํญ์ฃฝ์„ ํ„ฐํŠธ๋ ค๋ณด์ž (์ตœ์ ํ™”๋ฅผ ๊ณ๋“ค์—ฌ์„œ!!)

Profile Picture
adultlee
2023-11-27

์›๋ณธ

์ €ํฌ๋Š” ์ง€๊ธˆ ๋ฌด๋ฃŒ ๋ฉด์ ‘ ์„œ๋น„์Šค์ธ ๊ณฐํ„ฐ๋ทฐ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๋„์ค‘ Interview๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ ์œ ์ €์˜ ๋งˆ์ง€๋ง‰ ๋ฉด์ ‘์ด ์ข…๋ฃŒ๊ฐ€ ๋˜์—ˆ์„๋•Œ, ์œ ์ €์—๊ฒŒ ์ถ•ํ•˜(?)์˜ ์˜๋ฏธ๋ฅผ ๋‹ด์€ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

+) ๊ฒฐ๊ณผ๋ฌผ

React-Confetti ์‚ฌ์šฉ

์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ ํ•˜๋‹ค๊ฐ€ react-confetti๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

React-Confetti NPM

ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ต‰์žฅํžˆ ๊ฐ€๋ณ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ž์ฒด๊ฐ€ ์–ด๋ ต์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

import React from "react";
import Confetti from "react-confetti";

export default () => {
	return <Confetti />;
};

๊ทธ์ € react ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์–ด๋ ต์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์†Œ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋Š”๋ฐ!

๋ฐ”๋กœ ์ž˜ ๋˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ!

Interview ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์ด ๋๋‚œ์ดํ›„ ํ•ด๋‹น Confetti๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค์Œ ํ™”๋ฉด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๋™ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ด์Šˆ๋Š” canvas๊ธฐ๋ฐ˜์˜ confetti๊ฐ€ ์„ ์–ธ๊ณผ ๋™์‹œ์— ํ˜„์žฌ view ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„ view์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ์„ ์‹œ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ window resize๊ฐ€ ๋จ์— ๋”ฐ๋ผ ๋‹ค์‹œ confetti์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๋™ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํžˆ useEffect๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ window resize์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์‹œ confetti๋ฅผ ๋ Œ๋”๋งํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋žฌ๋”๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ๋ Œ๋”๋ง... ๋‹น์—ฐํ•˜๋‹ค...!

๋‹น์—ฐํ•˜๊ฒŒ๋„ window.resize ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ์‹œ์ผœ์ฃผ๋Š”๊ฒฝ์šฐ window size์˜ ๋ณ€ํ™”๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ์ƒ๊ธด๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค ์ˆœ๊ฐ„๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ํฐ ์ €ํ•˜๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๋ž˜์„œ ์ด๋ฅผ Debounce๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ์ตœ์ ํ™” (by Debounce)

๋””๋ฐ”์šด์Šค(debounce)๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ๋กœ, ํŠนํžˆ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋””๋ฐ”์šด์Šค๋Š” ์—ฐ์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋“ค ์ค‘์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค!

๋””๋ฐ”์šด์Šค์˜ ๋™์ž‘ ์›๋ฆฌ ๋””๋ฐ”์šด์Šค์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” "์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ถ”๊ฐ€์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด, ๋งˆ์ง€๋ง‰์— ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค"์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ ํ•„๋“œ์— ๊ธ€์„ ํƒ€์ดํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ดํ•‘์„ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ์ผ์ • ์‹œ๊ฐ„(์˜ˆ: 300ms)์ด ์ง€๋‚œ ํ›„์—๋งŒ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ(์˜ˆ: ๊ฒ€์ƒ‰, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„๋œ ์ฝ”๋“œ

import { useState, useEffect } from "react";

const useWindowSize = () => {
	const [windowSize, setWindowSize] = useState({
		width: window.innerWidth,
		height: window.innerHeight,
	});

	useEffect(() => {
		let timeoutId: number;

		const handleResize = () => {
			window.clearTimeout(timeoutId); // ๋งค๋ฒˆ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ resize event๊ฐ€ ๋“ฑ๋ก๋ ๋•Œ ๋งˆ๋‹ค ์ด์ „์˜ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
			timeoutId = window.setTimeout(() => {
				setWindowSize({
					width: window.innerWidth,
					height: window.innerHeight,
				});
			}, 250);
		};

		window.addEventListener("resize", handleResize); // ์ด๋ฒคํŠธ ์ถ”๊ฐ€

		return () => {
			window.removeEventListener("resize", handleResize); // ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount ๋ ๋•Œ ์ œ๊ฑฐ ๋ฉ๋‹ˆ๋‹ค.
			window.clearTimeout(timeoutId);
		};
	}, []);

	return windowSize;
};

export default useWindowSize;

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ windowSize๋ฅผ ๋ฐ›์•„, confetti ์ปดํฌ๋„ŒํŠธ์— ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Debounce๊ฐ€ ์ ์šฉ๋œ ์ตœ์ข… ๊ฒฐ๊ณผ

์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋–จ์–ด์ง€๋Š” ์ƒ‰์ข…์ด๊ฐ€ ์ด์˜๊ตฐ์š”!

ยฉ 2024 Adultlee. All rights reserved.Made with โค by ์ด์„ฑ์ธ