λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
React

[React] sideEffect

by mtm1018 2025. 7. 9.

πŸ”„λ¦¬μ•‘νŠΈλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μ–΄λ–»κ²Œ μœ μ§€ν• κΉŒ?

λ¦¬μ•‘νŠΈλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 순수 ν•¨μˆ˜μ²˜λŸΌ μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€.

 

즉, μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹¨μˆœνžˆ ν•¨μˆ˜ 호좜과 같이 μ·¨κΈ‰ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μˆœμˆ˜ν•¨μˆ˜λŠ” 무엇이고 λ¦¬μ•‘νŠΈλŠ” 무엇을 μœ„ν•΄ μˆœμˆ˜ν•¨μˆ˜λΌλŠ” κ°œλ…μ„ κ°•μ‘°ν• κΉŒμš”?


πŸ’§μˆœμˆ˜ν•¨μˆ˜λž€?

μˆœμˆ˜ν•¨μˆ˜λŠ” λ¦¬μ•‘νŠΈμ—λ§Œ μžˆλŠ” κ°œλ…μ΄ μ•„λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜μ—μ„œλ„ λ‚˜μ˜€λŠ” λ‚΄μš©μž…λ‹ˆλ‹€.

 

μˆœμˆ˜ν•¨μˆ˜λž€ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

  • μžμ‹ μ˜ 일에 μ§‘μ€‘ν•©λ‹ˆλ‹€ : ν•¨μˆ˜κ°€ 호좜되기 전에 μ‘΄μž¬ν–ˆλ˜ κ°μ²΄λ‚˜ λ³€μˆ˜λŠ” λ³€κ²½ν•˜μ§€μ•ŠμŠ΅λ‹ˆλ‹€.
  • 같은 μž…λ ₯,같은 좜λ ₯ : μž…λ ₯값이 κ°™μœΌλ©΄ 좜λ ₯값은 μΌμ •ν•©λ‹ˆλ‹€.
  • μ™ΈλΆ€ λ³€μˆ˜ μ°Έμ‘°λ‚˜ 변경이 μ—†μ–΄μ•Όν•©λ‹ˆλ‹€
function double(number) {
  return 2 * number;
}

 

 

μœ„ ν•¨μˆ˜λŠ” numberλΌλŠ” λ§€κ°œλ³€μˆ˜κ°€ λ“€μ–΄μ˜€λ©΄ 항상 2λ₯Ό κ³±ν•˜λŠ” ν•œκ°€μ§€ μΌλ§Œν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ, number에 같은 μž…λ ₯값이 μ—¬λŸ¬λ²ˆ λ“€μ–΄μ˜€λ”λΌλ„ 좜λ ₯값은 μΌμ •ν•©λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μœ„ ν•¨μˆ˜λŠ” 순수 ν•©μˆ˜μž…λ‹ˆλ‹€.

function double(number) {
  console.log(number)
  return 2 * number;
}

 

 

κ·Έλ ‡λ‹€λ©΄ μœ„ ν•¨μˆ˜λŠ” μˆœμˆ˜ν• κΉŒμš”?

 

μœ„ ν•¨μˆ˜μ˜ 경우 μ½˜μ†”μ°½μ— numberλ₯Ό λ„μš°λŠ” 일과 number에 2λ₯Ό κ³±ν•˜λŠ” 일 두가지λ₯Ό ν•©λ‹ˆλ‹€.

 

μž…λ ₯값에 λ”°λ₯Έ 좜λ ₯값은 μΌμ •ν•˜μ§€λ§Œ 두가지 일을 ν•˜λ―€λ‘œ μœ„ ν•¨μˆ˜λŠ” μˆœμˆ˜ν•¨μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.

 

λ¦¬μ•‘νŠΈλŠ” μž‘μ„±λ˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈκ°€ μˆœμˆ˜ν•¨μˆ˜μΌκ±°λΌ κ°€μ •ν•©λ‹ˆλ‹€


πŸ¦‹ side effect

그럼 μˆœμˆ˜ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚ κΉŒμš”?

 

이λ₯Ό μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ(μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Ό)라고 λΆ€λ¦…λ‹ˆλ‹€.

 

μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” μˆœμˆ˜ν•¨μˆ˜μ˜ μ •μ˜μ— λ°˜ν•˜λŠ” νŠΉμ§•μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  경우 μ™ΈλΆ€ λ³€μˆ˜μ˜ 값이 바뀐닀면 ν•¨μˆ˜μ˜ 좜λ ₯값은 μ˜λ„μ™€ λ‹€λ₯΄κ²Œ λ‹¬λΌμ§ˆκ²λ‹ˆλ‹€.

 

 

μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μš°λ°œν•˜λŠ” μ½”λ“œ

  • DOM 쑰각 (document.querySelector)
  • λΈŒλΌμš°μ € API호좜 (setTimeout,setInterval)
  • λ‘œμ»¬μŠ€ν† λ¦¬μ§€ μ ‘κ·Ό
  • μ„œλ²„μš”μ²­ (fetch, url, axios)
  • μ½˜μ†” 좜λ ₯
  • μƒνƒœμ €μž₯μ†Œμ— 읽기 / μ“°κΈ° (Context API, Zustand, RTK)
let add = 3 function sum(number) { return add + number; }

console.log(sum(2)) // 5

add = 4

console.log(sum(2)) // 6

πŸŒ€ Side Effect κ°™μ•„λ³΄μ΄λŠ” μˆœμˆ˜ν•¨μˆ˜

μˆœμˆ˜ν•¨μˆ˜μ˜ νŠΉμ§• 쀑, μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ λ³€ν˜•ν•˜λ©΄ μˆœμˆ˜ν•¨μˆ˜μ˜ μ‘°κ±΄μ—μ„œ λ²—μ–΄λ‚˜κ²Œ λ©λ‹ˆλ‹€.

 

그런데 이 νŠΉμ§•μ— λ°˜ν•˜λŠ” κ²ƒμ²˜λŸΌ 생긴 ν•¨μˆ˜κ°€ λͺ‡κ°€μ§€ μžˆμŠ΅λ‹ˆλ‹€.

 

  1. props

propsλŠ” 얼핏보면 ν•¨μˆ˜λ‚΄μ— μ—†λ˜ λ³€μˆ˜λ‹ˆκΉŒ μ™ΈλΆ€ λ³€μˆ˜κ°™μ•„λ³΄μž…λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ propsλŠ” μƒμœ„ μš”μ†Œμ—μ„œ ν•˜μœ„ μš”μ†Œλ‘œ κ±΄λ„€μ£ΌλŠ” λ°μ΄ν„°μ΄λ©΄μ„œ, immutableλ°μ΄ν„°μž…λ‹ˆλ‹€.

 

즉, λ³€ν˜•λ„ λΆˆκ°€λŠ₯ν•˜κ³  μ˜μ‘΄μ„±μ΄ μΆ”μ λ˜λŠ” 데이터이기 λ•Œλ¬Έμ— μ™ΈλΆ€λ³€μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.

function Cup({ guest }) {  
return Tea cup for {guest}
}
  1. μ§€μ—­λ³€μˆ˜

μ§€μ—­ λ³€μˆ˜μ˜ 경우 μ»΄ν¬λ„ŒνŠΈ μ‹€ν–‰μ‹œλ§ˆλ‹€ λ‹€μ‹œ μƒμ„±λ˜λŠ” 값이기 떄문에

 

μ»΄ν¬λ„ŒνŠΈμ˜ λ‚΄λΆ€ν•¨μˆ˜ μž…μž₯μ—μ„œ 보면 μ™ΈλΆ€ λ³€μˆ˜μ²˜λŸΌ 보일지라도 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλŠ” μ•„λ‹™λ‹ˆλ‹€.


function MyComponent() {  
let count = 0;  
count++;  
 
return count
}

 

 

μœ„μ˜ μ§€μ—­λ³€μˆ˜λŠ” λ Œλ”λ§ λ λ•Œλ§ˆλ‹€ countκ°€ 0으둜 μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 이전에 Mycomponentκ°€ 호좜 된 적이 μžˆλ”λΌλ„ λ…λ¦½μ μœΌλ‘œ 관리과 λ˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

 

κ²°κ΅­ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μˆœμˆ˜ν•¨μˆ˜λ₯Ό λ§Œλ“€λ €λ©΄ λ Œλ”λ§μ— λŒ€ν•΄ μ΄ν•΄ν•˜κ³  μžˆλŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.