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>
    )