๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ๊ณผ ๊ธ์ ๋ณด๊ณ ๋ค์ํ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ๋ฉด์ ์์ํ๊ฒ ๋๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํด๋ ผ ๊ธ ์ ๋๋ค. (๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ ๊ด์ฌ์๋ ๋ถ๋ถ๋ง ์ฝ์ด๋ ์ข์ต๋๋ค.)
๋จ์ํ ์ ์ฃผ๊ด์ผ๋ก ํ๋จํ๊ณ ์์ฑํ๋ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด๋๊ฐ ๋ ์๋ ์์ผ๋ ์ฃผ์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค ๐
1. ์ค์ฝํ(Scope)
์ค์ฝํ๋ ์ปจํ ์คํธ๋ ๊ฐ๊ณผ "ํํ์"์ด "ํํ"๋๊ฑฐ๋ ์ฐธ์กฐ ๋ ์ ์๋ ํ์ฌ ์คํ๋๋ ์ปจํ ์คํธ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง์ฝ ๋ณ์ ๋๋ ํํ์์ด "ํด๋น ์ค์ฝํ"๋ด์ ์์ง ์๋ค๋ฉด, ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ๋ถ๊ฐ๋ฅํ ์ผ์ด์ค
function exampleFunction() {
const x = "declared inside function"; // ๋ณ์ x๋ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
console.log("Inside function");
console.log(x);
}
console.log(x); // ์ค์ฝํ๊ฐ ๋ฌ๋ผ ์ ๊ทผ ๋ถ๊ฐ
// ๊ฐ๋ฅํ ์ผ์ด์ค
const x = "declared outside function";
exampleFunction();
function exampleFunction() {
console.log("Inside function");
console.log(x);
}
console.log("Outside function");
console.log(x); // ๊ฐ์ ์ต์์ ์ค์ฝํ์ด๋ฏ๋ก ์ ๊ทผ ๊ฐ๋ฅ
2. ๋ ์์ปฌ ์ค์ฝํ(Lexical Scope)
๋ ์์ปฌ ์ค์ฝํ๋ ํจ์๋ฅผ ์ด๋์ ์ ์ธํ์๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ ๋งํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์ด๋ฅผ ์ ์ ์ค์ฝํ(Static Scope)๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
// ์์ 1
var x = 1;
function bar() {
console.log(x);
}
// bar๋ฉ์๋๊ฐ ์ธ๋ถ์ var x์ ์ค์ฝํ๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ foo์์์ bar๋ฅผ ํธ์ถํ๋๋ผ๋ ๋ ์์ปฌ ์ค์ฝํ๋ก ์ธํ์ฌ ์ธ๋ถ x๊ฐ ํธ์ถ๋ฉ๋๋ค.
function foo() {
var x = 10;
bar();
}
foo(); // 1
bar(); // 1
// ์์ 2
var y = 2;
// fooy๊ฐ bary ๋ด๋ถ์ ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ bary๊ฐ ์ธ๋ถ์์ ํธ์ถ๋๋๋ผ๋ fooy๋ bary ๋ด๋ถ์ y๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
function bary() {
var y = 20;
function fooy() {
console.log(y);
}
fooy();
}
bary();
์์ 2๋ฒ์ ๋ค์์ ํด๋ก์ ๊ฐ๋ ๊ณผ ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณด์๋ ๊ฒ ์ข์ต๋๋ค.
๋์ ์ค์ฝํ(Dynamic Scope)
๋ ์์ปฌ ์ค์ฝํ์ ๋ค๋ฅด๊ฒ ํจ์๋ฅผ ์ด๋์ ํธ์ถํ์๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ ๋์ ์ค์ฝํ๋ผ๊ณ ํฉ๋๋ค.
Bash Scripting, Common Lisp ๋ฑ ์ผ๋ถ ์ธ์ด์์ ๋์ ์ค์ฝํ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
3. ํด๋ก์ (Closure)
ํด๋ก์ ๋ ๋ฐํ๋ ๋ด๋ถํจ์๊ฐ ์์ ์ด ์ ์ธ๋์ ๋์ ํ๊ฒฝ(๋ ์์ปฌ ์ค์ฝํ)์ธ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ฌ ์์ ์ด ์ ์ธ๋์ ๋์ ํ๊ฒฝ(์ค์ฝํ) ๋ฐ์์ ํธ์ถ๋์ด๋ ๊ทธ ํ๊ฒฝ(์ค์ฝํ)์ ์ ๊ทผํ ์ ์๋ ํจ์๋ฅผ ๋งํฉ๋๋ค.
์ฆ, ์์ ์ด ์์ฑ๋ ๋์ ํ๊ฒฝ(๋ ์์ปฌ ์ค์ฝํ)์ ๊ธฐ์ตํ๋ ํจ์์ ๋๋ค. ์ด ํด๋ก์ ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์๋
- ๋น๋๊ธฐ ์์
- ๋ชจ๋ ํจํด
์์ธํ ๋ด์ฉ์ ์๋ ๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
4. ์ปค๋ง(Currying)
์ปค๋ง์ f(a, b, c)์ฒ๋ผ ๋จ์ผ ํธ์ถ๋ก ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ f(a)(b)(c)์ ๊ฐ์ด ๊ฐ๊ฐ์ ์ธ์๊ฐ ํธ์ถ ๊ฐ๋ฅํ ํ๋ก์ธ์ค๋ก ํธ์ถ๋ ํ ๋ณํฉ๋๋๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค.
function curry(f) { // ์ปค๋ง ๋ณํ์ ํ๋ curry(f) ํจ์
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// usage
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
alert( curry(sum)(1)(2) ); // ์ด๋ ๊ฒ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ปค๋ง์ ์ด์ฉํด log ํจ์๋ฅผ ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์๊ณ ๋ค์ค ์ธ์(๋งค๊ฐ๋ณ์)๋ฅผ ๋ฐ์ ์ ์๊ฒ ์กฐ๊ธ ๋ณต์กํ ๊ณ ๊ธ ์ปค๋ง์ ์ด์ฉํ ์๋ ์๋๋ฐ, ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ ๋งํฌ
5. ์ผ๊ธ ๊ฐ์ฒด, ์ผ๊ธ ํจ์
์ผ๊ธ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ์ ๋ชจ๋ ์ง์ํ๋ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค. ๋ณดํต ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๊ธฐ, ์์ ํ๊ธฐ, ๋ณ์์ ๋์ ํ๊ธฐ์ ๊ฐ์ ์ฐ์ฐ์ ์ง์ํ ๋ ์ด ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ํฉ๋๋ค. ์ด๋ฐ ์ผ๊ธ ๊ฐ์ฒด์ธ ํจ์๋ฅผ ์ผ๊ธ ํจ์๋ผ๊ณ ๋ ํฉ๋๋ค.
๋ ์์ธํ ์์ ๋ฅผ ํ์ธํ๋ ค๋ฉด ์๋ MDN ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
6. reflow์ repaint
reflow๋ Dom์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ ์ด์์์ ์ํฅ์ ์ค ์ ์๋ CSS(width, height, margin, padding ๋ฑ..)๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง์ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
repaint๋ ๋ ์ด์์์ ๊ทธ๋๋ก์ด๊ณ , ์์์ด๋ ๋ฐฐ๊ฒฝ ๋ฑ์ ์คํ์ผ๋ง ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ์์์ ๋ชจ์๋ง ๋ค์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
์ฆ, reflow๋ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๋ ๊ณผ์ ์ด๊ณ , repaint๋ ๊ทธ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค
reflow, repaint๋ฅผ ๊ด๋ฆฌํ์ฌ ์ฑ๋ฅ ์ต์ ํ ํ๋ ๋ฐฉ๋ฒ 3๊ฐ์ง
- reflow๋ฅผ ์ ๋ฐํ๋ CSS ์์ฑ ์ฌ์ฉ์ ์ต์ํ
- transform๊ณผ opacity ์์ฑ๋ง์ ์ฌ์ฉํ์ฌ CSS ์ ๋๋ฉ์ด์ ์ต์ ํ
- willchange ์์ฑ ์ฌ์ฉ
์ต์ ํ ๊ด๋ จํ ๋ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
7. ์คํ ์ปจํ ์คํธ
์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์๋ฏธํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์คํํ ๋์ ํ๊ฒฝ์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์กด์ฌํ๋ ๊ฒ์ด ์คํ ์ปจํ ์คํธ์ ๋๋ค.
- ์ ์ญ ์คํ ์ปจํ ์คํธ : ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฒ์ ์คํ๋ ๋ ์์ฑ๋๋ ์ปจํ ์คํธ. ์ ์ญ์ ์ ์ธ๋ ๋ณ์๋ ํจ์๊ฐ ๋ชจ๋ ํฌํจ
- ํจ์ ์คํ ์ปจํ ์คํธ : ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์คํ๋๋ ์ปจํ ์คํธ. ํจ์ ์ปจํ ์คํธ ๋ด์์ ์ ์ธ๋ ๋ณ์์ ํจ์๋ ํด๋น ํจ์ ๋ด์์๋ง ์ ํจ
์คํ ์ปจํ ์คํธ์ ๊ตฌ์ฑ ์์
- ๋ณ์ ๊ฐ์ฒด
- ์ค์ฝํ ์ฒด์ธ
- this
์ธ๋ถ ์ค๋ช ์ ์๋ ๋งํฌ ์ฐธ๊ณ
8. ์ด๋ฒคํธ ๋ฃจํ(Event Loop)
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ ์ธ์ด์์๋ ๋ถ๊ตฌํ๊ณ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ์ค์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ผ๋ก ๋์ด ์์ต๋๋ค.
- Call Stack : ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋ ์คํ์ ์ํด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- Heap : ๋์ ์ผ๋ก ์์ฑ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- Web APIs : ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณต๋๋ API ๋ชจ์์ผ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์์
๋ค์ ์ ๋ดํ์ฌ ์ฒ๋ฆฌํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ฉํฐ ์ค๋ ๋ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง๊ณ ์์ (Console API๋ Canvas API๋ Web API์ด์ง๋ง ์ด๋ฒคํธ ๋ฃจํ์ Web APIs์ ๊ด๋ จ์ด ์๊ณ Call Stack์์๋๊ธฐ์ ์ผ๋ก ๋ฐ๋ก ์คํ๋จ)
- Timer : setTimeout, setInterval๊ฐ์ ํจ์ ์ฒ๋ฆฌ ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด Macro Task Queue๋ก ์ ๋ฌ
- XMLHttpRequest : ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋ ๊ฐ์ฒด(AJAX ๊ธฐ์ ์ ํต์ฌ) ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด Micro Task Queue๋ก ์ ๋ฌ
- DOM Event Handler : HTML ๋ฌธ์์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ํํํ๊ณ ์กฐ์. ์ด๋ฒคํธ ๊ฐ์ง๋ ๋ฉํฐ์ค๋ ๋์์ ์ด๋ฃจ์ด์ง์ง๋ง, ์ด๋ฒคํธ ์คํ์ ํญ์ ๋ฉ์ธ ์ค๋ ๋์์ ๋์ํ์ฌ ๋๊ธฐ์ ์ผ๋ก ์๋ํจ
- Web Workers : ๋ช ์์ ์ผ๋ก ๋ฉํฐ ์ค๋ ๋๋ฅผ ํ์ฉํ๊ธฐ ์ํด Javascript์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ(๋ ๋ฆฝ์ ์ธ ์คํ ํ๊ฒฝ์์ ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ์์ ์ํ)
- ํ์ผ ์ ์ถ๋ ฅ ์์ : ๋ธ๋ผ์ฐ์ ๋ Node.js ํ๊ฒฝ์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ๋ฉํฐ ์ค๋ ๋๋ก ๋์
- Geolocation API : ์ฌ์ฉ์ ์์น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋น๋๊ธฐ์ Web API๋ก ๋ธ๋ผ์ฐ์ ๋ Geolocation ์์ฒญ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌํ ๋ค, ๊ฒฐ๊ณผ๋ฅผ Macro Task Queue๋ก ์ ๋ฌ
- Callback Queue : ๋น๋๊ธฐ์ ์์
์ด ์๋ฃ๋๋ฉด ์คํ๋๋ ํจ์๋ค์ด ๋๊ธฐํ๋ ๊ณต๊ฐ (Call Stack์ด ๋น์ด์์ ๋ Micro, Macro ์์ผ๋ก Queue์ ์๋ ์ฝ๋ฐฑ ํจ์๋ค์ Call Stack์ผ๋ก ์ฎ๊ธฐ๊ฒ ๋จ)
- Macro Task Queue(= Task Queue) : setTimeout, setInterval, fetch, addEventListner์ ๊ฐ์ด ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ ํจ์๋ค์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ค์ด๊ฐ๋ Queue
- Micro Task Queue : promise.then, process,nextTick, MutationObserver์ ๊ฐ์ด ์ฐ์ ์ ์ผ๋ก ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ ํจ์๋ค์ ์ฝ๋ฐฑํจ์๊ฐ ๋ค์ด๊ฐ๋ Queue(์ฐ์ ์์ ๋์)
- Animation Frames Queue : ์ ๋๋ฉ์ด์
์์
์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํจ requestAnimationFrame ๋ฉ์๋๋ฅผ ํตํด ์ฝ๋ฐฑ์ ๋ฑ๋กํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ repaint ์ง์ ์ ํด๋น Queue์ ์๋ ์์
์ ์ ๋ถ ์ฒ๋ฆฌ
- requestAnimationFrame์ ์ด์ฉํ ์ต์ ํ ๊ด๋ จ ๋งํฌ :๐ ์น ์ ๋๋ฉ์ด์ ์ต์ ํ requestAnimationFrame ๊ฐ์ด๋
์์ ์ฝ๋
console.log('Start!');
setTimeout(() => {
console.log('Timeout!');
}, 0);
Promise.resolve('Promise!').then(res => console.log(res));
console.log('End!');
์ ์ฝ๋์ ์คํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Call Stack์ console.log('Start!'); ์ด ์์ธ ๋ค ์ถ๋ ฅ
- setTimeout ์ฝ๋๊ฐ ์ฝ ์คํ์ ์ ์ฌ๋๊ณ ์คํ๋๋ฉด, ์ฝ๋ฐฑ ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด Web API๋ก ์ฎ๊ฒจ์ง๊ณ ํ์ด๋จธ ์๋(0์ด๋ผ์ ์ฌ์ค์ ๋ฐ๋ก ์ข ๋ฃ)
- ํ์ด๋จธ๊ฐ ์ข ๋ฃ ํ setTimeout ์ ์ฝ๋ฐฑ ํจ์๋ Macro Task Queue์ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ์ ์ฌ
- Promise ์ฝ๋๊ฐ Call Stack์ ์ ์ฌ ๋์ด ์คํ๋๊ณ then ํธ๋ค๋ฌ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด MicroTask Queue์ ์ ์ฌ
- console.log('End!') ์ฝ๋๊ฐ ์คํ๋๊ณ ์ถ๋ ฅ
- ๋ฉ์ธ ์ค๋ ๋์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋์ด Call Stack์ด ๋น์์ง๊ฒ ๋จ
- ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ด๋ฅผ ๊ฐ์งํ์ฌ Callback Queue(Macro/Micro Task Queue)์ ๋จ์์๋ ํจ์๋ค์ Call Stack์ ์ ์ฌ (์ด ๋, Micro Task Queue์ ๋จ์ ์๋ Callback์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ)
- Micro Task Queue์ ์๋ console.log(res); ์ถ๋ ฅ
- Macro Task Queue์ ์๋ console.log('Timeout!'); ์ถ๋ ฅ
๋ค์ ์ฌ์ดํธ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ด๋ป๊ฒ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋์ํ๋ ์ง ๋ณผ ์ ์์ผ๋ ํ ๋ฒ ํ ์คํธํด๋ณด์๊ธธ ๋ฐ๋๋๋ค.
์ด ์ธ์๋ ๋ค์ Article์ Node.js, Async/Await ๋์ ๊ณผ์ ๋ฑ ๋ค์ํ ๋ด์ฉ๋ค์ด ์์ผ๋ ํ ๋ฒ ๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
9. ์ธํฐ๋ท ์ฐฝ์ www.google.com์ ์ ๋ ฅํ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
์ฌ์ฉ์๊ฐ www.google.com์ ์ฃผ์์ฐฝ์ ์ ๋ ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋์ ๊ฐ์ ์์๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
- DNS ์กฐํ : ๋๋ฉ์ธ ์ด๋ฆ์ IP์ฃผ์๋ก ๋ณํํ๋ ์์ . ์บ์๋ DNS ๊ธฐ๋ก์ ๋จผ์ ํ์ธํ๊ณ ์์ผ๋ฉด ๋ก์ปฌ DNS ์๋ฒ์ ์์ฒญํ์ฌ www.google.com์ ํด๋นํ๋ IP ์ฃผ์๋ฅผ ์ป์ต๋๋ค.
- TCP ์ฐ๊ฒฐ ์๋ฆฝ : IP ์ฃผ์๊ฐ ํ์ธ๋๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ TCP์ฐ๊ฒฐ์ ์๋ฆฝํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ 3-way-handshake๋ฅผ ์ํํฉ๋๋ค.
- HTTP ์์ฒญ : TCP ์ฐ๊ฒฐ์ด ์๋ฆฝ๋๋ฉด, ๋ธ๋ผ์ฐ์ ๋ HTTP ๋๋ HTTPS ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด ์์ฒญ์ GET / HTTP / 1.1 ๊ฐ์ ํ์์ผ๋ก ์นํ์ด์ง๋ฅผ ์์ฒญํ์ ๋ฉ์ธ์ง์ ๋๋ค. ์ด ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ์ํธํ๋ ์ฐ๊ฒฐ์ ์ค์ ํ๊ธฐ ์ํด ๋ณด์ ์ธ์ฆ์๋ฅผ ๊ตํํ๊ณ ์ํธํ ํค๋ฅผ ํ์ํฉ๋๋ค. (HTTPS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ SSL/TLS ํธ๋์ ฐ์ดํฌ๋ ์ํ๋ฉ๋๋ค.)
- ์๋ฒ์ ์๋ต : ์๋ฒ๋ ์์ฒญ์ ๋ฐ์ ํด๋น ๋ฆฌ์์ค(HTML, CSS ,JavaScript, ์ด๋ฏธ์ง ๋ฑ)๋ฅผ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ต์ผ๋ก ๋ณด๋ ๋๋ค. ์ด ์๋ต์ HTTP ์๋ต ์ฝ๋(ex. 200 OK)์ ํจ๊ป ์ ๋ฌ๋ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ ๋ผ์ธ : ๋ฐ์ ๋ฆฌ์์ค๋ค์ ๋ฐํ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์งํํฉ๋๋ค. DOM๊ณผ CSSOM์ ์์ฑํ๊ณ , ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ๋ค, ๋ ์ด์์ ํ์ธํธ ๋จ๊ณ๋ฅผ ํตํด ์ ํ์ด์ง๊ฐ ํ๋ฉด์ ํ์๋ฉ๋๋ค.
10. ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ
๋ธ๋ผ์ฐ์ ๊ฐ ์น ํ์ด์ง๋ฅผ ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ๊ฑฐ์น๋ 5๊ฐ์ง ๊ณผ์ ์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ํฉ๋๋ค.
1. DOM(Document Object Model) ์์ฑ
- ๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ผ ๋ฐ์
- ํ์ผ์ Byte๋จ์๋ก ์ฝ์
- ๋ธ๋ผ์ฐ์ ์ HTML Parser๊ฐ ๋ฐ์ดํธ๋ค์ ๋ฌธ์๋ก ๋ณํ
- ๋ฌธ์๋ค์ ๋ค์ HTML ํ ํฐ(ํ๊ทธ, ํ ์คํธ, ์์ก ๋ฑ์ ์๋ฏธ) ์ผ๋ก ๋ณํ
- ๋ธ๋ผ์ฐ์ ๋ HTML ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก DOM ํธ๋ฆฌ ์์ฑ
2. CSSOM(CSS Object Model) ์์ฑ
- ๋ธ๋ผ์ฐ์ ๊ฐ CSS ํ์ผ Parser๊ฐ ๋ฐ์ดํธ๋ค์ ๋ฌธ์๋ก ๋ณํ
- CSS ๊ท์น์ ์ํ์ฌ ์ ํ์(selector : ์คํ์ผ์ ์ ์ฉํ HTML ์์)์ ์ ์ธ(declaration : ์ ์ฉํ ์คํ์ผ)์ผ๋ก ๋๋
- CSS ๊ท์น ๊ธฐ๋ฐ์ผ๋ก CSSOM ํธ๋ฆฌ ์์ฑ
3. ๋ ๋ ํธ๋ฆฌ(Render Tree) ์์ฑ
- ๋ธ๋ผ์ฐ์ ๋ DOM๊ณผ CSSOM์ ๊ฒฐํฉํ์ฌ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์์ฑ
- ๋ ๋ ํธ๋ฆฌ๋ ํ๋ฉด์ ์ค์ ๋ก ํ์๋ ์์๋ค๋ก๋ง ๊ตฌ์ฑ (ex. display: none ์์ฑ์ด ์๋ ์์๋ ํฌํจ X)
- ๋ ๋ ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋๋ DOM ํธ๋ฆฌ์ ์์์ ์ฐ๊ฒฐ๋๋ฉฐ, CSSOM ํธ๋ฆฌ์์ ํด๋น ์์์ ์ ์ฉ๋ ์คํ์ผ ์ ๋ณด๋ฅผ ํฌํจ
4. ๋ ์ด์์(Layout)
- ๋ธ๋ผ์ฐ์ ๋ ์์ฑ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ฐ ์์์ ์ ํํ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐ
- ๋ทฐํฌํธ(viewport)์ ๊ฐ์ ํฌ๊ธฐ ์ ๋ณด์ ์์กด (ex. ํ๋ฉด ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์ ๊ณผ์ ์ ๋ค์ ์ํ)
- ๋ ์ด์์ ๊ณผ์ ์์ ๋ ธ๋์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ ๋ฆฌํ๋ก์ฐ(reflow)๋ผ๊ณ ํจ (๋ฆฌํ๋ก์ฐ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ์ต์ํ ํ๋ ๊ฒ์ด ์ค์)
5. ํ์ธํธ(Paint)
- ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ์์๋ฅผ ์ค์ ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์์ ์ ์์
- ํ ์คํธ, ์์, ๊ทธ๋ฆผ์, ์ด๋ฏธ์ง ๋ฑ ๋ชจ๋ ์๊ฐ์ ์์๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง
- ํ์ธํธ ๊ณผ์ ์์ ๊ฐ ์์๋ฅผ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ ์์ ์ ๋ฆฌํ์ธํธ(repaint)๋ผ๊ณ ํจ (๋ฆฌํ์ธํธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ์ต์ํ ํ๋ ๊ฒ์ด ์ค์)
6. ํฉ์ฑ(Compositing)
- ๋ธ๋ผ์ฐ์ ๋ ํ๋ฉด์ ๊ทธ๋ ค์ง ์์๋ค์ ๊ฐ๊ฐ์ ๋ ์ด์ด(layer)๋ก ๋ถ๋ฆฌํ๊ณ , ์ด ๋ ์ด์ด๋ค์ ๊ฒฐํฉํ์ฌ ์ต์ข ํ๋ฉด์ ๊ตฌ์ฑ
- transform๊ณผ opacity์ ๊ฐ์ ์์ฑ์ ๋ ์ด์์์ด๋ ํ์ธํธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ , ํฉ์ฑ ๋จ๊ณ์์๋ง ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ ๋๋ฉ์ด์ ์ ๋ ๋ถ๋๋ฝ๊ณ ๋น ๋ฅด๊ฒ ์คํ๋ ์ ์์
- ํฉ์ฑ ๊ณผ์ ์์๋ GPU๋ฅผ ํ์ฉํ์ฌ ๊ฐ ๋ ์ด์ด๋ฅผ ๋น ๋ฅด๊ฒ ํฉ์ฑํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ดค์ ๋๋ ๋น์ผ ์์ ์ด๋ฏ๋ก ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ์์์ผ ํจ
11. ํธ์ด์คํ (Hoisting)
ํธ์ด์คํ (Hoisting) ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ณ์์ ํจ์ ์ ์ธ์ ์ฝ๋์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ ํน์ง์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ ์ธ๋ ์์น์ ๊ด๊ณ์์ด ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
ํธ์ด์คํ ์ ๋์ด์ฌ๋ฆฌ๋ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์ ์ธ๋ง ํธ์ด์คํ ํ ๋ฟ, ๋ณ์ ๊ฐ ํ ๋น๊น์ง ๋์ด์ฌ๋ฆฌ์ง ์์
console.log(myVar); // ๋ณ์ ์์ฒด๋ ํธ์ด์คํ
๋์ง๋ง ์ด๊ธฐํ ์ ๊น์ง undefined
var myVar = 10;
console.log(myVar); // 10
2. ํจ์ ์ ์ธ์ ์ ์ฒด๊ฐ ํธ์ด์คํ , ์ ์ธ ์ด์ ์ ํธ์ถ ๊ฐ๋ฅ
console.log(myFunction()); // 'Hello World' ์ถ๋ ฅ
function myFunction() {
return 'Hello World';
}
3. TDZ(Temporal Dead Zone)
๋ณ์๊ฐ ์ ์ธ๋๊ณ ์ด๊ธฐํ๋๊ธฐ ์ ๊น์ง์ ๊ตฌ๊ฐ์ ๋งํฉ๋๋ค.
ES6์ ๋์ ๋ let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๋ TDZ๊ฐ ์กด์ฌํ์ฌ, ์ด ๊ตฌ๊ฐ์์๋ ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
console.log(myLet); // TDZ๋ก ์ธํด ์ด๊ธฐํ ์ ์ ๊ทผํ๋ฉด ReferenceError ๋ฐ์
let myLet = 10;
12. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ํน์ง
1. ์ผ๊ธ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ๊ฐ์ฒ๋ผ ์ทจ๊ธ๋ ์ ์์ผ๋ฉฐ, ๋ณ์์ ํ ๋นํ๊ฑฐ๋, ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋, ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
const sayHello = function() { return 'Hello'; }; // ๋ณ์์ ํ ๋น
console.log(sayHello()); // 'Hello'
const executeFunction = function(fn) { // ํจ์์ ์ธ์๋ก ํจ์๋ฅผ ๋ฐ์ ์ ์์
return fn();
};
console.log(executeFunction(sayHello)); // 'Hello'
2. ์ต๋ช ํจ์์ ํจ์ ํํ์
์ด๋ฆ ์๋ ํจ์, ์ฆ ์ต๋ช ํจ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ์ต๋ช ํจ์๋ ํจ์ ํํ์์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ํ์์ ๋ฐ๋ผ ํจ์์ ์ด๋ฆ์ ์ง์ ํ์ง ์์๋ ๋ฉ๋๋ค.
const add = function(a, b) { // ์ต๋ช
ํจ์๋ฅผ ์ด์ฉํ์ฌ ํจ์ ํํ์ ์ ์ธ
return a + b;
};
console.log(add(2, 3)); // 5
3. ํธ์ด์คํ
ํจ์ ์ ์ธ์์ ํตํด ์ ์ธํ ํจ์๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ํธ์ด์คํ ๋์ด ํจ์ ์ ์ธ ์ด์ ์ ํธ์ถํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, ํจ์ ํํ์์ ๋ณ์์ ํ ๋น๋ ํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ํจ์ ์ ์ธ์์ ํธ์ด์คํ
๋์ด ์ฝ๋ ์ ์ ์ธ ์ด์ ์ ํธ์ถ ๊ฐ๋ฅ
console.log(declaredFunction()); // 'Declared Function'
function declaredFunction() {
return 'Declared Function';
}
// ํจ์ ํํ์์ ํ ๋น ํ์๋ง ์ฌ์ฉํ ์ ์์
const expressedFunction = function() {
return 'Expressed Function';
};
console.log(expressedFunction()); // 'Expressed Function'
4. ํด๋ก์
ํด๋ก์ ๋ ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ํ๊ฒฝ(์ค์ฝํ) ์ ๊ธฐ์ตํ๊ณ , ํด๋น ํ๊ฒฝ์ ์ ๊ทผํ ์ ์๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํจ์๋ ์์ ์ด ์ ์ธ๋ ๋น์ ์ค์ฝํ ๋ด์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. (์์ธํ ๋ด์ฉ์ ํด๋น ๊ธ 3๋ฒ์ ํด๋ก์ ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค)
function outer() {
const outerVar = 'I am outer!';
return function inner() {
return outerVar; // ํด๋น ํจ์ ์ธ๋ถ ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅ
};
}
const innerFunction = outer();
console.log(innerFunction()); // 'I am outer!'
5. ๊ณ ์ฐจ ํจ์ (HOF : Higher Order Function)
๊ณ ์ฐจ ํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฐํํ๋ ํจ์๋ฅผ ๋งํฉ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด๊ณ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ธ๋ป ๋ณด๋ฉด ํด๋ก์ ์ ๋น์ทํด ๋ณด์ด๋๋ฐ, ํด๋ก์ ์ ๊ณ ์ฐจ ํจ์์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ก์ : ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ํ๊ฒฝ์ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ ์ค์ ์ ๋
- ๊ณ ์ฐจ ํจ์ : ํจ์๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฐํํ๋ ๊ฒ์ ์ค์ ์ ๋
function multiplyBy(factor) {
return function(num) { // ํจ์๋ฅผ ๋ฐํํ๊ณ ์์
return num * factor;
};
}
const double = multiplyBy(2);
console.log(double(5)); // 10
6. ํ์ดํ ํจ์(Arrow Function)
ํ์ดํ ํจ์๋ ๋ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
this ๋ฐ์ธ๋ฉ์์ ํ์ดํ ํจ์๋ ์ ์ธ๋ ์์น์ this ๊ฐ์ ์ ์งํ๋ฏ๋ก, ์ผ๋ฐ ํจ์์ ๋ฌ๋ฆฌ ๋ณ๋๋ก this๋ฅผ ๋ฐ์ธ๋ฉํ ํ์๊ฐ ์์ต๋๋ค.
this์ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ฐ๋ก ์๋์ ๊ธ์ ํ์ธํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค
const obj = {
value: 42,
method: function() {
setTimeout(() => {
console.log(this.value); // 42 (Arrow ํจ์๋ obj์ this๋ฅผ ์ ์ง)
}, 1000);
// setTimeout(function() {
// console.log(this.value); // undefined (์ผ๋ฐ ํจ์์ this๋ window๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋จ)
// }, 1000);
}
};
obj.method();
์ฐธ๊ณ ๋งํฌ
๋๊ธ