๐Ÿ–ฅFrontEnd/React

ํด๋ฆฐ์—…, clean up ํ•จ์ˆ˜, ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ, useEffect ์ด์ •๋ฆฌ

hellohailie 2022. 7. 24. 18:52

 

 

ํด๋ฆฐ์—… ์ž‘์—…์ด ํ•„์š”ํ•œ effect

 

useEffect(() => {
    setFormIsValid(
      enteredEmail.includes("@") && enteredPassword.trim().length > 6
    );
  }, [enteredEmail, enteredPassword]);

setFormIsValid()ํ•จ์ˆ˜๋Š” enteredEmail, enteredPassword๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค state๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค. ==>> ์ข‹์ง€ ์•Š๋‹ค!!

 

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์‹คํ–‰์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์„œ ๋ฆฌ์•กํŠธ๋Š” DOM์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒŒ ํ•„์š”ํ•œ ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ enteredEmail, enteredPassword๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์—ฌ๋ถ€ํ™•์ธ์€ ๋ถˆํ•„์š”ํ•˜๋‹ค. 

 

๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ

1. ์ผ์ •๋Ÿ‰์˜ ํ‚ค ์ž…๋ ฅ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ. 

2. ํ‚ค ์ž…๋ ฅ ํ›„ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ.

 

=> ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ดํ•‘ํ•˜๋Š” ๋™์•ˆ์—๋Š” ์œ ํšจํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜์ง€ ๋ง๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ดํ•‘์„ ๋ฉˆ์ถœ ๋•Œ ๊ทธ๋•Œ์„œ์•ผ ํ™•์ธํ•œ๋‹ค. 

 

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค ์ž…๋ ฅํ•œ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž! => ๋””๋ฐ”์šด์‹ฑ

์ด๊ฒƒ์„ setTimeout()๊ณผ useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค. 

 

useEffect(() => {
    console.log("checking form validity!!");
    setTimeout(() => {
      setFormIsValid(
        enteredEmail.includes("@") && enteredPassword.trim().length > 6
      );
    }, 500);
  }, [enteredEmail, enteredPassword]);

 

500๋ฐ€๋ฆฌ์ดˆ ํ›„์—๋งŒ ์ด ์ž‘์—… (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

๊ทผ๋ฐ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ชจ๋“  ํ‚ค ์ž…๋ ฅ์— ๋Œ€ํ•ด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•œ๊ฑฐ๋‹ค. 

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํƒ€์ด๋จธ๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์— ํ‚ค๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์ง€์šด๋‹ค. ์ฆ‰ ํƒ€์ด๋จธ๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์‹คํ–‰๋˜๋„๋ก!

500๋ฐ€๋ฆฌ ์ดˆ ํ›„์— ์™„๋ฃŒ๋˜๋Š” ํƒ€์ด๋จธ ํ•˜๋‚˜๋งŒ ์ƒ๊ธฐ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์„œ ํƒ€์ด๋จธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ๊นŒ์ง€๋Š” clear๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

useEffect(()=>{
	์‹คํ–‰์‹œํ‚ฌ ์ฝ”๋“œ
    
    return ()=> {} ๐Ÿ‘‰ ์—ฌ๊ธฐ์— ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์จ๋ณด์ž
}, [])

 

useEffect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค (์‚ฌ์‹ค ์‹คํ–‰๋˜๊ธฐ ์ „์—), ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

๋˜ํ•œ ์ด ํด๋ฆฐ์—… ํ•จ์ˆ˜๋Š” ์ดํŽ™ํŠธ๋ฅผ ํŠน์ •ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ๋งˆ์šดํŠธ ํ•ด์ œ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‚ฌ์šฉ๋  ๋•Œ๋งˆ๋‹ค!

 

ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ •๋ฆฌ

1. ๋ชจ๋“  ์ƒˆ๋กœ์šด sideEffect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค. 

2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค. 

(๋‹จ, sideEffect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. )

 

 


 useEffect(() => {
    const identifier = setTimeout(() => {
      console.log("checking form validity!!");
      setFormIsValid(
        enteredEmail.includes("@") && enteredPassword.trim().length > 6
      );
    }, 500);

    return () => {
      console.log("clean up!!!!");
      clearTimeout(identifier);
    }; // ์ด๊ฑด clean up ํ•จ์ˆ˜์ด๋‹ค.
  }, [enteredEmail, enteredPassword]);

 

์œ„ ํ•จ์ˆ˜ ํ•ด์„

ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์„ค์ •๋œ ํƒ€์ด๋จธ๋ฅผ ์ง€์šด๋‹ค. 

๋”ฐ๋ผ์„œ ๋‹ค์Œ sideEffect๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊ฐ€ ๋˜๋ฉด ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ฆ‰, ์ƒˆ๋กœ์šด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰ ํƒ€์ด๋จธ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ์ด๋‹ค.

 


useEffect ์ด์ •๋ฆฌ

useEffect๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

 

์–ธ์ œ useEffect์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์‹œ์ž‘๋˜๊ณ  ์‹คํ–‰๋˜๋Š”์ง€ ๊ผญ ์•Œ๊ธฐ!!!

 

 

์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์•„์˜ˆ ์•ˆ์ ๋Š” ๊ฒฝ์šฐ (๋นˆ ๋ฐฐ์—ด๋„ ์—†์„๋•Œ) => 

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋ง (์ฒ˜์Œ์œผ๋กœ ๋งˆ์šดํŠธ)๋˜๊ณ , ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ฃผ๊ธฐ ํ›„์— useEffect ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

 

์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๋•Œ (๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ) => 

ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋ง (์ฒ˜์Œ์œผ๋กœ ๋งˆ์šดํŠธ)๋  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค. 

(๊ทธ ์ดํ›„์˜ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. )

 

์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ=> 

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋ง (์ฒ˜์Œ์œผ๋กœ ๋งˆ์šดํŠธ) ์‹คํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค. 

 

์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ && ํด๋ฆฐ์—… ํ•จ์ˆ˜ =>

useEffect ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๋•Œ (๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ) && ํด๋ฆฐ์—… ํ•จ์ˆ˜ =>

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์‹คํ–‰๋œ๋‹ค. (์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ ๋  ๋•Œ ์‹คํ–‰๋จ) 

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“