[React] Side Effect

Na Jeongยท2022๋…„ 11์›” 28์ผ
0

react

๋ชฉ๋ก ๋ณด๊ธฐ
5/11
post-thumbnail

๐Ÿ“•Side Effect๋ž€?

๐Ÿ“”Side Effect ๊ฐœ๋…

side effect๋ฅผ ๋ฒˆ์—ญํ•˜์ž๋ฉด ๋ถ€์ž‘์šฉ ์ •๋„๋กœ ๋ฒˆ์—ญ์ด ๋œ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๋ถ€์ž‘์šฉ์€ ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ ์ฃผ๋œ ํšจ๊ณผ ์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ํšจ๊ณผ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠนํžˆ, ํ”„๋กœ๊ทธ๋žจ์„ ์ด๋ฃจ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ ํ•จ์ˆ˜์—์„œ ์“ฐ์ด๋Š” ์šฉ์–ด์ด๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•จ์ˆ˜์˜ ์ฃผ๋œ ๋ชฉ์ ์€ Input์„ ๋ฐ›์•„์„œ output์„ ์‚ฐ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜์˜ ๋ถ€์ž‘์šฉ์ด๋ž€ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์ธ Input์„ ๋ฐ›์•„์„œ output์„ ์‚ฐ์ถœํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋ชจ๋“  ํ–‰์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด,
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ side effect๋Š” ํ•จ์ˆ˜๊ฐ€ input์„ ๋ฐ›์•„์„œ output์„ ์‚ฐ์ถœํ•˜๋Š” ๊ณผ์ •์—์„œ,
1. ์™ธ๋ถ€์˜ ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ํ–‰์œ„
2. ์™ธ๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ“”Side Effect ์˜ˆ์‹œ

const sum = (x) => {
	return x + 1;
};

์œ„์˜ ์˜ˆ์‹œ์—์„œ sum ํ•จ์ˆ˜๋Š” x๋ผ๋Š” input์„ ๋ฐ›์•„์„œ x+1์ด๋ผ๋Š” Output์„ ์‚ฐ์ถœํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
์ด ํ•จ์ˆ˜๋Š” input์„ ๋ฐ›์•„์„œ output์„ ๋‚ด๋Š” ํ–‰์œ„ ์™ธ์— ๋‹ค๋ฅธ ํ–‰์œ„๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ sice effect๊ฐ€ ์—†๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด์ฒ˜๋Ÿผ side effect๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

side effect๋ฅผ ์ผ์œผํ‚ค๋Š” ํ–‰์œ„

let num;

const sum = (x) => {
	num = x+1;
};

์œ„์˜ ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜ num์ด ์žˆ๊ณ , sum ํ•จ์ˆ˜๋Š” x๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ num์— x+1์„ ํ• ๋‹นํ•œ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€์˜ ๊ฐ’์ธ num์„ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

const printNum = (x) => {
	console.log(x);
};

const changeTitle = (newTitle) => {
	const title = document.getElementById('title');
    
    title.innerText = newTitle;
};

์œ„ ๋‘๊ฐ€์ง€ ์ฝ”๋“œ๋“ค๋„ ๋ชจ๋‘ side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
DOM์„ ์กฐ์ž‘ํ•˜๊ณ , console์— ํŠน์ • ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ–‰์œ„ ๋˜ํ•œ ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” DOM๊ณผ console์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด๊ธฐ์— side effect๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“”์ •๋ฆฌ

๊ทธ๋ ‡๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ side effect๋Š” ๊ธฐํ”ผํ•ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ์ผ๊นŒ ? ์ •๋‹ต์€ ๊ทธ๋ ‡๋‹ค ์ด๋‹ค.
side effect๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
const sum = x => x+1์ด๋ž€ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ 1์„ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด 2๊ฐ€ return ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ const sum = x => x+num์ด๋ž€ ํ•จ์ˆ˜๋Š” num ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.
๋”ฐ๋ผ์„œ, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ด๋Ÿฌํ•œ side effect๋“ค์„ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์šฉ์ดํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ณ ์ž ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ“•React์—์„œ์˜ Side Effect

๐Ÿ“”ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ input๊ณผ output

React์—์„œ rendering์ด๋ž€ state, props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UI ์š”์†Œ๋ฅผ ๊ทธ๋ ค๋‚ด๋Š” ํ–‰์œ„์ด๋‹ค.
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” state์™€ props๋ฅผ ํ†ตํ•ด์„œ JSX๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด ๋ณธ์งˆ์ ์ธ ์—ญํ• ์ด๋‹ค.
๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ input์€ state, props์ด๋ฉฐ output์€ JSX์ด๋‹ค.

๐Ÿ“”ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ side effect

UI๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•˜๋Š” side effect์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

  1. Data Fetching
    ํ˜„๋Œ€ ๊ฐœ๋ฐœ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ณต์žกํ•œ UI๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๋ฐ์— ์ดˆ์ ์„ ๋‘๊ณ  ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ€๊ณตํ•˜๋Š” ์—ญํ• ์„ ๋งก๊ณ  ์žˆ๋‹ค.
    ์ด๋Ÿฐ ๊ตฌ์กฐ ์†์—์„œ ใ…๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ฐฑ์—”๋“œ API๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ–‰์œ„๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  2. DOM ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘
    ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ์ด์ƒ DOM์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ํ–‰์œ„๋Š” ํ•„์ˆ˜์ ์ด๋‹ค.
    ๋ฌผ๋ก  React๋Š” DOM์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ผ์ด ๋งŽ์ง€๋„ ์•Š๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ๊ถŒ์žฅ๋˜์ง€ ์•Š์ง€๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” DOM์— ์ ‘๊ทผํ•˜๊ณ  ์ง์ ‘ ์กฐ์ž‘์„ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค,

  3. ๊ตฌ๋…(Subscribe)
    ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ตฌ๋…์ด๋ž€ ์–ด๋–ค ๊ฒƒ์˜ ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด๋‹ค๊ฐ€ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠน์ •ํ•œ ์•ก์…˜์„ ์ทจํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐœ๋ฐœ์—์„œ ๊ตฌ๋…์ด๋ž€ ๊ฐœ๋…์„ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›น ๊ฐœ๋ฐœ์—์„œ ํ”ํžˆ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์ด๋‹ค.
    ์‹œ๊ฐ„์€ ๊ณ„์†ํ•ด์„œ ํ๋ฅด๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹œ๊ฐ„์„ ๊ตฌ๋…ํ•˜๋ฉด์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ธ setTimeout, ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” setInterval๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์‹œ๊ฐ„์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ดํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

profile
๋Š์ž„์—†์ด ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž (โธโธโขโธโธ) เท†

0๊ฐœ์˜ ๋Œ“๊ธ€