ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์ปค์Šคํ…€ํ›…๊ณผ ํ•จ๊ป˜ ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ ์กฐ์ž‘ ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•ด๋ณด์ž!
    ๐Ÿ‹ JavaScript 2023. 8. 20. 20:17

    ๐Ÿ‹  ๋ฐฐ๊ฒฝ

    ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  & ๋ณด์—ฌ์ฃผ๋Š” ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ 3์ดˆ ํ›„ ์–ธ๋งˆ์šดํŠธ๋˜๋Š” ์Šค๋‚ต๋ฐ”๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. 

    ๋ชจ๋“  ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ์— ๋งˆ์šดํŠธ ๋œ 3์ดˆ ํ›„ ์–ธ๋งˆ์šดํŠธ๋˜๋Š” ๋กœ์ง์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด, ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ์šฉํ•  ๋กœ์ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ ์ฝ”๋“œ๋ฅผ ์‘์ง‘ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค.

     

     

    ๐Ÿ‹  ๊ฒฐ๊ณผ๋ฌผ

    ์Šค๋‚ต๋ฐ” ์˜ˆ์ œ

     

     

    ๐Ÿ‹  ์ˆ˜์ • ์ „

    ๋‹ค์Œ์€ ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค. content prop์œผ๋กœ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šค๋‚ต๋ฐ”๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ Main ๊ตฌ๋ฌธ ๋‚ด activateSnackbar ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ๊ทธ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ 3์ดˆ๊ฐ€ ์ง€๋‚œ ์‹œ์ ์— ์Šค๋‚ต๋ฐ”๊ฐ€ ์ž๋™์œผ๋กœ unmount ๋œ๋‹ค.

    // ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ 
    function Snackbar({content}: {content: string}){
        const transition = useTransition(isActive, {
            entering: { animation: `${slideIn} 0.5s ease-in-out forwards` },
            exiting: { animation: `${slideOut} 0.5s ease-in-out forwards` },
        });
    
    	return (
    		<HStack style={transition}>
    			<CheckIcon/>
    			{content}
    		</HStack>
    	)
    }
    // ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
    function Main(){
    	const [showSnackbar, setShowSnackbar] = useState(true)
    
        function activateSnackbar() {
            setShowSnackbar(true);
            setTimeout(() => setShowSnackbar(false), 3000);
        }
    
    	return (
    		{showSnackbar && <Snackbar content="๋“ฑ๋ก๋˜์—ˆ์–ด์š”."/>}
    	)
    }

    ํ•˜์ง€๋งŒ

    .

    .

    Main ์ปดํฌ๋„ŒํŠธ ๋ฟ ์•„๋‹Œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์Šค๋‚ต๋ฐ”๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ , 3์ดˆ ํ›„ ์‚ฌ๋ผ์ง€๋Š” ๋กœ์ง(activateSnackbar ํ•จ์ˆ˜)์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด?

    ๋ชจ๋“  snackbar๋ฅผ 3์ดˆ๊ฐ€ ์•„๋‹Œ 5์ดˆ ๋’ค์— ์‚ฌ๋ผ์ง€๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด?

     

     

    ์ด์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ์Šค๋‚ต๋ฐ”๊ฐ€ ์‚ฌ์šฉ๋œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์ถ”๊ฐ€/์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ , ๋”์šฑ ์œ ์—ฐ์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์ฐพ์•„๋‚ด๊ณ , ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ณด์•˜๋‹ค. 

     

     

     

     

    ๐Ÿ‹  ์ˆ˜์ • ํ›„

    // ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ 
    function Snackbar({content}: {content: string}){
       const transition = useTransition(isActive, {
         entering: { animation: `${slideIn} 0.5s ease-in-out forwards` },
         exiting: { animation: `${slideOut} 0.5s ease-in-out forwards` },
       });
    
    	return (
    		<HStack style={transition}>
    			<CheckIcon/>
    			{content}
    		</HStack>
    	)
    }
    
    // useSnackbar.tsx
    
    function useSnackbar(
      content: string,
    ): [boolean, () => void, () => JSX.Element] {
    	const [showSnackbar, setShowSnackbar] = useState(true)
    
      function activateSnackbar() {
        setShowSnackbar(true);
        setTimeout(() => setShowSnackbar(false), 3000);
      }
    
      const Snackbar = () => <_Snackbar isActive={showSnackbar} content={content} />; // --- (1) 
    
      return [showSnackbar, activateSnackbar, Snackbar];
    }
    // ์‚ฌ์šฉ๋ฌธ 
    
    import useSnackbar from "@/hooks/useSnackbar";
    
    function Main(){
    	const [showSnackbar, activateSnackbar, Snackbar] = useSnackbar("์‹œ๊ฐ„ํ‘œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); // Snackbar ๋‚ด๋ถ€ ์ปจํ…์ธ  
    
    	return (
    		{isActive && <Snackbar/> }
    	)
    }
    

     

    ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ์™€ ์ด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ useSnackbar ํ›…์— ์‘์ง‘ํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…์„ ์ƒ์„ฑํ•˜์˜€๋‹ค. ์Šค๋‚ต๋ฐ”๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ์˜ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ์ œ๊ณตํ•˜๊ณ , 

    - ์Šค๋‚ต๋ฐ” ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ์ƒํƒœ๊ฐ’: showSnackbar
    - ์Šค๋‚ต๋ฐ”๋ฅผ ๋ณด์—ฌ์ค„ ์‹œ์ ์— ํ˜ธ์ถœํ•  ํ•จ์ˆ˜: activateSnackbar
    - ๋™์ ์œผ๋กœ ์ „๋‹ฌํ•œ content๋ฅผ ๋‹ด์€ ์Šค๋‚ต๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜: Snackbar

    ์Šค๋‚ต๋ฐ”๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ 3์ดˆ ํ›„ ์–ธ๋งˆ์šดํŠธ๋˜๋Š” ๋ณต์žกํ•œ ๋กœ์ง์€ ์ˆจ๊ฒจ์ง„ ์ถ”์ƒํ™”/์บก์Аํ™” ๋œ ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค!

     

    ๐Ÿ‹  ์ •๋ฆฌ

    ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด๋ฏธ ํ•ด๋ณด์•˜๋˜ ๊ณ ๋ฏผ์ผ ์ˆ˜๋„, ์ ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ๋ฒ•์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ...

    ๊ฐ™์€ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ๋ถ„๋“ค์—๊ฒ ๊ฝค๋‚˜ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

     

    (๋‹ค๋ฅธ chakra ui๊ฐ€ ์ง€์›ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ๋ณธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹น https://github.com/Plan-A-project/Plan-A-client/issues/37)

     

     

    ๐Ÿ‹  2024-03-08

    ํ˜„์žฌ ์‹œ์ ์—์„œ ํฌ์ŠคํŒ… ๋ฐฉ์‹์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ์ปค์Šคํ…€ํ›…์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์— ์—ฌ๋Ÿฌ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    1. ์ปค์Šคํ…€ ํ›…๊ณผ ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„, ์œ ์‚ฌํ•œ ๋กœ์ง์˜ ์ปค์Šคํ…€ ํ›…์—๋„ ๋””์ž์ธ์ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋ณ„ ๋ณ„๋„์˜ ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์•ผํ–ˆ๋˜ ์ด์Šˆ.
    2. ์ปค์Šคํ…€ ํ›… ๋‚ด๋ถ€์ ์œผ๋กœ ์„ ์–ธํ•œ ์ƒํƒœ๊ฐ’(A)์ด ์žˆ๊ณ , ์ปค์Šคํ…€ํ›…์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ(B)๊ฐ€ ๊ทธ ์ƒํƒœ๊ฐ’(A)์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค๋ฉด, A๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ, ์ปค์Šคํ…€ ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ & A๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” B์— ๋ฆฌ๋ Œ๋”๋ง์ด ์ค‘๋ณตํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ.

    ์œ„ ์ด์œ ๋กœ ํ˜„์žฌ๋Š” HOC ํŒจํ„ด์„ ์ ์šฉํ•œ ์ปค์Šคํ…€ํ›… ์ปดํฌ๋„ŒํŠธ ๋ฐ˜ํ™˜ ๋ฐฉ์‹์€ ๋”์ด์ƒ ์ฑ„ํƒํ•˜์ง€ ์•Š์€ ์ฑ„, ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ํ›…์˜ ์„ ์–ธ๋ฌธ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ํ›…์ด ๋ฐ˜ํ™˜ํ•œ props๋ฅผ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ์ถ”ํ›„ ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    (์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊พธ๋ฒ…) 

     

     

     

     

    ์ฐธ์กฐ

    *https://www.patterns.dev/posts/provider-pattern*

    *https://patterns-dev-kr.github.io/design-patterns/hoc-pattern/*

    https://biggwang.github.io/2019/06/28/Design Patterns/[Design Patterns] ํŒฉํ† ๋ฆฌ ํŒจํ„ด, ๋„๋Œ€์ฒด ์™œ ์“ฐ๋Š”๊ฑฐ์•ผ-๊ธฐ๋ณธ ์ด๋ก ํŽธ/

Designed by Tistory.