React

[React] ํŠน์ • ์‹œ๊ฐ„๋Œ€์—๋งŒ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” (feat. ๊ณตํœด์ผ, ์ฃผ๋ง ์ œ์™ธ)

hyonie 2025. 4. 11. 16:52

 

 


์‹œ๊ฐ„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฒ„ํŠผํ™œ์„ฑํ™” or ๋น„ํ™œ์„ฑํ™” ์ปค์Šคํ…€ ํ›… ์˜ˆ์ œ ์ฝ”๋“œ

import {useState, useEffect} from "react";

export const useTimeRestrictedToggle = () => {
    const [isEnabled, setIsEnabled] = useState(false);
useEffect(()=>{
    const checkIsHoliday = (date: Date) => {
        const month = date.getMonth() + 1;
        const day = date.getDate();

        // ๊ณตํœด์ผ (์‹ ์ •, ์„ค๋‚ , ์ถ”์„, ๋“ฑ)
        const isNewYear = month === 1 && day === 1;
        const isLunarHolidy = month === 2 && day === 29;
        const isChuseok = month === 10 && [6,7,8].includes(day); 

        return isNewYear || isLunarHolidy || isChuseok;
    }

    const getCurrentTime = () => {
        const now = new Date();
        const hours = now.getHours();   // ํ˜„์žฌ ์‹œ (0~23)
        const dayOfWeek = now.getDay(); // ์š”์ผ (0: ์ผ์š”์ผ, 6: ํ† ์š”์ผ)
        const isHoliday = checkIsHoliday(now);  // ํœด์ผ ์ธ์ง€ ํ™•์ธ
        return {hours, dayOfWeek, isHoliday}
    }

    const evaluateToggle = () => {
        const {hours, dayOfWeek, isHoliday} = getCurrentTime();
        const isWithinBuinessHours = hours >=9 && hours <18;
        const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;

        setIsEnabled(isWithinBuinessHours && !isWeekend && !isHoliday);
    };

    evaluateToggle(); // ์ดˆ๊ธฐ ์ƒํƒœ ์„ค์ •
    const interval = setInterval(evaluateToggle, 60000); // ๋งค 1๋ถ„๋งˆ๋‹ค ์žฌํ™•์ธ

    return () => clearInterval(interval); // ์–ธ๋งˆ์šดํŠธ ์‹œ ํด๋ฆฐ์—…
},[]);
    return isEnabled;

}

 

 

์กฐ๊ฑด์€ ์•„๋ž˜๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

  • ํ‰์ผ์—๋งŒ ๊ฐ€๋Šฅ(์ฃผ๋ง โŒ)
  • ์˜ค์ „ 9์‹œ ~ ์˜คํ›„ 6์‹œ ์‚ฌ์ด๋งŒ ๊ฐ€๋Šฅ
  • ํŠน์ • ๊ณตํœด์ผ๋„ ์ œ์™ธ(์˜ˆ: ์‹ ์ •, ์„ค, ์ถ”์„ ๋“ฑ)

 

๐Ÿ” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋ ค๋ฉด?

JavaScript์˜ setInterval()์„ ์‚ฌ์šฉํ•ด 1๋ถ„๋งˆ๋‹ค ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  React์—์„œ๋Š” useEffect() ์•ˆ์—์„œ interval()์„ ๋“ฑ๋กํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋ฉด clearInterval()๋กœ ๊ผญ ์ •๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

 

1. ์ƒํƒœ ์ดˆ๊ธฐํ™”

const [isEnabled, setIsEnabled] = useState(false);

 

๐Ÿ‘‰ ๋ฒ„ํŠผ ํ™œ์„ฑ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๋Š” ์ƒํƒœ ๋ณ€์ˆ˜

์ฒ˜์Œ์—๋Š” ๊ธฐ๋ณธ๊ฐ’ false(๋น„ํ™œ์„ฑ ์ƒํƒœ)

 

 

2. useEffect Hooks

useEffect(() => {
 // ์‹คํ–‰ํ•  ์ฝ”๋“œ
},[]);

 

๐Ÿ‘‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋Ÿญ

 

์œ„์ฒ˜๋Ÿผ []๋ฅผ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด, 

  • ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ๋งŒ 1๋ฒˆ ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ ์•ˆ์— setInterval์„ ๋„ฃ์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ค€์œผ๋กœ ์‹œ์ž‘๋˜๊ณ  ๋ฐ˜๋Œ€๋กœ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ๋Š” ์ •๋ฆฌ๋„ ๊ฐ™์ด ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

3. ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์š”์ผ ๊ฐ€์ ธ์˜ค๊ธฐ

const getCurrentTime = () => {
        const now = new Date();
        const hours = now.getHours();   // ํ˜„์žฌ ์‹œ (0~23)
        const dayOfWeek = now.getDay(); // ์š”์ผ (0: ์ผ์š”์ผ, 6: ํ† ์š”์ผ)
        const isHoliday = checkIsHoliday(now);  // ํœด์ผ ์ธ์ง€ ํ™•์ธ
        return {hours, dayOfWeek, isHoliday}
    }

 

๐Ÿ• ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๊ณ ,

๐Ÿ“… ์š”์ผ๋„ ๊ฐ€์ ธ์˜ค๊ณ ,

๐ŸŽŒ ๊ณตํœด์ผ์ธ์ง€๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

 

4. ๊ณตํœด์ผ ํŒ๋‹จ ํ•จ์ˆ˜

const checkIsHoliday = (date: Date) => {
        const month = date.getMonth() + 1;
        const day = date.getDate();

        // ๊ณตํœด์ผ (์‹ ์ •, ์„ค๋‚ , ์ถ”์„, ๋“ฑ)
        const isNewYear = month === 1 && day === 1;
        const isLunarHolidy = month === 2 && day === 29;
        const isChuseok = month === 10 && [6,7,8].includes(day); 

        return isNewYear || isLunarHolidy || isChuseok
    }

 

2025๋…„ ๊ธฐ์ค€์œผ๋กœ,

  • 1์›” 1์ผ โ†’ ์‹ ์ •
  • 1์›” 29์ผ โ†’ ์„ค๋‚ 
  • 10์›” 6์ผ, 7์ผ, 8์ผ โ†’ ์ถ”์„

์ด ๋‚ ์งœ๋ฉด ๊ณตํœด์ผ(true)๋กœ ๊ฐ„์ฃผ

 

5. ๋ฒ„ํŠผ ํ™œ์„ฑ ์—ฌ๋ถ€ ๊ฒฐ์ •

const evaluateToggle = () => {
        const {hours, dayOfWeek, isHoliday} = getCurrentTime();
        const isWithinBuinessHours = hours >=9 && hours <18;
        const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;

        setIsEnabled(isWithinBuinessHours && !isWeekend && !isHoliday);
    }

๐Ÿ“Œ ์กฐ๊ฑด:

  • ์‹œ๊ฐ„์€ ์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ ์ €๋… 6์‹œ ์ „๊นŒ์ง€๋งŒ ๊ฐ€๋Šฅ(9 <= hour < 18 )
  • ์ฃผ๋ง(ํ† , ์ผ) โŒ
  • ๊ณตํœด์ผ โŒ

์กฐ๊ฑด์ด ๋ชจ๋‘ ๋งŒ์กฑ๋˜๋ฉด true, ์•„๋‹ˆ๋ฉด false

 

6. ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐฑ์‹ 

const interval = setInterval(evaluateToggle, 60000); // ๋งค 1๋ถ„๋งˆ๋‹ค ์žฌํ™•์ธ

 

๐Ÿ‘‰ ๋งค 60์ดˆ๋งˆ๋‹ค ๋‹ค์‹œ ๊ฒ€์‚ฌํ•ด์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฒ„ํŠผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

 

 

7. ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ interval ์ •๋ฆฌ

return () => clearInterval(interval); // ์–ธ๋งˆ์šดํŠธ ์‹œ ํด๋ฆฐ์—…

๐Ÿ‘‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด interval ์ œ๊ฑฐ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

8. ์ตœ์ข… ๋ฐ˜ํ™˜

 return isEnabled;

๐Ÿ‘‰ ์ด hook์„ ์‚ฌ์šฉํ•œ ๊ณณ์—์„œ๋Š” true ๋˜๋Š” false ๊ฐ’์„ ๋ฐ›์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ

const ๊ฐ€๋Šฅ์‹œ๊ฐ„ = useTimeRestrictedToggle();

return (
	<button disabled={!๊ฐ€๋Šฅ์‹œ๊ฐ„}>์‹ ์ฒญํ•˜๊ธฐ</button>
)