์ค์ฒฉ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์์ ํ๋ ๋น๋ฒ์ ์์๋ณด์ธ์. ์ด ๊ฐ์ด๋๋ ์ต์ ๋ ์ฒด์ด๋ ํ ๋น์ด ์๋ ์ด์ ๋ฅผ ํ๊ตฌํ๊ณ , ์ต์ ๊ฐ๋ ํด๋ก์ฆ๋ถํฐ `||=` ๋ฐ `??=`๋ฅผ ์ฌ์ฉํ ๊ฒฝ๋ก ์์ฑ๊น์ง, ์ค๋ฅ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํจํด์ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ ์ฒด์ด๋ ํ ๋น: ์์ ํ ์์ฑ ์์ ์ ์ํ ์ฌ์ธต ๋ถ์
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ด๋ ์ ๋ ์์ ์ ํด๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋จ์ํค๋ ๊ณจ์น ์ํ ์ค๋ฅ์ธ "TypeError: Cannot read properties of undefined"๋ฅผ ํ๋ฆผ์์ด ๋ง์ฃผํด ๋ณด์ จ์ ๊ฒ๋๋ค. ์ด ์ค๋ฅ๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ ๊ฐ์ด ์ค์ ๋ก๋ `undefined`์ผ ๋ ๊ทธ ์์ฑ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ์ ํ์ ์ธ ํต๊ณผ ์๋ก์๋ ๊ฐ์ต๋๋ค.
ES2020 ๋ช ์ธ์ ํจ๊ป ๋ฑ์ฅํ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ฑ ์ฝ๊ธฐ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ๋๊ตฌ, ๋ฐ๋ก ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์(`?.`)๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด ์ฐ์ฐ์๋ ๊น๊ฒ ์ค์ฒฉ๋๊ณ ๋ฐฉ์ด์ ์ธ ์ฝ๋๋ฅผ ๊น๋ํ ํ ์ค ํํ์์ผ๋ก ๋ฐ๊ฟ์ฃผ์์ต๋๋ค. ์ด๋ ์์ฐ์ค๋ฝ๊ฒ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋์ง๋ ๋ค์ ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋๋ค. ์์ฑ์ ์์ ํ๊ฒ ์ฝ์ ์ ์๋ค๋ฉด, ์์ ํ๊ฒ ์ธ ์๋ ์์๊น? '์ต์ ๋ ์ฒด์ด๋ ํ ๋น' ๊ฐ์ ๊ฒ์ ํ ์ ์์๊น?
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋ฐ๋ก ๊ทธ ์ง๋ฌธ์ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ด ๋จ์ํด ๋ณด์ด๋ ์์ ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ์ด ์๋์ง ๊น์ด ํ๊ณ ๋ค๊ณ , ๋ ์ค์ํ๊ฒ๋ ์ ์ฌ์ ์ผ๋ก ์กด์ฌํ์ง ์๋ ์ค์ฒฉ ์์ฑ์ ์์ ํ๊ณ , ํ๋ณต๋ ฅ ์์ผ๋ฉฐ, ์ค๋ฅ ์์ด ์์ ํ๋ ๋์ผํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ํจํด๊ณผ ์ต์ ์ฐ์ฐ์๋ค์ ์์๋ณผ ๊ฒ์ ๋๋ค. ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณต์กํ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ , API ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ , ๊ฒฌ๊ณ ํ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๊ตฌ์ถํ๋ , ์ด๋ฌํ ๊ธฐ์ ์ ๋ง์คํฐํ๋ ๊ฒ์ ํ๋ ๊ฐ๋ฐ์ ํ์์ ์ ๋๋ค.
๊ฐ๋จํ ๋ณต์ต: ์ต์ ๋ ์ฒด์ด๋(`?.`)์ ํ
ํ ๋น์ ๋ค๋ฃจ๊ธฐ ์ ์, ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์(`?.`)๊ฐ ์ ๊ทธ๋ ๊ฒ ํ์์ ์ธ์ง ์ ์ ๋ณต์ตํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์ฐ์ฐ์์ ์ฃผ๋ ๊ธฐ๋ฅ์ ์ฒด์ธ์ ๊ฐ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ฒ์ฆํ ํ์ ์์ด ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ค ๊น์ํ ๊ณณ์ ์์ฑ์ ๊ฐ๋จํ๊ฒ ์ ๊ทผํ๋ ๊ฒ์ ๋๋ค.
๋ณต์กํ ์ฌ์ฉ์ ๊ฐ์ฒด์์ ์ฌ์ฉ์์ ๋๋ก๋ช ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค.
๊ณผ๊ฑฐ ๋ฐฉ์: ์ฅํฉํ๊ณ ๋ฐ๋ณต์ ์ธ ๊ฒ์ฌ
์ต์ ๋ ์ฒด์ด๋์ด ์๋ค๋ฉด, ์ค๊ฐ ์์ฑ(`profile`์ด๋ `address`)์ด ๋๋ฝ๋์์ ๊ฒฝ์ฐ `TypeError`๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ์ฒด์ ๊ฐ ๋ ๋ฒจ์ ํ์ธํด์ผ ํฉ๋๋ค.
์ฝ๋ ์์:
const user = { id: 101, name: 'Alina', profile: { // address๊ฐ ๋๋ฝ๋จ age: 30 } }; let street; if (user && user.profile && user.profile.address) { street = user.profile.address.street; } console.log(street); // ์ถ๋ ฅ: undefined (์ค๋ฅ ์์!)
์ด ํจํด์ ์์ ํ์ง๋ง, ํนํ ๊ฐ์ฒด ์ค์ฒฉ์ด ๊น์ด์ง์๋ก ๋ฒ๊ฑฐ๋กญ๊ณ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ต์ ๋ฐฉ์: `?.`๋ก ๊น๋ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ
์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์๋ ์ ๊ฒ์ฌ๋ฅผ ๊ฐ๋ ์ฑ ๋์ ํ ์ค๋ก ๋ค์ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค. `?.` ์์ ๊ฐ์ด `null` ๋๋ `undefined`์ด๋ฉด ์ฆ์ ํ๊ฐ๋ฅผ ์ค๋จํ๊ณ `undefined`๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
์ฝ๋ ์์:
const user = { id: 101, name: 'Alina', profile: { age: 30 } }; const street = user?.profile?.address?.street; console.log(street); // ์ถ๋ ฅ: undefined
์ด ์ฐ์ฐ์๋ ํจ์ ํธ์ถ(`user.calculateScore?.()`) ๋ฐ ๋ฐฐ์ด ์ ๊ทผ(`user.posts?.[0]`)์๋ ์ฌ์ฉํ ์ ์์ด ์์ ํ ๋ฐ์ดํฐ ๊ฒ์์ ์ํ ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ์ ๋๋ค. ํ์ง๋ง ๊ทธ ๋ณธ์ง์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ฒ์ ์ฝ๊ธฐ ์ ์ฉ ๋ฉ์ปค๋์ฆ์ด๋ผ๋ ์ ์ ๋๋ค.
๊ฐ์ฅ ์ค์ํ ์ง๋ฌธ: ์ต์ ๋ ์ฒด์ด๋์ผ๋ก ํ ๋นํ ์ ์์๊น?
์ด์ ์ฐ๋ฆฌ ์ฃผ์ ์ ํต์ฌ์ผ๋ก ๋ค์ด๊ฐ๋๋ค. ์ด ๋๋๋๋ก ํธ๋ฆฌํ ๊ตฌ๋ฌธ์ ํ ๋น๋ฌธ์ ์ผ์ชฝ์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ์ฃผ์๋ฅผ ์ ๋ฐ์ดํธํด ๋ด ์๋ค:
์ฝ๋ ์์ (์คํจํฉ๋๋ค):
const user = {}; // ์์ฑ์ ์์ ํ๊ฒ ํ ๋นํ๋ ค๋ ์๋ user?.profile?.address = { street: '123 Global Way' };
์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด `TypeError`๊ฐ ์๋๋ผ ๋ค๋ฅธ ์ข ๋ฅ์ ์ค๋ฅ๋ฅผ ๋ง๋๊ฒ ๋ ๊ฒ์ ๋๋ค:
Uncaught SyntaxError: Invalid left-hand side in assignment
์ ์ด๊ฒ์ด ๊ตฌ๋ฌธ ์ค๋ฅ(Syntax Error)์ผ๊น์?
์ด๊ฒ์ ๋ฐํ์ ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ๋ ์ ์ ์ด๊ฒ์ ์ ํจํ์ง ์์ ์ฝ๋๋ก ์๋ณํฉ๋๋ค. ๊ทธ ์ด์ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ธฐ๋ณธ ๊ฐ๋ ์ธ lvalue(์ข์ธก๊ฐ)์ rvalue(์ฐ์ธก๊ฐ)์ ๊ตฌ๋ถ์ ์์ต๋๋ค.
- lvalue๋ ๊ฐ์ด ์ ์ฅ๋ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์น, ์ฆ ๋ชฉ์ ์ง๋ฅผ ๋ํ๋ ๋๋ค. ๋ณ์(`x`)๋ ๊ฐ์ฒด ์์ฑ(`user.name`)๊ณผ ๊ฐ์ ์ปจํ ์ด๋๋ก ์๊ฐํ ์ ์์ต๋๋ค.
- rvalue๋ lvalue์ ํ ๋น๋ ์ ์๋ ์์ํ ๊ฐ์ ๋ํ๋ ๋๋ค. ์ซ์ `5`๋ ๋ฌธ์์ด `"hello"`์ ๊ฐ์ ๋ด์ฉ๋ฌผ์ ๋๋ค.
ํํ์ `user?.profile?.address`๋ ๋ฉ๋ชจ๋ฆฌ ์์น๋ก ํด์๋๋ค๋ ๋ณด์ฅ์ด ์์ต๋๋ค. ๋ง์ฝ `user.profile`์ด `undefined`๋ผ๋ฉด, ํํ์์ ๋จ๋ฝ(short-circuit) ํ๊ฐ๋์ด ๊ฐ `undefined`๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. `undefined`๋ผ๋ ๊ฐ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค. ์ด๋ ๋ง์น ์ฐํธ ๋ฐฐ๋ฌ๋ถ์๊ฒ '์กด์ฌํ์ง ์์'์ด๋ผ๋ ๊ฐ๋ ์ ์ํฌ๋ฅผ ๋ฐฐ๋ฌํ๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
ํ ๋น๋ฌธ์ ์ผ์ชฝ์ ์ ํจํ๊ณ ๋ช ํํ ์ฐธ์กฐ(lvalue)์ฌ์ผ ํ๊ณ , ์ต์ ๋ ์ฒด์ด๋์ ๊ฐ(`undefined`)์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ชจํธ์ฑ๊ณผ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ๊ตฌ๋ฌธ์ ์ ๋ฉด์ ์ผ๋ก ๊ธ์ง๋ฉ๋๋ค.
๊ฐ๋ฐ์์ ๋๋ ๋ง: ์์ ํ ์์ฑ ํ ๋น์ ํ์์ฑ
๊ตฌ๋ฌธ์ด ์ง์๋์ง ์๋๋ค๊ณ ํด์ ๊ทธ ํ์์ฑ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋๋๋ค. ์๋ง์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐ๋ฆฌ๋ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋์ง ํ์คํ ์์ง ๋ชปํ ์ฑ ๊น๊ฒ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- UI ํ๋ ์์ํฌ์์์ ์ํ ๊ด๋ฆฌ: React๋ Vue ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋, ์๋ณธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊น๊ฒ ์ค์ฒฉ๋ ์์ฑ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- API ์๋ต ์ฒ๋ฆฌ: API๊ฐ ์ต์ ๋ ํ๋๋ฅผ ํฌํจํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ์ ์ถ๊ฐํด์ผ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ด๊ธฐ ์๋ต์ ์กด์ฌํ์ง ์์ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์ ํ ๋นํ๋ ์์ ์ ํฌํจํฉ๋๋ค.
- ๋์ ์ค์ : ๋ค๋ฅธ ๋ชจ๋๋ค์ด ์์ ๋ง์ ์ค์ ์ ์ถ๊ฐํ ์ ์๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ถํ๋ ค๋ฉด ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ์ฆ์์์ ์์ ํ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ค์ ๊ฐ์ฒด๊ฐ ์๊ณ ํ ๋ง ์์์ ์ค์ ํ๊ณ ์ถ์ง๋ง `theme` ๊ฐ์ฒด๊ฐ ์์ง ์กด์ฌํ๋์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์ธ์.
๋ชฉํ:
const settings = {}; // ์ค๋ฅ ์์ด ๋ค์์ ๋ฌ์ฑํ๊ณ ์ถ์ต๋๋ค: settings.ui.theme.color = 'blue'; // ์ ์ฝ๋๋ "TypeError: Cannot set properties of undefined (setting 'theme')" ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น์? ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ๊ณ ์ค์ฉ์ ์ธ ํจํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ํ ์์ฑ ์์ ์ ์ํ ์ ๋ต
์ง์ ์ ์ธ "์ต์ ๋ ์ฒด์ด๋ ํ ๋น" ์ฐ์ฐ์๋ ์กด์ฌํ์ง ์์ง๋ง, ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ๋ค์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ถํฐ ๋ ๋ฐ์ ๋๊ณ ์ ์ธ์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
ํจํด 1: ์ ํต์ ์ธ '๊ฐ๋ ํด๋ก์ฆ(Guard Clause)' ์ ๊ทผ๋ฒ
๊ฐ์ฅ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ์ ํ ๋น์ ํ๊ธฐ ์ ์ ์ฒด์ธ์ ๊ฐ ์์ฑ์ด ์กด์ฌํ๋์ง ์๋์ผ๋ก ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ES2020 ์ด์ ์ ๋ฐฉ์์ ๋๋ค.
์ฝ๋ ์์:
const user = { profile: {} }; // ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ํ ๋นํ๊ณ ์ถ์ต๋๋ค if (user && user.profile && user.profile.address) { user.profile.address.street = '456 Tech Park'; }
- ์ฅ์ : ๋งค์ฐ ๋ช ์์ ์ด๋ฉฐ ์ด๋ค ๊ฐ๋ฐ์๋ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ๋ชจ๋ ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ํธํ๋ฉ๋๋ค.
- ๋จ์ : ๋งค์ฐ ์ฅํฉํ๊ณ ๋ฐ๋ณต์ ์ ๋๋ค. ๊น๊ฒ ์ค์ฒฉ๋ ๊ฐ์ฒด์์๋ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ, ์ข ์ข ๊ฐ์ฒด์ ๋ํ "์ฝ๋ฐฑ ํฌ"์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ํฉ์ ์ด๋ํฉ๋๋ค.
ํจํด 2: ๊ฒ์ฌ๋ฅผ ์ํด ์ต์ ๋ ์ฒด์ด๋ ํ์ฉํ๊ธฐ
์ฐ๋ฆฌ์ ์น๊ตฌ์ธ ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์๋ฅผ `if` ๋ฌธ์ ์กฐ๊ฑด ๋ถ๋ถ์ ์ฌ์ฉํ์ฌ ์ ํต์ ์ธ ์ ๊ทผ๋ฒ์ ํจ์ฌ ๊น๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ์์ ํ ์ฝ๊ธฐ์ ์ง์ ์ ์ธ ์ฐ๊ธฐ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
์ฝ๋ ์์:
const user = { profile: {} }; // 'address' ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด street๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค if (user?.profile?.address) { user.profile.address.street = '456 Tech Park'; }
์ด๊ฒ์ ๊ฐ๋ ์ฑ ๋ฉด์์ ํฐ ๊ฐ์ ์ ๋๋ค. ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ํ ๋ฒ์ ์์ ํ๊ฒ ํ์ธํฉ๋๋ค. ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ฉด(์ฆ, ํํ์์ด `undefined`๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด) ํ ๋น์ ์งํํ๋ฉฐ, ์ด์ ์ด ํ ๋น์ด ์์ ํ๋ค๋ ๊ฒ์ ์๋๋ค.
- ์ฅ์ : ์ ํต์ ์ธ ๊ฐ๋ ํด๋ก์ฆ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ต๋๋ค. "์ด ๊ฒฝ๋ก๊ฐ ์ ํจํ๋ค๋ฉด, ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ผ"๋ ์๋๋ฅผ ๋ช ํํ๊ฒ ํํํฉ๋๋ค.
- ๋จ์ : ์ฌ์ ํ ๋ ๊ฐ์ ๋ณ๋ ๋จ๊ณ(๊ฒ์ฌ์ ํ ๋น)๊ฐ ํ์ํฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, ์ด ํจํด์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๊ฒฝ๋ก๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๊ธฐ์กด ๊ตฌ์กฐ๋ง ์ ๋ฐ์ดํธํ ๋ฟ์ ๋๋ค.
ํจํด 3: ์ ์ง์ ์ผ๋ก ๊ฒฝ๋ก ์์ฑํ๊ธฐ (๋ ผ๋ฆฌ ํ ๋น ์ฐ์ฐ์)
๋ง์ฝ ์ฐ๋ฆฌ์ ๋ชฉํ๊ฐ ๋จ์ํ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์๋๋ผ ๊ฒฝ๋ก์ ์กด์ฌ๋ฅผ ๋ณด์ฅํ๊ณ , ํ์ํ๋ค๋ฉด ์์ฑํ๋ ๊ฒ์ด๋ผ๋ฉด ์ด๋จ๊น์? ๋ฐ๋ก ์ด๋ ๋ ผ๋ฆฌ ํ ๋น ์ฐ์ฐ์(ES2021์ ๋์ )๊ฐ ๋น์ ๋ฐํฉ๋๋ค. ์ด ์์ ์ ๊ฐ์ฅ ํํ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ ผ๋ฆฌ์ OR ํ ๋น(`||=`)์ ๋๋ค.
ํํ์ `a ||= b`๋ `a = a || b`์ ๋ฌธ๋ฒ ์คํ(syntactic sugar)์ ๋๋ค. ์ด๋ `a`๊ฐ falsy ๊ฐ(`undefined`, `null`, `0`, `''` ๋ฑ)์ด๋ฉด `a`์ `b`๋ฅผ ํ ๋นํ๋ผ๋ ์๋ฏธ์ ๋๋ค.
์ด ๋์์ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ๊ฒฝ๋ก๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ฝ๋ ์์:
const settings = {}; // color๋ฅผ ํ ๋นํ๊ธฐ ์ ์ 'ui'์ 'theme' ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค (settings.ui ||= {}).theme ||= {}; settings.ui.theme.color = 'darkblue'; console.log(settings); // ์ถ๋ ฅ: { ui: { theme: { color: 'darkblue' } } }
์๋ ๋ฐฉ์:
- `settings.ui ||= {}`: `settings.ui`๋ `undefined`(falsy)์ด๋ฏ๋ก, ์๋ก์ด ๋น ๊ฐ์ฒด `{}`๊ฐ ํ ๋น๋ฉ๋๋ค. ์ ์ฒด ํํ์ `(settings.ui ||= {})`๋ ์ด ์๋ก์ด ๊ฐ์ฒด๋ก ํ๊ฐ๋ฉ๋๋ค.
- `{}.theme ||= {}`: ๊ทธ๋ฐ ๋ค์ ์๋ก ์์ฑ๋ `ui` ๊ฐ์ฒด์ `theme` ์์ฑ์ ์ ๊ทผํฉ๋๋ค. ์ด๊ฒ ์ญ์ `undefined`์ด๋ฏ๋ก, ์๋ก์ด ๋น ๊ฐ์ฒด `{}`๊ฐ ํ ๋น๋ฉ๋๋ค.
- `settings.ui.theme.color = 'darkblue'`: ์ด์ `settings.ui.theme` ๊ฒฝ๋ก๊ฐ ์กด์ฌํจ์ ๋ณด์ฅํ์ผ๋ฏ๋ก, `color` ์์ฑ์ ์์ ํ๊ฒ ํ ๋นํ ์ ์์ต๋๋ค.
- ์ฅ์ : ํ์์ ๋ฐ๋ผ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ์ผ๋ฐ์ ์ด๊ณ ๊ด์ฉ์ ์ธ ํจํด์ ๋๋ค.
- ๋จ์ : ์๋ณธ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฏ๋ก, ํจ์ํ ๋๋ ๋ถ๋ณ์ฑ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์์๋ ๋ฐ๋์งํ์ง ์์ ์ ์์ต๋๋ค. ๋ ผ๋ฆฌ ํ ๋น ์ฐ์ฐ์์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ๋ ๊ตฌ๋ฌธ์ด ์ฝ๊ฐ ์ํธ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
ํจํด 4: ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํจ์ํ ๋ฐ ๋ถ๋ณ์ฑ ์ ๊ทผ๋ฒ
๋ง์ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ Redux์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ React ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ, ๋ถ๋ณ์ฑ์ ํต์ฌ ์์น์ ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฉด ์์ธกํ ์ ์๋ ๋์๊ณผ ์ถ์ ํ๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ค์ ์ข ์ข Lodash๋ Ramda์ ๊ฐ์ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Lodash๋ ๋ฐ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ํด ๋ง๋ค์ด์ง `_.set()` ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํจ์๋ ๊ฐ์ฒด, ๋ฌธ์์ด ๊ฒฝ๋ก, ๊ฐ์ ์ธ์๋ก ๋ฐ์ ํด๋น ๊ฒฝ๋ก์ ์์ ํ๊ฒ ๊ฐ์ ์ค์ ํ๋ฉฐ, ํ์ํ ๋ชจ๋ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
Lodash๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์์:
import { set } from 'lodash-es'; const originalUser = { id: 101 }; // _.set์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง๋ง, ๋ถ๋ณ์ฑ์ ์ํด ๋ณต์ ๋ณธ๊ณผ ํจ๊ป ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. const updatedUser = set(JSON.parse(JSON.stringify(originalUser)), 'profile.address.street', '789 API Boulevard'); console.log(originalUser); // ์ถ๋ ฅ: { id: 101 } (๋ณ๊ฒฝ๋์ง ์์) console.log(updatedUser); // ์ถ๋ ฅ: { id: 101, profile: { address: { street: '789 API Boulevard' } } }
- ์ฅ์ : ๋งค์ฐ ์ ์ธ์ ์ด๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ต๋๋ค. ์๋(`set(๊ฐ์ฒด, ๊ฒฝ๋ก, ๊ฐ)`)๊ฐ ๋งค์ฐ ๋ช ํํฉ๋๋ค. ๋ณต์กํ ๊ฒฝ๋ก(๋ฐฐ์ด ์ธ๋ฑ์ค `'posts[0].title'` ํฌํจ)๋ฅผ ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. ๋ถ๋ณ์ฑ ์ ๋ฐ์ดํธ ํจํด์ ์๋ฒฝํ๊ฒ ๋ค์ด๋ง์ต๋๋ค.
- ๋จ์ : ํ๋ก์ ํธ์ ์ธ๋ถ ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค. ์ด ๊ธฐ๋ฅ ํ๋๋ง ํ์ํ๋ค๋ฉด ๊ณผํ ์ ์์ต๋๋ค. ๋ค์ดํฐ๋ธ ์๋ฐ์คํฌ๋ฆฝํธ ํด๊ฒฐ์ฑ ์ ๋นํด ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค.
๋ฏธ๋๋ฅผ ํฅํ ์ ๋ง: ์ง์ ํ ์ต์ ๋ ์ฒด์ด๋ ํ ๋น?
์ด ๊ธฐ๋ฅ์ ๋ํ ๋ช ํํ ํ์์ฑ์ ๊ณ ๋ คํ ๋, TC39 ์์ํ(์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์คํํ๋ ๊ทธ๋ฃน)๋ ์ต์ ๋ ์ฒด์ด๋ ํ ๋น์ ์ํ ์ ์ฉ ์ฐ์ฐ์ ์ถ๊ฐ๋ฅผ ๊ณ ๋ คํ์๊น์? ๋๋ต์ '์'์ ๋๋ค, ๋ ผ์๋ ์ ์ด ์์ต๋๋ค.
ํ์ง๋ง, ์ด ์ ์์ ํ์ฌ ํ์ฑํ๋์ด ์๊ฑฐ๋ ๋จ๊ณ๋ฅผ ๋ฐ์ ๋์๊ฐ๊ณ ์์ง ์์ต๋๋ค. ์ฃผ๋ ๊ณผ์ ๋ ์ ํํ ๋์์ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ํํ์ `a?.b = c;`๋ฅผ ์๊ฐํด ๋ณด์ธ์.
- `a`๊ฐ `undefined`์ด๋ฉด ์ด๋ป๊ฒ ๋์ด์ผ ํ ๊น์?
- ํ ๋น์ ์กฐ์ฉํ ๋ฌด์ํด์ผ ํ ๊น์('no-op', ์๋ฌด ๋์ ์ ํจ)?
- ๋ค๋ฅธ ์ข ๋ฅ์ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ์ผ ํ ๊น์?
- ์ ์ฒด ํํ์์ด ์ด๋ค ๊ฐ์ผ๋ก ํ๊ฐ๋์ด์ผ ํ ๊น์?
์ด๋ฌํ ๋ชจํธ์ฑ๊ณผ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋์์ ๋ํ ๋ช ํํ ํฉ์ ๋ถ์ฌ๊ฐ ์ด ๊ธฐ๋ฅ์ด ์คํ๋์ง ์์ ์ฃผ๋ ์ด์ ์ ๋๋ค. ํ์ฌ๋ก์๋ ์ฐ๋ฆฌ๊ฐ ์์์ ๋ ผ์ํ ํจํด๋ค์ด ์์ ํ ์์ฑ ์์ ์ ์ฒ๋ฆฌํ๋ ํ์ค์ ์ด๊ณ ์ธ์ ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ค์ฉ์ ์ธ ์๋๋ฆฌ์ค์ ๋ชจ๋ฒ ์ฌ๋ก
์ฌ๋ฌ ํจํด์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์์ ์ ์ ํฉํ ํจํด์ ์ด๋ป๊ฒ ์ ํํ ๊น์? ์ฌ๊ธฐ ๊ฐ๋จํ ๊ฒฐ์ ๊ฐ์ด๋๊ฐ ์์ต๋๋ค.
์ธ์ ์ด๋ค ํจํด์ ์ฌ์ฉํด์ผ ํ ๊น? ๊ฒฐ์ ๊ฐ์ด๋
-
`if (obj?.path) { ... }`๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ์์ฑ์ ์์ ํ๊ณ ์ถ์ ๋.
- ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉฐ ์๋ก์ด ์ค์ฒฉ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ์ถ์ง ์์ ๋.
- ์์: ์ฌ์ฉ์์ 'lastLogin' ํ์์คํฌํ๋ฅผ ์ ๋ฐ์ดํธํ๋, 'metadata' ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ์๋ง.
-
`(obj.prop ||= {})...`๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ๊ฒฝ๋ก๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ์์ฑํ์ฌ ๊ฒฝ๋ก์ ์กด์ฌ๋ฅผ ๋ณด์ฅํ๊ณ ์ถ์ ๋.
- ์ง์ ์ ์ธ ๊ฐ์ฒด ๋ณ๊ฒฝ์ ๊ฑฐ๋ถ๊ฐ์ด ์์ ๋.
- ์์: ์ค์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋, ์์ง ํด๋น ์น์ ์ด ์์ ์ ์๋ ์ฌ์ฉ์ ํ๋กํ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ ๋.
-
`Lodash _.set`๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ๋:
- ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ ๋.
- ์๊ฒฉํ ๋ถ๋ณ์ฑ ํจํด์ ์ค์ํด์ผ ํ ๋.
- ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ํฌํจํ๋ ๋ฑ ๋ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ๋.
- ์์: Redux ๋ฆฌ๋์์์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋.
Nullish ๋ณํฉ ํ ๋น ์ฐ์ฐ์(`??=`)์ ๋ํ ์ฐธ๊ณ ์ฌํญ
`||=` ์ฐ์ฐ์์ ๊ฐ๊น์ด ์ฌ์ด์ธ Nullish ๋ณํฉ ํ ๋น ์ฐ์ฐ์(`??=`)๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. `||=`๋ ๋ชจ๋ falsy ๊ฐ(`undefined`, `null`, `false`, `0`, `''`)์ ๋ํด ์๋ํ์ง๋ง, `??=`๋ ๋ ์ ๋ฐํ์ฌ `undefined` ๋๋ `null`์ ๋ํด์๋ง ์๋ํฉ๋๋ค.
์ด ์ฐจ์ด์ ์ ์ ํจํ ์์ฑ๊ฐ์ด `0`์ด๋ ๋น ๋ฌธ์์ด์ผ ์ ์์ ๋ ์ค์ํฉ๋๋ค.
์ฝ๋ ์์: `||=`์ ํจ์
const product = { name: 'Widget', discount: 0 }; // ์ค์ ๋ ํ ์ธ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ ํ ์ธ 10์ ์ ์ฉํ๊ณ ์ถ์ต๋๋ค. product.discount ||= 10; console.log(product.discount); // ์ถ๋ ฅ: 10 (์๋ชป๋จ! ํ ์ธ์ ์๋์ ์ผ๋ก 0์ด์์)
์ฌ๊ธฐ์ `0`์ด falsy ๊ฐ์ด๋ฏ๋ก, `||=`๊ฐ ์๋ชป ๋ฎ์ด์ผ์ต๋๋ค. `??=`๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ฝ๋ ์์: `??=`์ ์ ๋ฐํจ
const product = { name: 'Widget', discount: 0 }; // ํ ์ธ์ด null ๋๋ undefined์ธ ๊ฒฝ์ฐ์๋ง ๊ธฐ๋ณธ ํ ์ธ์ ์ ์ฉํฉ๋๋ค. product.discount ??= 10; console.log(product.discount); // ์ถ๋ ฅ: 0 (์ฌ๋ฐ๋ฆ!) const anotherProduct = { name: 'Gadget' }; // discount๊ฐ undefined์ anotherProduct.discount ??= 10; console.log(anotherProduct.discount); // ์ถ๋ ฅ: 10 (์ฌ๋ฐ๋ฆ!)
๋ชจ๋ฒ ์ฌ๋ก: ๊ฐ์ฒด ๊ฒฝ๋ก๋ฅผ ์์ฑํ ๋(์ด๊ธฐ์๋ ํญ์ `undefined`์ด๋ฏ๋ก), `||=`์ `??=`๋ ์ํธ ๊ตํ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ด๋ฏธ ์กด์ฌํ ์ ์๋ ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ๋๋, `0`, `false` ๋๋ `''`์ ๊ฐ์ ์ ํจํ falsy ๊ฐ์ ์๋์น ์๊ฒ ๋ฎ์ด์ฐ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด `??=`๋ฅผ ์ ํธํ์ธ์.
๊ฒฐ๋ก : ์์ ํ๊ณ ํ๋ณต๋ ฅ ์๋ ๊ฐ์ฒด ์์ ๋ง์คํฐํ๊ธฐ
๋ค์ดํฐ๋ธ "์ต์ ๋ ์ฒด์ด๋ ํ ๋น" ์ฐ์ฐ์๊ฐ ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์ ํฌ๋ง ์ฌํญ์ผ๋ก ๋จ์์์ง๋ง, ์ด ์ธ์ด๋ ์์ ํ ์์ฑ ์์ ์ด๋ผ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋๊ตฌ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ๋๋ฝ๋ ์ฐ์ฐ์์ ๋ํ ์ด๊ธฐ ์ง๋ฌธ์ ๋์ด์ฌ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
ํต์ฌ ๋ด์ฉ์ ์์ฝํด ๋ณด๊ฒ ์ต๋๋ค:
- ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์(`?.`)๋ ์ค์ฒฉ๋ ์์ฑ์ ์ฝ๋ ๋ฐ ํ๊ธฐ์ ์ด์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ์ธ์ด ๊ตฌ๋ฌธ ๊ท์น(`lvalue` vs. `rvalue`) ๋๋ฌธ์ ํ ๋น์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ๊ฒฝ๋ก๋ง ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ, ์ต์ `if` ๋ฌธ๊ณผ ์ต์ ๋ ์ฒด์ด๋(`if (user?.profile?.address)`)์ ๊ฒฐํฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ ์ข์ ์ ๊ทผ๋ฒ์ ๋๋ค.
- ํ์์ ๊ฒฝ๋ก๋ฅผ ์ฆ์์์ ์์ฑํ์ฌ ๊ฒฝ๋ก์ ์กด์ฌ๋ฅผ ๋ณด์ฅํ๋ ๊ฒฝ์ฐ, ๋ ผ๋ฆฌ ํ ๋น ์ฐ์ฐ์(`||=` ๋๋ ๋ ์ ๋ฐํ `??=`)๊ฐ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ฅํ ๋ค์ดํฐ๋ธ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ถ๋ณ์ฑ์ ์๊ตฌํ๊ฑฐ๋ ๋งค์ฐ ๋ณต์กํ ๊ฒฝ๋ก ํ ๋น์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, Lodash์ ๊ฐ์ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์ธ์ ์ด๊ณ ๊ฒฌ๊ณ ํ ๋์์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ํจํด์ ์ดํดํ๊ณ ์ธ์ ์ ์ฉํด์ผ ํ๋์ง ์์ผ๋ก์จ, ์ฌ๋ฌ๋ถ์ ๋ ๊น๋ํ๊ณ ํ๋์ ์ผ ๋ฟ๋ง ์๋๋ผ ๋ ํ๋ณต๋ ฅ ์๊ณ ๋ฐํ์ ์ค๋ฅ๊ฐ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฌด๋ฆฌ ์ค์ฒฉ๋๊ฑฐ๋ ์์ธก ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๋ ์์ ์๊ฒ ์ฒ๋ฆฌํ๊ณ , ์ค๊ณ๋ถํฐ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.