ë³µì¡í ì¹ ì í늬ìŒìŽì ìì 늬ìì€ ì ê·Œì êŽëЬíê³ ì¬ì©ì 겜íì ìµì ííë ì êµí ì ê·Œ ë°©ììž íë¡ ížìë ì¹ ëœ ì°ì ìì íì ê°ë ì ìŽíŽë³Žìžì. ìë ë°©ì, ìŽì , 구í ì ëµì ììëŽ ëë€.
íë¡ ížìë ì¹ ëœ ì°ì ìì í: í¥ìë ì¬ì©ì 겜íì ìí 늬ìì€ ì ê·Œ ìì ì§ì
íë íë¡ ížìë ì¹ ê°ë°ì ìììì ì í늬ìŒìŽì ì ì ì ë ë³µì¡íŽì§ê³ ììŒë©°, ì¢ ì¢ ìë§ì ë¹ëêž° ìì , ëì ìì ë° ê³µì 늬ìì€ë¥Œ í¬íší©ëë€. ìŽë¬í 늬ìì€ë¥Œ íšìšì ìŒë¡ êŽëЬíê³ ì¶©ëì ë°©ì§íë ê²ì ìííê³ ë°ììŽ ë¹ ë¥ž ì¬ì©ì 겜íì ì ì§íë ë° ë§€ì° ì€ìí©ëë€. ë°ë¡ ìŽ ì§ì ìì íë¡ ížìë ì¹ ëœ ì°ì ìì í(Frontend Web Lock Priority Queue)ëŒë ê°ë ìŽ ë±ì¥í©ëë€. ìŽë ìœëì ìê³ êµ¬ì(critical section)ì ëí ì ê·Œì ì ìŽíê³ , ìì ìŽ ì°ì ììì ë°ëŒ í¹ì ììë¡ ì€íëëë¡ ë³Žì¥íì¬ ëŠ¬ìì€ íì©ì ìµì ííê³ ì í늬ìŒìŽì ì±ë¥ì í¥ììí€ë ë©ì»€ëìŠì ì ê³µí©ëë€.
íë¡ ížìë ê°ë°ìì 늬ìì€ êŽëЬì íìì± ìŽíŽíêž°
ì¹ ì í늬ìŒìŽì ì ì¬ë¬ 컎í¬ëížê° ëìŒí ê³µì ë°ìŽí°ì ì ê·Œíê³ ìì íŽìŒ íë ìë늬ì€ë¥Œ ìê°íŽ ë³Žììì€. ì ì í ëêž°í ë©ì»€ëìŠìŽ ìë€ë©Ž, 겜ì 조걎(race condition)ìŽ ë°ìíì¬ ë°ìŽí° ë¶ìŒì¹ì ìêž°ì¹ ìì ëìì ìŽëí ì ììµëë€. ì륌 ë€ìŽ, ë 컎í¬ëížê° ëìì ì¬ì©ì íë¡íì ì ë°ìŽížíë€ê³ ììíŽ ë³Žììì€. ìŽë¬í ìì ìŽ ì ëë¡ ì¡°ì ëì§ ììŒë©Ž í ì ë°ìŽížê° ë€ë¥ž ì ë°ìŽížë¥Œ ë®ìŽìš ë°ìŽí° ìì€ìŽ ë°ìí ì ììµëë€. ë§ì°¬ê°ì§ë¡, ì¬ë¬ ë¹ëêž° ìì²ìŽ ëìŒí API ìëí¬ìžížìì ë°ìŽí°ë¥Œ ê°ì žì€ë 겜ì°ë¥Œ ìê°íŽ ë³Žììì€. APIì ìíŽ ìë ì íìŽë ì ê·Œ ì íìŽ ì ì©ë ì ììŒë¯ë¡, ì íì ìŽê³Œíê³ ì€ë¥ë¥Œ ìŒìŒí€ë ê²ì íŒíêž° ìíŽ ëì ìì²ì êŽëЬíë ê²ìŽ ì€ìí©ëë€.
뮀í ì€(mutex)ë ìžë§í¬ìŽ(semaphore)ì ê°ì ì íµì ìž ëìì± êŽëЬ ì ê·Œ ë°©ìì ë°±ìë ê°ë°ìì ìŒë°ì ìŒë¡ ì¬ì©ë©ëë€. ê·žë¬ë ìŽë¬í ê°ë ì íë¡ ížìë í겜ì ì§ì 구ííë ê²ì ìë°ì€í¬ëŠœížì ëšìŒ ì€ë ë í¹ì±ê³Œ ë¹ëêž° ì€í 몚ëžë¡ ìžíŽ ë í¹í ìŽë €ìì ìŒêž°í©ëë€. ë°ë¡ ìŽ ì§ì ìì íë¡ ížìë ì¹ ëœ ì°ì ìì íê° ê·ì€í ëêµ¬ê° ë©ëë€.
íë¡ ížìë ì¹ ëœ ì°ì ìì íë 묎ììžê°?
íë¡ ížìë ì¹ ëœ ì°ì ìì íë ê°ë°ìê° ì°ì ììê° ì§ì ë ëœ ë©ì»€ëìŠì 구ííì¬ ì¹ ì í늬ìŒìŽì ì ê³µì 늬ìì€ì ëí ì ê·Œì êŽëЬí ì ìê² íŽì£Œë ë°ìŽí° 구조 ë° ìê³ ëŠ¬ìŠì ëë€. ìŽë ì°ì ìì íì ìì¹ê³Œ ëœì ê°ë ì ê²°í©íì¬, ìì ìŽ í ë¹ë ì°ì ììì ë°ëŒ í¹ì ììë¡ ì€íëëë¡ ë³Žì¥íë ëìì ìœëì ìê³ êµ¬ìì ëí ëì ì ê·Œì ë°©ì§í©ëë€. ìŽ ì ê·Œ ë°©ìì ë ê°ëší ëœ ë©ì»€ëìŠì ë¹íŽ ëª ê°ì§ ìŽì ì ì ê³µí©ëë€:
- ì°ì ìì êž°ë° ì€í: ì°ì ììê° ëì ìì ìŽ ë®ì ìì ë³Žë€ ëšŒì ì€íëë¯ë¡ ê°ì¥ ì€ìí ìì ìŽ ëšŒì ìë£ë©ëë€.
- ëìì± ì ìŽ: ëœ ë©ì»€ëìŠì ì¬ë¬ ìì ìŽ ëìì ëìŒí 늬ìì€ì ì ê·Œíë ê²ì ë°©ì§íì¬ ê²œì 조걎ì ì ê±°íê³ ë°ìŽí° ìŒêŽì±ì 볎ì¥í©ëë€.
- ê³µì í 늬ìì€ í ë¹: ì°ì ìì íë 몚ë ìì ìŽ ê²°êµ ëŠ¬ìì€ì ì ê·Œí êž°í륌 ì»ëë¡ ë³Žì¥íì¬ êž°ì(starvation) ìí륌 ë°©ì§í©ëë€.
- ë¹ëêž° ì¹íì : íë ìë°ì€í¬ëŠœížì ë¹ëêž°ì í¹ì±ê³Œ ìííê² ìëíëë¡ ì€ê³ëìŽ, ìì ì íì ì¶ê°íê³ ë¹ëêž°ì ìŒë¡ ì€íí ì ììµëë€.
íë¡ ížìë ì¹ ëœ ì°ì ìì íì íµì¬ êµ¬ì± ìì
ìŒë°ì ìž íë¡ ížìë ì¹ ëœ ì°ì ìì íë ë€ì êµ¬ì± ììë¡ ìŽë£šìŽì§ëë€:
- ì°ì ìì í(Priority Queue): ì°ì ììì ë°ëŒ ìì ì ì ì¥íë ë°ìŽí° 구조ì ëë€. ìŒë°ì ìž êµ¬íìŒë¡ë ìµì í(min-heap)ìŽë ìŽì§ ê²ì ížëЬ(binary search tree)ê° ììµëë€. ì°ì ìì íë ê°ì¥ ëì ì°ì ìì륌 ê°ì§ ìì ìŽ íì íì ë§š ìì ìì¹íëë¡ ë³Žì¥í©ëë€.
- ëœ(Lock): ì¬ë¬ ìì ìŽ ëìì ëìŒí 늬ìì€ì ì ê·Œíë ê²ì ë°©ì§íë ë©ì»€ëìŠì ëë€. ëœì ë¶ëŠ¬ìž ë³ìë ë ì êµí ëêž°í í늬믞í°ëžë¥Œ ì¬ì©íì¬ êµ¬íí ì ììµëë€.
- ìì (Task): ê³µì 늬ìì€ì ì ê·ŒíŽìŒ íë ìì ëšìì ëë€. ê° ìì ìë ì°ì ììì ëœì íëíì ë ì€íí íšìê° í ë¹ë©ëë€.
- ì€ìŒì€ë¬(Scheduler): í륌 êŽëЬíê³ , ëœì íëíë©°, ì°ì ììì ë°ëŒ ìì ì ì€ííë êµ¬ì± ììì ëë€.
구í ì ëµ
ìë°ì€í¬ëŠœížìì íë¡ ížìë ì¹ ëœ ì°ì ìì í륌 구ííë ë°©ë²ìë ì¬ë¬ ê°ì§ê° ììµëë€. ë€ìì ëª ê°ì§ ìŒë°ì ìž ì ê·Œ ë°©ìì ëë€:
1. Promiseì Async/Await ì¬ì©íêž°
ìŽ ì ê·Œ ë°©ìì Promiseì async/awaitì ê°ë ¥í êž°ë¥ì íì©íì¬ ë¹ëêž° ìì 곌 ëœì êŽëЬí©ëë€. ëœì 늬ìì€ê° ì¬ì© ê°ë¥íŽì§ë©Ž íŽê²°(resolve)ëë Promise륌 ì¬ì©íì¬ êµ¬íí ì ììµëë€.
class PriorityQueue {
constructor() {
this.queue = [];
}
enqueue(task, priority) {
this.queue.push({ task, priority });
this.queue.sort((a, b) => a.priority - b.priority);
}
dequeue() {
return this.queue.shift();
}
isEmpty() {
return this.queue.length === 0;
}
}
class LockPriorityQueue {
constructor() {
this.queue = new PriorityQueue();
this.locked = false;
}
async enqueue(task, priority) {
return new Promise((resolve) => {
this.queue.enqueue({ task, resolve }, priority);
this.processQueue();
});
}
async processQueue() {
if (this.locked) {
return;
}
if (this.queue.isEmpty()) {
return;
}
this.locked = true;
const { task, resolve } = this.queue.dequeue();
try {
await task();
resolve();
} finally {
this.locked = false;
this.processQueue();
}
}
}
// ì¬ì© ìì:
const queue = new LockPriorityQueue();
async function task1() {
console.log("Task 1 started");
await new Promise(resolve => setTimeout(resolve, 1000)); // ìŒë¶ ìì
ì ì뮬ë ìŽì
í©ëë€
console.log("Task 1 finished");
}
async function task2() {
console.log("Task 2 started");
await new Promise(resolve => setTimeout(resolve, 500)); // ìŒë¶ ìì
ì ì뮬ë ìŽì
í©ëë€
console.log("Task 2 finished");
}
async function task3() {
console.log("Task 3 started");
await new Promise(resolve => setTimeout(resolve, 750)); // ìŒë¶ ìì
ì ì뮬ë ìŽì
í©ëë€
console.log("Task 3 finished");
}
(async () => {
await queue.enqueue(task1, 2); // ë®ì ì«ìê° ë ëì ì°ì ìì륌 ì믞í©ëë€
await queue.enqueue(task2, 1);
await queue.enqueue(task3, 3);
})();
ìŽ ìì ìì `LockPriorityQueue`ë êŽë š ì°ì ìì륌 ê°ì§ ìì í륌 êŽëЬí©ëë€. `enqueue` ë©ìëë ìì ì íì ì¶ê°íê³ , `processQueue` ë©ìëë ì°ì ììì ë°ëŒ ìì ì ì€íí©ëë€. `locked` íëê·žë í ë²ì íëì ìì ë§ ì€íëëë¡ ë³Žì¥í©ëë€.
2. ë³ë ¬ ì²ëŠ¬ë¥Œ ìí ì¹ ì컀 ì¬ì©íêž° (ê³ êž)
ê³ì° ì§ìœì ìž ìì ì 겜ì°, ì¹ ì컀(Web Workers)륌 íì©íì¬ ë©ìž ì€ë ëìì ìì ì ì€íë¡ëíê³ UIê° ë©ì¶ë ê²ì ë°©ì§í ì ììµëë€. ì°ì ìì íë ë©ìž ì€ë ëìì êŽëЬíê³ , ìì ì ì€íì ìíŽ ì¹ ìì»€ë¡ ë³ŽëŒ ì ììµëë€. ìŽ ì ê·Œ ë°©ìì ë©ìž ì€ë ëì ì컀 ê°ì ë ë³µì¡í íµì ë©ì»€ëìŠìŽ íìí©ëë€.
ì°žê³ : ìŽ ì ê·Œ ë°©ìì ë ë³µì¡íë©°, ìì ìŽ ê³ì° ì§ìœì ìŽê³ ì§ì í ë³ë ¬ ì²ëЬì ìŽì ì ì»ì ì ìë ìë늬ì€ì ì í©í©ëë€.
3. ê°ëší ë¶ëŠ¬ìž ëœ ì¬ì©íêž°
ë ê°ëší 겜ì°, ë¶ëŠ¬ìž ë³ì륌 ì¬ì©íì¬ ëœì ëíëŒ ì ììµëë€. ê·žë¬ë ìŽ ì ê·Œ ë°©ìì 겜ì 조걎ì íŒíêž° ìíŽ ë¹ëêž° ìì ì ì ì€íê² ì²ëЬíŽìŒ í©ëë€.
class SimpleLockPriorityQueue {
constructor() {
this.queue = [];
this.locked = false;
}
enqueue(task, priority) {
this.queue.push({ task, priority });
this.queue.sort((a, b) => a.priority - b.priority);
this.processQueue();
}
processQueue() {
if (this.locked) {
return;
}
if (this.queue.length === 0) {
return;
}
this.locked = true;
const { task } = this.queue.shift();
task()
.then(() => {})
.finally(() => {
this.locked = false;
this.processQueue();
});
}
}
ìŽ ìì ë ê°ëší ë¶ëŠ¬ìž ëœ(`this.locked`)ì ì¬ì©íì¬ ëì ì€íì ë°©ì§í©ëë€. `processQueue` ë©ìëë íì ë€ì ìì ì ì€ííêž° ì ì ëœìŽ ì¬ì© ê°ë¥íì§ íìží©ëë€.
íë¡ ížìë ì¹ ëœ ì°ì ìì í ì¬ì©ì ìŽì
ì¹ ì í늬ìŒìŽì ì íë¡ ížìë ì¹ ëœ ì°ì ìì í륌 구íí멎 ë€ì곌 ê°ì ì¬ë¬ ìŽì ìŽ ììµëë€:
- í¥ìë ì¬ì©ì 겜í: ì€ìí ìì ì ì°ì ìì륌 ë¶ì¬íšìŒë¡ìš ê°ì¥ ì€ìí ìì ìŽ ì ìíê² ì€íëëë¡ ë³Žì¥íì¬ ë ë°ììŽ ë¹ ë¥Žê³ ìŠê±°ìŽ ì¬ì©ì 겜íì ì ê³µí ì ììµëë€. ì륌 ë€ìŽ, íì UI ìì ë¡ë©ìŽë ì¬ì©ì ì ë ¥ ì²ëЬë 백귞ëŒìŽë ìì ë³Žë€ ì°ì ëìŽìŒ í©ëë€.
- ìµì íë 늬ìì€ íì©: ì°ì ìì íë 늬ìì€ê° íšìšì ìŒë¡ í ë¹ëëë¡ ë³Žì¥íì¬ ëŠ¬ìì€ ê²œí©ì ë°©ì§íê³ ì ë°ì ìž ì í늬ìŒìŽì ì±ë¥ì í¥ììíµëë€.
- í¥ìë ë°ìŽí° ìŒêŽì±: ëœ ë©ì»€ëìŠì 겜ì 조걎ì ë°©ì§íê³ ëì ìì ìŽ ìë 겜ì°ìë ë°ìŽí°ê° ìŒêŽëëë¡ ë³Žì¥í©ëë€.
- ëšìíë ëìì± êŽëЬ: ì°ì ìì íë ëìì±ì êŽëЬíë 구조íë ì ê·Œ ë°©ìì ì ê³µíì¬ ë³µì¡í ë¹ëêž° ìì ì ì¶ë¡ íê³ ëë²ê¹ íêž° ìœê² ë§ëëë€.
- í¥ìë ìœë ì ì§ë³Žìì±: ëìì± ë¡ì§ì ì°ì ìì í ëŽì 캡ìííšìŒë¡ìš ìœëë² ìŽì€ì 몚ëì±ê³Œ ì ì§ë³Žìì±ì í¥ììí¬ ì ììµëë€.
- ë ëì ì€ë¥ ì²ëЬ: 늬ìì€ ì ê·Œ ì ìŽë¥Œ ì€ì ì§ì€ííšìŒë¡ìš ë ê°ë ¥í ì€ë¥ ì²ëŠ¬ë¥Œ 구ííê³ ìêž°ì¹ ìì ëìì ë°©ì§í ì ììµëë€.
ì¬ì© ì¬ë¡ ë° ìì
ë€ìì íë¡ ížìë ì¹ ëœ ì°ì ìì íê° ì ì©í ì ìë ëª ê°ì§ ì€ì ì¬ì© ì¬ë¡ì ëë€:
- API ìì² êŽëЬ: ì€ìëì ë°ëŒ API ìì²ì ì°ì ìì륌 ì í©ëë€. ì륌 ë€ìŽ, ìŽêž° UI ë ëë§ì íìí ìì²ì ë ì€ìí ë°ìŽí°ë¥Œ ê°ì žì€ë ìì²ë³Žë€ ëì ì°ì ìì륌 ê°ì žìŒ í©ëë€. ëŽì€ ì í늬ìŒìŽì ì ììíŽ ë³Žììì€. 죌ì í€ëëŒìžì ë¡ëíë ê²ìŽ êž°ì¬ì ëí ëêžì ê°ì žì€ë ê²ë³Žë€ ì°ì ëìŽìŒ í©ëë€. ëë ì ì ìê±°ë ì¬ìŽížë¥Œ ìê°íŽ ë³Žììì€. ì í ìžë¶ ì 볎 ë° ì¬ê³ íìê° ì¬ì©ì 늬뷰 ë¡ëë³Žë€ ì°ì ëìŽìŒ í©ëë€.
- ê³µì ë°ìŽí° ì ê·Œ ì ìŽ: ëœ ë©ì»€ëìŠì ì¬ì©íì¬ ê³µì ë°ìŽí°ì ëí ëì ìì ì ë°©ì§í©ëë€. ìŽë ì¬ë¬ ì¬ì©ìë ëìŒí ë°ìŽí°ì ì ê·ŒíŽìŒ íë 컎í¬ëížê° ìë ì í늬ìŒìŽì ìì í¹í ì€ìí©ëë€. ì륌 ë€ìŽ, ì¬ì©ì ìžì ë°ìŽí°ë¥Œ êŽëЬíê±°ë ê³µì ì¥ë°êµ¬ë륌 ì ë°ìŽížíë 겜ì°ì ëë€. ê³µë 묞ì ížì§ ì í늬ìŒìŽì ì ê³ ë €íŽ ë³Žììì€. 묞ìì í¹ì ì¹ì ì ëí ì ê·Œì ì¶©ëíë ížì§ì ë°©ì§íêž° ìíŽ ì ì€íê² êŽëЬëìŽìŒ í©ëë€.
- ì¬ì©ì ìížìì© ì°ì ìì ì§ì : ì í늬ìŒìŽì ìŽ ë€ë¥ž ìì ìŒë¡ ë°ì ëìë ë²íŒ íŽëŠìŽë ìì ì ì¶ê³Œ ê°ì ì¬ì©ì ìížìì©ìŽ ì ìíê² ì²ëЬëëë¡ ë³Žì¥í©ëë€. ìŽë ì í늬ìŒìŽì ì ë°ìì±ì í¥ììí€ê³ ë ëì ì¬ì©ì 겜íì ì ê³µí©ëë€.
- 백귞ëŒìŽë ìì êŽëЬ: ë ì€ìí 백귞ëŒìŽë ìì ì ë®ì ì°ì ìì ìì€ìŒë¡ ë¯žë£šìŽ ë ì€ìí ìì ì ë°©íŽëì§ ìëë¡ í©ëë€. ì: ì í늬ìŒìŽì ë°ìŽí° ë¡ê¹ , ë¶ì ìŽë²€íž ì ì¡ ëë í¥í ì¬ì©ì ìí ë°ìŽí° 믞늬 ê°ì žì€êž°.
- API ížì¶ ìë ì í: ìë ì íìŽ ìë íì¬ APIì ìížìì©í ë ì°ì ìì íë ì íì ìŽê³Œíì§ ìëë¡ ìì²ì ììì ë¹ë륌 êŽëЬí ì ììµëë€. ì°ì ììê° ëì ìì²ì ìŠì ì€íëê³ , ì°ì ììê° ë®ì ìì²ì íì ì ì¥ëìë€ê° 늬ìì€ê° ì¬ì© ê°ë¥í ë ì€íë©ëë€.
- ìŽë¯žì§ ì²ëЬ: ì¬ë¬ ìŽë¯žì§ ì ë¡ë ëë ì¡°ìì ì²ëЬí ë í멎 ë°ì ìŽë¯žì§ë³Žë€ ì¬ì©ììê² ë³ŽìŽë ìŽë¯žì§ì ì°ì ìì륌 ëì ëë€.
ê³ ë € ì¬í ë° ëªšë² ì¬ë¡
íë¡ ížìë ì¹ ëœ ì°ì ìì í륌 구íí ë ë€ì ì¬íì ê³ ë €íììì€:
- ì¬ë°ë¥ž ì°ì ìì ìì€ ì í: ë€ë¥ž ìì ì ëí ì°ì ìì ìì€ì ì ì€íê² ê³ ë €íììì€. ì¬ì©ì 겜íì ì€ìí ìì ìë ë ëì ì°ì ìì륌 í ë¹íê³ ë ì€ìí ìì ìë ë®ì ì°ì ìì륌 í ë¹íììì€. ë묎 ë§ì ì°ì ìì ìì€ì ë§ë€ë©Ž í êŽëŠ¬ê° ë ë³µì¡íŽì§ ì ììŒë¯ë¡ íŒíììì€.
- êµì°© ìí(Deadlock) ë°©ì§: ë ìŽìì ìì ìŽ ìë¡ê° 늬ìì€ë¥Œ íŽì íꞰ륌 êž°ë€ëŠ¬ë©° 묎Ʞí ì°šëšëë ì ì¬ì ìž êµì°© ìíì ì ìíììì€. ìí ì¢ ìì±ì íŒíê³ ìì ìŽ ê²°êµ ëœì íŽì íëë¡ ìœë륌 ì ì€íê² ì€ê³íììì€.
- ì€ë¥ ì²ëЬ: ìì ì€í ì€ì ë°ìí ì ìë ììžë¥Œ ì ìì ìŒë¡ ì²ëЬíêž° ìíŽ ê°ë ¥í ì€ë¥ ì²ëЬ ë©ì»€ëìŠì 구ííììì€. ì€ë¥ê° êž°ë¡ëê³ ì¬ì©ììê² ë¬žì ê° íµë³Žëëë¡ íììì€.
- í ì€íž ë° ëë²ê¹ : ì°ì ìì íê° ì¬ë°ë¥Žê² ìëíê³ ìì ìŽ ì¬ë°ë¥ž ììë¡ ì€íëëì§ ì² ì í í ì€ížíììì€. ëë²ê¹ ë구륌 ì¬ì©íì¬ ë¬žì 륌 ìë³íê³ ìì íììì€.
- ì±ë¥ ìµì í: ì°ì ìì íì ì±ë¥ì 몚ëí°ë§íê³ ë³ëª© íìì ìë³íììì€. ì±ë¥ì í¥ììí€êž° ìíŽ ìœë륌 ìµì ííê³ íê° ì í늬ìŒìŽì ì ì ë°ì ìž ë°ìì±ì ìí¥ì 믞ì¹ì§ ìëë¡ íììì€. íìí ê²œì° ë íšìšì ìž ë°ìŽí° 구조ë ìê³ ëŠ¬ìŠì ì¬ì©íë ê²ì ê³ ë €íììì€.
- 볎ì ê³ ë € ì¬í: ê³µì 늬ìì€ë¥Œ êŽëЬí ë ì ì¬ì ìž ë³Žì ìíì ì ìíììì€. ì ìì ìž ê³µê²©ì ë°©ì§íêž° ìíŽ ì¬ì©ì ì ë ¥ì ê²ìŠíê³ ë°ìŽí°ë¥Œ ìŽê· (sanitize)íììì€. 믌ê°í ë°ìŽí°ê° ì ì íê² ë³Žížëëë¡ íììì€.
- 묞ìí: ë€ë¥ž ê°ë°ìë€ìŽ ìœë륌 ìŽíŽíê³ ì ì§ë³Žìíêž° ìœëë¡ ì°ì ìì íì ì€ê³ ë° êµ¬íì 묞ìííììì€.
- íì¥ì±: ë§ì ìì ìì ìŽë ì¬ì©ìê° ììëë ê²œì° ì°ì ìì íì íì¥ì±ì ê³ ë €íììì€. íê° ë¶í륌 ì²ëЬí ì ìëë¡ ì ì í ë°ìŽí° 구조ì ìê³ ëŠ¬ìŠì ì¬ì©íììì€.
ê²°ë¡
íë¡ ížìë ì¹ ëœ ì°ì ìì íë ë³µì¡í ì¹ ì í늬ìŒìŽì ìì 늬ìì€ ì ê·Œì êŽëЬíê³ ì¬ì©ì 겜íì ìµì ííë ê°ë ¥í ë구ì ëë€. ì°ì ììê° ì§ì ë ëœ ë©ì»€ëìŠì 구ííšìŒë¡ìš ì€ìí ìì ìŽ ì ìíê² ì€íëëë¡ ë³Žì¥íê³ , 겜ì 조걎ì ë°©ì§íë©°, ì ë°ì ìž ì í늬ìŒìŽì ì±ë¥ì í¥ììí¬ ì ììµëë€. 구íìë ë€ìí ìì륌 ì ì€íê² ê³ ë €íŽìŒ íì§ë§, ë§ì ìë늬ì€ìì ì°ì ìì í륌 ì¬ì©íë ìŽì ì ë³µì¡ì±ì ììí©ëë€. ì¹ ì í늬ìŒìŽì ìŽ ê³ì ë°ì íšì ë°ëŒ íšìšì ìž ëŠ¬ìì€ êŽëЬì íìì±ì ëì± ìŠê°í ê²ìŽë©°, ìŽë ì ìžê³ íë¡ ížìë ê°ë°ìë€ìê² íë¡ ížìë ì¹ ëœ ì°ì ìì í륌 ì ì ë ê°ì¹ ìë êž°ì ë¡ ë§ë€ ê²ì ëë€.
ìŽ êž°ì¬ìì ì€ëª í ëªšë² ì¬ë¡ì ì§ì¹šì ë°ë¥Žë©Ž, íë¡ ížìë ì¹ ëœ ì°ì ìì í륌 íšê³Œì ìŒë¡ íì©íì¬ ì ìžê³ ì¬ì©ì륌 ë§ì¡±ìí€ë ë ê²¬ê³ íê³ ë°ììŽ ë¹ ë¥Žë©° ì¬ì©ì ì¹íì ìž ì¹ ì í늬ìŒìŽì ì 구ì¶í ì ììµëë€. ìŽ ì ê·Œ ë°©ìì ì§ëЬì 겜ê³, 묞íì ëìì€, ë€ìí ì¬ì©ì êž°ë륌 ìŽìíì¬ ê¶ê·¹ì ìŒë¡ 몚ë ì¬ëìê² ë ìííê³ ìŠê±°ìŽ ìšëŒìž 겜íì ì ê³µíë ë° êž°ì¬í©ëë€.