๊ณ ์ ํ๊ณ ๋ถ๋ณํ๋ ์์ฑ ํค๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ JavaScript Symbol API๋ฅผ ์ดํด๋ณด์ธ์. ํ๋์ ์ด๊ณ ๊ฒฌ๊ณ ํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ ๋๋ค.
JavaScript Symbol API: ๊ฐ๋ ฅํ ์ฝ๋ ์์ฑ์ ์ํ ๊ณ ์ ํ ์์ฑ ํค ๊ณต๊ฐ
JavaScript๊ฐ ๋์์์ด ์งํํ๋ ์ํฉ์์ ๊ฐ๋ฐ์๋ ๋ ๊ฐ๋ ฅํ๊ณ , ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋์์์ด ์ฐพ๊ณ ์์ต๋๋ค. ECMAScript 2015(ES6)์ ํจ๊ป ๋์ ๋ ํ๋ JavaScript์ ๊ฐ์ฅ ์ค์ํ ๋ฐ์ ์ค ํ๋๋ Symbol API์ ๋๋ค. ์ฌ๋ณผ์ ๊ณ ์ ํ๊ณ ๋ถ๋ณํ๋ ์์ฑ ํค๋ฅผ ์์ฑํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, ์ฐ๋ฐ์ ์ธ ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์ง๋ถํฐ ๋ด๋ถ ๊ฐ์ฒด ์ํ ๊ด๋ฆฌ๊น์ง, ์ ์ธ๊ณ ๊ฐ๋ฐ์๊ฐ ์ง๋ฉดํ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ JavaScript Symbol API์ ๋ณต์ก์ฑ์ ์์ธํ ์ดํด๋ณด๊ณ , ์ฌ๋ณผ์ด ๋ฌด์์ด๊ณ , ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ค๋ช ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ค๋ฃจ๊ณ , ๊ธ๋ก๋ฒ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ณ , ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํ๊ธฐ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
JavaScript ์ฌ๋ณผ์ด๋ ๋ฌด์์ ๋๊น?
ํต์ฌ์ ์ผ๋ก JavaScript Symbol์ ๋ฌธ์์ด, ์ซ์ ๋๋ ๋ถ์ธ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๊ธฐ๋ณธ ์ ํ๊ณผ ๋ฌ๋ฆฌ ์ฌ๋ณผ์ ๊ณ ์ ํ๊ณ ๋ถ๋ณํ๋ ๊ฒ์ผ๋ก ๋ณด์ฅ๋ฉ๋๋ค. ์ฆ, ์์ฑ๋ ๊ฐ ์ฌ๋ณผ์ ์ค๋ช ์ด ๋์ผํ๊ฒ ์์ฑ๋๋๋ผ๋ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋ณผ๊ณผ ๋ณธ์ง์ ์ผ๋ก ๊ตฌ๋ณ๋ฉ๋๋ค.
์ฌ๋ณผ์ ๊ณ ์ ์๋ณ์๋ก ์๊ฐํ ์ ์์ต๋๋ค. ์ฌ๋ณผ์ ์์ฑํ ๋ ์ ํ์ ์ผ๋ก ๋ฌธ์์ด ์ค๋ช ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด ์ค๋ช ์ ์ฃผ๋ก ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์ฌ๋ณผ์ ๊ณ ์ ์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ฌ๋ณผ์ ์ฃผ์ ๋ชฉ์ ์ ๊ฐ์ฒด์ ์์ฑ ํค๋ก ์ฌ์ฉ๋์ด ๊ธฐ์กด ๋๋ ๋ฏธ๋์ ์์ฑ, ํนํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ์์ ์ถ๊ฐํ ์์ฑ๊ณผ ์ถฉ๋ํ์ง ์๋ ํค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ฌ๋ณผ์ ์์ฑํ๋ ๊ตฌ๋ฌธ์ ๊ฐ๋จํฉ๋๋ค.
const mySymbol = Symbol();
const anotherSymbol = Symbol('My unique identifier');
Symbol()์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ฉด, ๋์ผํ ์ค๋ช
์ ์ฌ์ฉํ๋๋ผ๋ ํญ์ ์๋กญ๊ณ ๊ณ ์ ํ ์ฌ๋ณผ์ด ์์ฑ๋ฉ๋๋ค.
const sym1 = Symbol('description');
const sym2 = Symbol('description');
console.log(sym1 === sym2); // Output: false
์ด๋ฌํ ๊ณ ์ ์ฑ์ Symbol API ์ ํธ๋ฆฌํฐ์ ์ด์์ ๋๋ค.
์ ์ฌ๋ณผ์ ์ฌ์ฉํด์ผ ํ ๊น์? ์ผ๋ฐ์ ์ธ JavaScript ๋ฌธ์ ํด๊ฒฐ
JavaScript์ ๋์ ํน์ฑ์ ์ ์ฐํ์ง๋ง ๋๋ก๋ ํนํ ๊ฐ์ฒด ์์ฑ ์ด๋ฆ ์ง์ ๊ณผ ๊ด๋ จํ์ฌ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฌ๋ณผ ์ด์ ์๋ ๊ฐ๋ฐ์๊ฐ ์์ฑ ํค๋ก ๋ฌธ์์ด์ ์์กดํ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ฅ์ ์ด์ง๋ง ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ ์ํ์ต๋๋ค.
- ์์ฑ ์ด๋ฆ ์ถฉ๋: ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฝ๋ ์กฐ๊ฐ์ด ๋์ผํ ๊ฐ์ฒด์ ๋์ผํ ๋ฌธ์์ด ํค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์ ์ ์ํ๋ ค๊ณ ์๋ํ ์ํ์ด ํญ์ ์์ต๋๋ค. ์ด๋ ์๋ํ์ง ์์ ๋ฎ์ด์ฐ๊ธฐ๋ก ์ด์ด์ง ์ ์์ผ๋ฉฐ, ์ด๋ ์ข ์ข ์ถ์ ํ๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํฉ๋๋ค.
- ๊ณต๊ฐ vs. ๋น๊ณต๊ฐ ์์ฑ: JavaScript๋ ์ญ์ฌ์ ์ผ๋ก ์ง์ ํ ๋น๊ณต๊ฐ ์์ฑ ๋ฉ์ปค๋์ฆ์ด ๋ถ์กฑํ์ต๋๋ค. ๋ฐ์ค(
_propertyName)๋ก ์์ฑ ์ด๋ฆ์ ์ ๋์ฌ๋ก ์ง์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ท์น์ด ์๋๋ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋์์ง๋ง, ์ด๋ ์์ ํ ๊ด๋ก์ ์ด๋ฉฐ ์ฝ๊ฒ ์ฐํ๋์์ต๋๋ค. - ๊ธฐ๋ณธ ์ ๊ณต ๊ฐ์ฒด ํ์ฅ:
Array๋๋Object์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๊ณต JavaScript ๊ฐ์ฒด๋ฅผ ์ ๋ฉ์๋ ๋๋ ๋ฌธ์์ด ํค๊ฐ ์๋ ์์ฑ์ ์ถ๊ฐํ์ฌ ์์ ํ๊ฑฐ๋ ํ์ฅํ๋ฉด, ๋ฏธ๋์ JavaScript ๋ฒ์ ๋๋ ๋์ผํ ์์ ์ ์ํํ์ ์ ์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถฉ๋ํ ์ ์์ต๋๋ค.
Symbol API๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ์ฐ์ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
1. ์์ฑ ์ด๋ฆ ์ถฉ๋ ๋ฐฉ์ง
์ฌ๋ณผ์ ์์ฑ ํค๋ก ์ฌ์ฉํ๋ฉด ์ด๋ฆ ์ถฉ๋์ ์ํ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๊ฐ ์ฌ๋ณผ์ ๊ณ ์ ํ๋ฏ๋ก, ์ฌ๋ณผ ํค๋ก ์ ์๋ ๊ฐ์ฒด ์์ฑ์ ๋์ผํ ์ค๋ช ๋ฌธ์์ด์ ์ฌ์ฉํ๋๋ผ๋ ๋ค๋ฅธ ์์ฑ๊ณผ ์ ๋ ์ถฉ๋ํ์ง ์์ต๋๋ค. ์ด๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๊ฑฐ๋, ์๋ก ๋ค๋ฅธ ์ง๋ฆฌ์ ์์น์ ํ์์ ๋๊ท๋ชจ ํ์ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฌ์ฉ์ ํ๋กํ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ถํ๊ณ ์ฌ์ฉ์ ID์ ๋ํ ์์ฑ๋ ์ ์ํ ์ ์๋ ํ์ฌ ์ธ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ฌ๋ณผ์ ์ฌ์ฉํ๋ฉด ์์ฑ์ด ๊ณ ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
// Your code
const userIdKey = Symbol('userIdentifier');
const user = {
name: 'Anya Sharma',
[userIdKey]: 'user-12345'
};
// Third-party library (hypothetical)
const authIdKey = Symbol('userIdentifier'); // Another unique symbol, despite same description
const authInfo = {
[authIdKey]: 'auth-xyz789'
};
// Merging data (or placing authInfo within user)
const combinedUser = { ...user, ...authInfo };
console.log(combinedUser[userIdKey]); // Output: 'user-12345'
console.log(combinedUser[authIdKey]); // Output: 'auth-xyz789'
// Even if the library used the same string description:
const anotherAuthIdKey = Symbol('userIdentifier');
console.log(userIdKey === anotherAuthIdKey); // Output: false
์ด ์์์ user์ ๊ฐ์์ ์ธ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ 'userIdentifier' ์ค๋ช
์ ์ฌ์ฉํ์ฌ ์ฌ๋ณผ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์์ฑ์ด ์๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค. ์ด๋ ์ํธ ์ด์ฉ์ฑ์ ๋์ด๊ณ , ์ข
์ข
์ฝ๋๋ฒ ์ด์ค๊ฐ ํตํฉ๋๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ค์ํ ๋ฏธ๋ฌํ๊ณ ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ์ ๊ฐ๋ฅ์ฑ์ ์ค์
๋๋ค.
2. ๋น๊ณต๊ฐ์ ์ ์ฌํ ์์ฑ ๊ตฌํ
JavaScript์๋ ์ด์ ์ค์ ๋น๊ณต๊ฐ ํด๋์ค ํ๋(# ์ ๋์ฌ ์ฌ์ฉ)๊ฐ ์์ง๋ง, ์ฌ๋ณผ์ ํนํ ๋นํด๋์ค ์ปจํ
์คํธ์์ ๋๋ ๋ณด๋ค ์ ์ด๋ ํํ์ ์บก์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ฒด ์์ฑ์ ๋ํด ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๋ณผ๋ก ํค๊ฐ ์ง์ ๋ ์์ฑ์ Object.keys() ๋๋ for...in ๋ฃจํ์ ๊ฐ์ ํ์ค ๋ฐ๋ณต ๋ฐฉ๋ฒ์ ํตํด ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ธ๋ถ ์ฝ๋์์ ์ง์ ์ก์ธ์คํ๊ฑฐ๋ ์์ ํด์๋ ์ ๋๋ ๋ด๋ถ ์ํ ๋๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ด์์ ์
๋๋ค.
๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ด์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ๊ตฌ์ฑ ๋๋ ๋ด๋ถ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ฌ๋ณผ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด ๊ฐ์ฒด์ ๊ณต๊ฐ ์ธํฐํ์ด์ค์์ ์จ๊ฒจ์ง๋๋ค.
const configKey = Symbol('internalConfig');
const applicationState = {
appName: 'GlobalConnect',
version: '1.0.0',
[configKey]: {
databaseUrl: 'mongodb://globaldb.com/appdata',
apiKey: 'secret-key-for-global-access'
}
};
// Attempting to access config using string keys will fail:
console.log(applicationState['internalConfig']); // Output: undefined
// Accessing via the symbol works:
console.log(applicationState[configKey]); // Output: { databaseUrl: '...', apiKey: '...' }
// Iterating over keys will not reveal the symbol property:
console.log(Object.keys(applicationState)); // Output: ['appName', 'version']
console.log(Object.getOwnPropertyNames(applicationState)); // Output: ['appName', 'version']
์ด ์บก์ํ๋ ํนํ ๋ช ํ์ฑ๊ณผ ์ ์ด๋ ์ก์ธ์ค๊ฐ ๊ฐ์ฅ ์ค์ํ ๋ถ์ฐ ํ์์ ๊ฐ๋ฐํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ๋ฐ ๋ ผ๋ฆฌ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
3. ๊ธฐ๋ณธ ์ ๊ณต ๊ฐ์ฒด ์์ ํ๊ฒ ํ์ฅ
์ฌ๋ณผ์ ์ฌ์ฉํ๋ฉด ๋ฏธ๋์ ๊ธฐ๋ณธ ์์ฑ ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถฉ๋ํ ์ผ๋ ค ์์ด Array, Object ๋๋ String๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์ ๊ณต JavaScript ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋ ๋๋ ๋ฏธ๋์ ์ธ์ด ์
๋ฐ์ดํธ๋ฅผ ์์์ํค์ง ์๋ ๋ฐฉ์์ผ๋ก ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋์์ ํ์ฅํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด Array ํ๋กํ ํ์
์ ์ฌ์ฉ์ ์ง์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฌ๋ณผ์ ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
const arraySumSymbol = Symbol('sum');
Array.prototype[arraySumSymbol] = function() {
return this.reduce((acc, current) => acc + current, 0);
};
const numbers = [10, 20, 30, 40];
console.log(numbers[arraySumSymbol]()); // Output: 100
// This custom 'sum' method won't interfere with native Array methods or other libraries.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค์ํ ํ๋ก์ ํธ ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ด๋ฒ์ํ๊ฒ ์๋นํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ๋ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ธ ํ์ฅ์ด ๊ฒฉ๋ฆฌ๋๊ณ ์์ ํ๊ฒ ์ ์ง๋๋๋ก ํฉ๋๋ค.
์ฃผ์ Symbol API ๊ธฐ๋ฅ ๋ฐ ๋ฉ์๋
Symbol API๋ ์ฌ๋ณผ๋ก ์์ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. Symbol.for() ๋ฐ Symbol.keyFor(): ๊ธ๋ก๋ฒ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ
Symbol()์ผ๋ก ์์ฑ๋ ์ฌ๋ณผ์ ๊ณ ์ ํ๊ณ ๊ณต์ ๋์ง ์์ง๋ง, Symbol.for() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธ๋ก๋ฒ, ์์ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ์์ ์ฌ๋ณผ์ ์์ฑํ๊ฑฐ๋ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด๋ ์๋ก ๋ค๋ฅธ ์คํ ์ปจํ
์คํธ(์: iframe, ์น ์์
์)์์ ์ฌ๋ณผ์ ๊ณต์ ํ๊ฑฐ๋ ํน์ ์๋ณ์๊ฐ ์๋ ์ฌ๋ณผ์ด ํญ์ ๋์ผํ ์ฌ๋ณผ์ธ์ง ํ์ธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
Symbol.for(key):
- ์ง์ ๋ ๋ฌธ์์ด
key๊ฐ ์๋ ์ฌ๋ณผ์ด ์ด๋ฏธ ๋ ์ง์คํธ๋ฆฌ์ ์์ผ๋ฉด ํด๋น ์ฌ๋ณผ์ ๋ฐํํฉ๋๋ค. - ์ง์ ๋
key๊ฐ ์๋ ์ฌ๋ณผ์ด ์์ผ๋ฉด ์ ์ฌ๋ณผ์ ์์ฑํ๊ณ , ์ด๋ฅผ ๋ ์ง์คํธ๋ฆฌ์key์ ์ฐ๊ฒฐํ๊ณ , ์ ์ฌ๋ณผ์ ๋ฐํํฉ๋๋ค.
Symbol.keyFor(sym):
- ์ฌ๋ณผ
sym์ ์ธ์๋ก ์ฌ์ฉํ์ฌ ๊ธ๋ก๋ฒ ๋ ์ง์คํธ๋ฆฌ์์ ์ฐ๊ฒฐ๋ ๋ฌธ์์ด ํค๋ฅผ ๋ฐํํฉ๋๋ค. Symbol.for()์ ์ฌ์ฉํ์ฌ ์ฌ๋ณผ์ด ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ(์ฆ, ๋ก์ปฌ๋ก ์์ฑ๋ ์ฌ๋ณผ์)undefined๋ฅผ ๋ฐํํฉ๋๋ค.
์์:
// Create a symbol using Symbol.for()
const globalAuthToken = Symbol.for('authToken');
// In another part of your application or a different module:
const anotherAuthToken = Symbol.for('authToken');
console.log(globalAuthToken === anotherAuthToken); // Output: true
// Get the key for the symbol
console.log(Symbol.keyFor(globalAuthToken)); // Output: 'authToken'
// A locally created symbol won't have a key in the global registry
const localSymbol = Symbol('local');
console.log(Symbol.keyFor(localSymbol)); // Output: undefined
์ด ๊ธ๋ก๋ฒ ๋ ์ง์คํธ๋ฆฌ๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋์ด ๋์ผํ ๊ธฐํธ ์๋ณ์๋ฅผ ์ฐธ์กฐํด์ผ ํ ์ ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ๋๋ ๋ณต์กํ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์์ ํนํ ์ ์ฉํฉ๋๋ค.
2. ์ ์๋ ค์ง ์ฌ๋ณผ
JavaScript๋ ์ ์๋ ค์ง ์ฌ๋ณผ์ด๋ผ๊ณ ํ๋ ์ผ๋ จ์ ๊ธฐ๋ณธ ์ ๊ณต ์ฌ๋ณผ์ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ์ฌ๋ณผ์ JavaScript์ ๊ธฐ๋ณธ ์ ๊ณต ๋์์ ์ฐ๊ฒฐํ์ฌ ๊ฐ์ฒด ์ํธ ์์ฉ์ ์ฌ์ฉ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์ ์๋ ค์ง ์ฌ๋ณผ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ํน์ ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด ๋ฐ๋ณต, ๋ฌธ์์ด ๋ณํ ๋๋ ์์ฑ ์ก์ธ์ค์ ๊ฐ์ ์ธ์ด ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ์ดํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ์๋ ค์ง ์ฌ๋ณผ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Symbol.iterator: ๊ฐ์ฒด์ ๊ธฐ๋ณธ ๋ฐ๋ณต ๋์์ ์ ์ํฉ๋๋ค.for...of๋ฃจํ ๋๋ ์คํ๋ ๋ ๊ตฌ๋ฌธ(...)๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ด ์ฌ๋ณผ๊ณผ ๊ด๋ จ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฐ๋ณต๊ธฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.Symbol.toStringTag: ๊ฐ์ฒด์ ๊ธฐ๋ณธtoString()๋ฉ์๋์์ ๋ฐํ๋๋ ๋ฌธ์์ด์ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ง์ ๊ฐ์ฒด ์ ํ ์๋ณ์ ์ ์ฉํฉ๋๋ค.Symbol.toPrimitive: ํ์ํ ๋(์: ์ฐ์ ์ฐ์ฐ ์ค) ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๋ณํ๋๋ ๋ฐฉ์์ ๊ฐ์ฒด๊ฐ ์ ์ํ ์ ์์ต๋๋ค.Symbol.hasInstance:instanceof์ฐ์ฐ์๊ฐ ๊ฐ์ฒด๊ฐ ์์ฑ์์ ์ธ์คํด์ค์ธ์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.Symbol.unscopables:with๋ฌธ์ ๋ฒ์๋ฅผ ๋ง๋ค ๋ ์ ์ธํด์ผ ํ๋ ์์ฑ ์ด๋ฆ ๋ฐฐ์ด์ ๋๋ค.
Symbol.iterator์ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const dataFeed = {
data: [10, 20, 30, 40, 50],
index: 0,
[Symbol.iterator]() {
const data = this.data;
const lastIndex = data.length;
let currentIndex = this.index;
return {
next: () => {
if (currentIndex < lastIndex) {
const value = data[currentIndex];
currentIndex++;
return { value: value, done: false };
} else {
return { done: true };
}
}
};
}
};
// Using the for...of loop with a custom iterable object
for (const item of dataFeed) {
console.log(item); // Output: 10, 20, 30, 40, 50
}
// Using spread syntax
const itemsArray = [...dataFeed];
console.log(itemsArray); // Output: [10, 20, 30, 40, 50]
์ ์๋ ค์ง ์ฌ๋ณผ์ ๊ตฌํํ๋ฉด ์ฌ์ฉ์ ์ง์ ๊ฐ์ฒด๊ฐ ๋ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์๋ํ๊ณ ํต์ฌ JavaScript ์ธ์ด ๊ธฐ๋ฅ๊ณผ ์ํํ๊ฒ ํตํฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ง์ ์ผ๋ก ๊ธ๋ก๋ฒํ๊ฒ ํธํ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค.
3. ์ฌ๋ณผ ์ก์ธ์ค ๋ฐ ๋ฐ์ฌ
์ฌ๋ณผ ํค๊ฐ ์ง์ ๋ ์์ฑ์ Object.keys()์ ๊ฐ์ ๋ฉ์๋์์ ๋
ธ์ถ๋์ง ์์ผ๋ฏ๋ก, ์ด์ ์ก์ธ์คํ๋ ค๋ฉด ํน์ ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค.
Object.getOwnPropertySymbols(obj): ์ง์ ๋ ๊ฐ์ฒด์์ ์ง์ ์ฐพ์ ๋ชจ๋ ๊ณ ์ ์ฌ๋ณผ ์์ฑ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.Reflect.ownKeys(obj): ์ง์ ๋ ๊ฐ์ฒด์ ๋ชจ๋ ๊ณ ์ ์์ฑ ํค(๋ฌธ์์ด ๋ฐ ์ฌ๋ณผ ํค)์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ชจ๋ ํค๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฐ์ฅ ํฌ๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
์์:
const sym1 = Symbol('a');
const sym2 = Symbol('b');
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
regularProp: 'stringValue'
};
// Using Object.getOwnPropertySymbols()
const symbolKeys = Object.getOwnPropertySymbols(obj);
console.log(symbolKeys); // Output: [Symbol(a), Symbol(b)]
// Accessing values using the retrieved symbols
symbolKeys.forEach(sym => {
console.log(`${sym.toString()}: ${obj[sym]}`);
});
// Output:
// Symbol(a): value1
// Symbol(b): value2
// Using Reflect.ownKeys()
const allKeys = Reflect.ownKeys(obj);
console.log(allKeys); // Output: ['regularProp', Symbol(a), Symbol(b)]
์ด๋ฌํ ๋ฉ์๋๋ ๊ฐ์ฒด์ ์์ฑ์ด ์ด๋ป๊ฒ ์ ์๋์๋์ง์ ๊ด๊ณ์์ด ๊ฐ์ฒด๋ฅผ ์ฒ ์ ํ๊ฒ ๊ฒ์ฌํ ์ ์๋๋ก ํ์ฌ ๋ด์ฑ ๋ฐ ๋๋ฒ๊น ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ํ ์ค์ ์ฌ์ฉ ์ฌ๋ก
Symbol API๋ ๋จ์ํ ์ด๋ก ์ ๊ฐ๋ ์ด ์๋๋ผ ๊ตญ์ ํ๋ก์ ํธ์์ ์์ ํ๋ ๊ฐ๋ฐ์์๊ฒ ์ค์ง์ ์ธ ์ด์ ์ด ์์ต๋๋ค.
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ ๋ฐ ์ํธ ์ด์ฉ์ฑ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ๋ ์ฌ์ฉ์ ์ฝ๋ ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋ด๋ถ ๊ตฌ์ฑ, ์ด๋ฒคํธ ์ด๋ฆ ๋๋ ๋ ์ ๋ฉ์๋์ ์ฌ๋ณผ์ ์ฌ์ฉํ๋ฉด ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ ์ํ ๊ด๋ฆฌ ๋๋ ์ฌ์ฉ์ ์ง์ ๋๊ตฌ ์ค๋ช ๋ ๋๋ง ๊ธฐ๋ฅ์ ์ฌ๋ณผ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ๊ตฌํํ ์ ์๋ ์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ์ ์ถฉ๋ํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
2. ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ด๋ฆฌ
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ Redux, Vuex ๋๋ ์ฌ์ฉ์ ์ง์ ์๋ฃจ์ ๊ณผ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ณผ์ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ์์ ์ ํ ๋๋ ์ํ ํค๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ค ์์ธก ๊ฐ๋ฅํ๊ณ ์ค๋ฅ๊ฐ ์ ๊ฒ ๋ง๋ค ์ ์์ผ๋ฉฐ, ํ์ด ์๋ก ๋ค๋ฅธ ์๊ฐ๋์ ๋ถ์ฐ๋์ด ์๊ณ ํ์ ์ด ์ ์ ์๋ ์ธํฐํ์ด์ค์ ํฌ๊ฒ ์์กดํ๋ ๊ฒฝ์ฐ ์๋นํ ์ด์ ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์์ ์๋ก ๋ค๋ฅธ ๋ชจ๋(์ฌ์ฉ์ ๊ณ์ , ์ ํ ์นดํ๋ก๊ทธ, ์ฅ๋ฐ๊ตฌ๋ ๊ด๋ฆฌ)์ด ์์ฒด ์์
์ ํ์ ์ ์ํ ์ ์์ต๋๋ค. ์ฌ๋ณผ์ ์ฌ์ฉํ๋ฉด ์ฅ๋ฐ๊ตฌ๋ ๋ชจ๋์ 'ADD_ITEM'๊ณผ ๊ฐ์ ์์
์ด ๋ค๋ฅธ ๋ชจ๋์์ ์ ์ฌํ๊ฒ ๋ช
๋ช
๋ ์์
๊ณผ ์ค์๋ก ์ถฉ๋ํ์ง ์๋๋ก ํฉ๋๋ค.
// Cart module
const ADD_ITEM_TO_CART = Symbol('cart/ADD_ITEM');
// Wishlist module
const ADD_ITEM_TO_WISHLIST = Symbol('wishlist/ADD_ITEM');
function reducer(state, action) {
switch (action.type) {
case ADD_ITEM_TO_CART:
// ... handle adding to cart
return state;
case ADD_ITEM_TO_WISHLIST:
// ... handle adding to wishlist
return state;
default:
return state;
}
}
3. ๊ฐ์ฒด ์งํฅ ํจํด ํฅ์
์ฌ๋ณผ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ๋ํ ๊ณ ์ ์๋ณ์๋ฅผ ๊ตฌํํ๊ณ , ๋ด๋ถ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋, ๊ฐ์ฒด ํ๋กํ ์ฝ์ ๋ํ ์ฌ์ฉ์ ์ง์ ๋์์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋์์ธ ํจํด์ ๊ตฌํํ๊ณ , ์๊ฒฉํ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์ ์ฉํ์ง ์๋ ์ธ์ด์์๋ ๋ ๊ฐ๋ ฅํ ๊ฐ์ฒด ์งํฅ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค.
์ผ๋ จ์ ๊ตญ์ ํตํ ๊ฐ์ฒด๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๊ฐ ๊ฐ์ฒด์๋ ์ง์ ์กฐ์ํด์๋ ์ ๋๋ ๊ณ ์ ํ ๋ด๋ถ ํตํ ์ฝ๋๊ฐ ์์ ์ ์์ต๋๋ค.
const CURRENCY_CODE = Symbol('currencyCode');
class Currency {
constructor(code, name) {
this[CURRENCY_CODE] = code;
this.name = name;
}
getCurrencyCode() {
return this[CURRENCY_CODE];
}
}
const usd = new Currency('USD', 'United States Dollar');
const eur = new Currency('EUR', 'Euro');
console.log(usd.getCurrencyCode()); // Output: USD
// console.log(usd[CURRENCY_CODE]); // Also works, but getCurrencyCode provides a public method
console.log(Object.keys(usd)); // Output: ['name']
console.log(Object.getOwnPropertySymbols(usd)); // Output: [Symbol(currencyCode)]
4. ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n)
์ฌ๋ฌ ์ธ์ด์ ์ง์ญ์ ์ง์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ณผ์ ์ฌ์ฉํ์ฌ ๋ฒ์ญ ๋ฌธ์์ด ๋๋ ๋ก์บ๋ณ ๊ตฌ์ฑ์ ์ํ ๊ณ ์ ํค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฌํ ๋ด๋ถ ์๋ณ์๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋๊ณ ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ผ๋ฆฌ์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ์ถฉ๋ํ์ง ์๋๋ก ํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ฌ๋ณผ์ ๋งค์ฐ ์ ์ฉํ์ง๋ง, ํจ๊ณผ์ ์ธ ์ฌ์ฉ์ ์ํด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๊ธ๋ก๋ฒ๋ก ๊ณต์ ๋๋ ์ฌ๋ณผ์๋
Symbol.for()์ฌ์ฉ: ์๋ก ๋ค๋ฅธ ๋ชจ๋ ๋๋ ์คํ ์ปจํ ์คํธ์์ ์์ ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ์ฌ๋ณผ์ด ํ์ํ ๊ฒฝ์ฐ,Symbol.for()๋ฅผ ํตํด ๊ธ๋ก๋ฒ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ๋ก์ปฌ ๊ณ ์ ์ฑ์ ์ํด์๋
Symbol()์ ํธ: ๊ฐ์ฒด ๋๋ ํน์ ๋ชจ๋์๋ง ํด๋น๋๊ณ ์ ์ญ์ผ๋ก ๊ณต์ ํ ํ์๊ฐ ์๋ ์์ฑ์ ๊ฒฝ์ฐSymbol()์ ์ฌ์ฉํ์ฌ ์์ฑํฉ๋๋ค. - ์ฌ๋ณผ ์ฌ์ฉ๋ ๋ฌธ์ํ: ์ฌ๋ณผ ์์ฑ์ ํ์ค ๋ฐ๋ณต์ผ๋ก ๊ฒ์ํ ์ ์์ผ๋ฏ๋ก, ํนํ ๊ณต๊ฐ API ๋๋ ๊ณต์ ์ฝ๋์์ ์ด๋ค ์ฌ๋ณผ์ด ์ด๋ค ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋์ง ๋ฌธ์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ง๋ ฌํ์ ์ ์: ํ์ค JSON ์ง๋ ฌํ(
JSON.stringify())๋ ์ฌ๋ณผ ์์ฑ์ ๋ฌด์ํฉ๋๋ค. ์ฌ๋ณผ ์์ฑ์ ํฌํจํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ ์ง์ ์ง๋ ฌํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๊ฑฐ๋ ์ง๋ ฌํ ์ ์ ์ฌ๋ณผ ์์ฑ์ ๋ฌธ์์ด ์์ฑ์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค. - ์ ์๋ ค์ง ์ฌ๋ณผ์ ์ ์ ํ๊ฒ ์ฌ์ฉ: ์ ์๋ ค์ง ์ฌ๋ณผ์ ํ์ฉํ์ฌ ํ์ค์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด ๋์์ ์ฌ์ฉ์ ์ง์ ํ์ฌ JavaScript ์ํ๊ณ์์ ์ํธ ์ด์ฉ์ฑ์ ํฅ์์ํต๋๋ค.
- ์ฌ๋ณผ ๊ณผ๋ ์ฌ์ฉ ๋ฐฉ์ง: ๊ฐ๋ ฅํ์ง๋ง ์ฌ๋ณผ์ ๊ณ ์ ์ฑ๊ณผ ์บก์ํ๊ฐ ์ค์ํ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. ๋ถํ์ํ๊ฒ ๋ชจ๋ ๋ฌธ์์ด ํค๋ฅผ ์ฌ๋ณผ๋ก ๋ฐ๊พธ์ง ๋ง์ธ์. ๋จ์ํ ๊ฒฝ์ฐ์๋ ๊ฐ๋ ์ฑ์ด ์ ํ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
JavaScript Symbol API๋ ์ธ์ด์ ์ถ๊ฐ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก, ๊ณ ์ ํ๊ณ ๋ถ๋ณํ๋ ์์ฑ ํค๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๋ณผ์ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์์ฑ ์ด๋ฆ ์ถฉ๋๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์งํ๊ณ , ๋ ๋์ ์บก์ํ๋ฅผ ๋ฌ์ฑํ์ฌ ๋์ฑ ํ๋ ฅ์ ์ด๊ณ , ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ์ ๊ฒฝ์ฐ, ๋ช ํํ ์๋ณ์๋ฅผ ์์ฑํ๊ณ ๊ฐ์ญ ์์ด ๋ด๋ถ ๊ฐ์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ , ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ , ๋จ์ํ ๋ ๊นจ๋ํ๊ณ ์์ธก ๊ฐ๋ฅํ JavaScript๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ , ๋๊ตฌ ํคํธ์ ์ฌ๋ณผ์ ํตํฉํ๋ฉด ์์ฌํ ์ฌ์ง ์์ด ๋์ฑ ๊ฐ๋ ฅํ๊ณ ๊ธ๋ก๋ฒํ๊ฒ ํธํ๋๋ ์๋ฃจ์ ์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค. JavaScript ๊ฐ๋ฐ ๋ฐฉ์์ ํฅ์์ํค๊ธฐ ์ํด ์ฌ๋ณผ์ ๊ณ ์ ์ฑ๊ณผ ๊ฐ๋ ฅํจ์ ํ์ฉํ์ธ์.