May 03, 2020
A semantic element clearly describes its meaning to both the browser and the developer.
Examples of non-semantic elements: <div> and <span> - Tells nothing about its content.
Examples of semantic elements: <form>, <table>, and <article> - Clearly defines its content.
์ดํดํ๊ธฐ ์ฝ๊ฒ ๋งํ์๋ฉด, ์๋ฏธ๊ฐ ์๋ ํ๊ทธ์ ์๋ฏธ๊ฐ ์๋ ํ๊ทธ๋ฅผ ๊ตฌ๋ถํ๊ฒ ๋ค๋ ์ค๋ช ์ด๋ค.
HTML5 ์ด์ ์ ์นํ์ด์ง๋ค์ non-semantic tag(div
, span
๋ฑ)์ id
์ class
๋ฅผ ์ด์ฉํด์ ๊ตฌ์ฑ์ ํ์๋ค๊ณ ํ๋ค.
๊ฐ๋ฐ์๋ค์ ์ด ๊ณผ์ ์์ ํฐ ๋ฌธ์ ์ ์ ์๊ฒ ๋์์๋๋ฐ, ๋ง์ div์ span์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ html ํ์ผ์์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ฉฐ non-semantic tag์ ์ด๋ค๊ฒ์ด ๋ค์ด๊ฐ๋์ง ์์์ด ์๋๋ฏ๋ก ์ฝ๋์ ๋ณด์๊ฐ ํ๋ค๋ค๋ ์ ์ด์๋ค.
๊ทธ๋์ HTML5์์๋ semantic tag, ์ฆ ์๋ฏธ๊ฐ ์๋ ํ๊ทธ๋ค์ ์ด์ฉํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ๊ท๊ฒฉ์ฑ์ ๋ํ ์ฝ๋์ ๋ณด์๋ฅผ ์ฝ๊ฒ ํ๋๋ก ํด์ฃผ์๋ค.
์ด๋ ๋ฏ semantic tag๋ค์ ์๋ฏธ๊ฐ ์๋ ํ๊ทธ๋ค์ด๋ฉฐ, W3C๋ ๋ค์๊ณผ ๊ฐ์ ํผ์ ์ ์ํด์ฃผ๊ณ ์๋ค.
action: Form ํ๊ทธ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ URL์ ์ง์ ํ๋ค.
actocomplete: Form์ ์๋์์ฑ์ ์ง์ ํ๋ค.
enctype: ๋๊ธฐ๋ ค๋ content์ ํ์
์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํ๋ค.
method: Form์ ์๋ฒ๋ก ์ ์กํ๋ http์ method๋ฅผ ์ง์ ํ๋ค.
name: Form์ ์๋ณํ๊ธฐ ์ํ ์๋ณ์๋ก์จ ์ฌ์ฉ๋๋ค.
target: action์์ ์ง์ ํ ์คํฌ๋ฆฝํธ ํ์ผ์ด ํ์ฌ๋ ๋ค๋ฅธ ์์น์์ ์ด๋ฆฌ๋๋ก ์ง์ ํ๋ค.
accepted-charset: Form์ ์ ์ก๋ ๋ฌธ์์ ์ธ์ฝ๋ฉ์ ์ง์ ํ๋ค.
์์ ๋ด์ฉ์ form
ํ๊ทธ์ ์์ฑ๋ค์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก form
์ JavaScript์ผ๋ก๋ ์๋ฒ์ ์ ๋ณด๋ฅผ ๋ณด๋ผ ์ ์์ง๋ง, form
ํ๊ทธ์ ์์ฑ์ธ action
๊ณผ method
๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ์ ๋ณด๋ฅผ ๋ณด๋ผ ์ ์๋ค.
<p> : "๋ฌธ์ฅ์ ๋จ๋ฝ(paragraph)"์ ํ์ํ๊ธฐ ์ํ ํ๊ทธ์ด๋ค. <div> ํ๊ทธ๋ฅผ ํฌํจํ ์ ์๋ค.
<div> : "๊ตฌ๊ฐ์ ๊ตฌ๋ถ(division)"์ ํ์ํ๊ธฐ ์ํ ํ๊ทธ์ด๋ค. <p> ํ๊ทธ๋ฅผ ํฌํจํ ์ ์๋ค.
meta
ํ๊ทธ๋ ์น ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ํธ ๊ตํ๋๋ ์ ๋ณด๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
HTML๋ฌธ์์ head
ํ๊ทธ์ ์กด์ฌํ๋ฉฐ, ์น ์ฌ์ดํธ์ ๋์์ธ์๋ ์ ํ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋์ ๋ฌธ์๋ฅผ ๋๊ฐ ๋ง๋ค์๊ณ , ๋ฌธ์์ ํค์๋๋ ๋ฌด์์ด๋ฉฐ, ๋๊ฐ ๋ง๋ค์๋์ง ๋ฑ์ ๋ฌธ์์ ํน์ฑ์ ๋ด๊ณ ์๋ค.
์ด๋ฌํ meta
ํ๊ทธ์๋ 3๊ฐ์ง ์์ฑ์ด ์กด์ฌํ๋ฉฐ, ๊ทธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. http-equiv = "ํญ๋ชฉ๋ช
"
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๋ช
๋ น์ ๋ด๋ฆฌ๋ ์์ฑ์ผ๋ก name ์์ฑ์ ๋์ ํ์ฌ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, HTML ๋ฌธ์๊ฐ ์๋ต ํค๋์ ํจ๊ป ์น ์๋ฒ๋ก๋ถํฐ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ก๋์์ ๋์๋ง ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
2. content = "์ ๋ณด๊ฐ"
meta ์ ๋ณด์ ๋ด์ฉ์ ์ง์ ํฉ๋๋ค.
3. name = "์ ๋ณด ์ด๋ฆ"
๋ช ๊ฐ์ meta ์ ๋ณด์ ์ด๋ฆ์ ์ ํ ์ ์์ผ๋ฉฐ ์ง์ ํ์ง ์์ผ๋ฉด http-equiv ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ์ด์ฉํ์ฌ ์น ํ์ด์ง์ ์ ๋ชฉ, ์ ์์ผ, ์ธ์ด, ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
script
ํ๊ทธ๋ ๋ณดํต JavaScriptํ์ผ์ import
ํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋๋ ํ๊ทธ์ด๋ฉฐ, ์ด๋ ๊ฒ import
๋ ํ์ผ๋ค์ ์์์ ๋ฐ๋ผ ์คํ๋๋ค.
script
ํ๊ทธ๋ head
์ body
ํ๊ทธ์ ์ฌ์ด ๋๋ body
์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋ฃ์ ์ ์๋ค.
์์ ๋ ๋ฐฉ๋ฒ์ ํฐ ์ฐจ์ด๊ฐ ์กด์ฌํ๋๋ฐ, ์ด์ ๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๋ฐฉ์์ ์กด์ฌํ๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
1. HTML์ ์ฝ๊ธฐ ์์ํ๋ค.
2. HTML์ ํ์ฑํ๋ค (parsing: ์ปดํจํฐ๊ฐ ์ฝ์ ์ ์๋ ์ฝ๋๋ก ๋ฐ๊พธ๋ ์์
)
3. DOM ํธ๋ฆฌ ์์ฑ.
4. Render ํธ๋ฆฌ๊ฐ ์์ฑ (DOM tree + CSS์ CSSOM ํธ๋ฆฌ ๊ฒฐํฉ)
5. Display(๋ธ๋ผ์ฐ์ )์ ํ์๋๋ค.
์ด ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ 1๋ฒ, 2๋ฒ ๊ณผ์ ์ ์ฃผ์ํด์ผ๋ง ํ๋ค.
1๋ฒ๊ณผ 2๋ฒ ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๋ HTML ์์๋ฅผ ์ฐจ๋ก๋๋ก ์ฝ์ด๊ฐ๋ฉด์ ํ์ฑํ๋๋ฐ, ์ด ๊ณผ์ ์์ script
ํ๊ทธ๋ฅผ ๋ง๋๊ฒ ๋๋ค๋ฉด ํ์ฑ์ ์ค๋จํ๋ค.
๊ทธ๋ฌ๊ณ ๋์ ๋ฐ๋ก script ํ๊ทธ์ ์์ค ํ์ผ์ ์ฐพ์ JavaScript ์ฝ๋๋ฅผ ๋ชจ๋ ์คํํ๊ณ ๋ค์ ํ์ฑ์ ์งํํ๊ฒ ๋๋ค.
์ด๋ฌ๋ ๊ณผ์ ์์ ์๊ธฐ๋ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. JavaScript Code์ ์คํ์ผ๋ก ์ธํ, Rendering Delay
2. Rendering Delay๋ก ์ธํ DOM ์กฐ์ ๋ถ๊ฐ๋ฅ ์ํฉ์์์ DOM ์กฐ์ ์ฝ๋ ์คํ
ํนํ ์ฐ๋ฆฌ๋ 2๋ฒ ์ํฉ์ ๋ํด ๊ณ ๋ฏผ์ ํด์ผ ํ ํ์๊ฐ ์๋๋ฐ, DOM์ด ํธ๋ฆฌ๊ฐ ์์ฑ๋๊ธฐ ์ ์ DOM์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด undefined
๊ฐ์ด ๋ฆฌํด๋๋ฏ๋ก ๋ชจ๋ ์ฝ๋๊ฐ ์คํ์ด ์ ๋ ๊ฒ์ด๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก, script ํ๊ทธ๋ฅผ head
ํ๊ทธ๋ณด๋ค๋ body
ํ๊ทธ์ ์ตํ๋จ ๋ถ๋ถ์ ์์น์ํค๋ ์ผ์ด ๋ง๋ค.
ํํธ, ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ ์๋ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํ๋ค. ๋ฐ๋ก script
ํ๊ทธ์ async
์์ฑ๊ณผ defer
์์ฑ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด HTML ํ์ฑ๊ณผ script์ ๋ก๋๊ฐ ๋์์ ์คํ๋๋ค!
e.g) <script async src="index.js"></script>
<script defer src="index.js"></script>
async
์ ๊ฒฝ์ฐ์๋ HTML์ ํ์ฑ์ด ๋ชจ๋ ๋๋์ง ์๋๋ผ๋, script
์ ๋ก๋๊ฐ ์๋ฃ๋๋ ์ฆ์ ์คํ์ํจ๋ค.
defer
์ ๊ฒฝ์ฐ์๋ HTML์ ํ์ฑ์ด ๋ชจ๋ ๋๋ ํ์ script
์ ์คํ์ด ์ด๋ฃจ์ด์ง๊ฒ ํ๋ค.
์ถ๊ฐ๋ก async
์ ๊ฒฝ์ฐ์๋, ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ๋๋ฏ๋ก ์ผ๊ด๋ ์คํ ์์๋ฅผ ๋ณด์ฅ์์ผ์ฃผ์ง ๋ชปํ๋ค. ๋๊ธฐ์ ์ผ๋ก ์คํ์ํค๊ธฐ๋ฅผ ์ํ๋ค๋ฉด async=false
๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ํค๋ฉด ๋๋ค.
๋ํ async
๋ HTML ํ์ฑ๊ณผ ๋์์ ์คํฌ๋ฆฝํธ ๋ก๋๋ฅผ ํ์ง๋ง ์คํฌ๋ฆฝํธ ์คํ์ HTML ํ์ฑ์ด ์ค์ง๋ ์ํ์์ ๋๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ HTML ํ์ฑ์ด ๋ฉ์ถ๋ ์์ ์ด ์๊ธธ ์ ์๋ค. ๋ค๋ง ์คํ ์์๋ฅผ ๊ฐ์ํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ defer
๋ HTML ํ์ฑ๊ณผ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์ค๊ณ HTML ํ์ฑ์ด ์๋ฃ ๋ ํ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ค. ์์์ ์ค๋ช
ํ script
ํ๊ทธ๊ฐ body
ํ๊ทธ์ ์ตํ๋จ์ ์์นํด์ผ ํ๋ ์ด์ ์ ๋ชจ๋ ์ ํฉํ๋ค.
===
๊ณผ ==
๋ ๊ฐ์ ๋ชฉ์ ์ ์ถ๊ตฌํ์ง๋ง, ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
==
๋ ์ขํญ๊ณผ ์ฐํญ์ ๊ฐ๋ง์ ๋น๊ตํ๋ค. ๋ง์ฝ 1 == "1"
๊ณผ ๊ฐ์ ํํ์ด ์๋ค ํ๋ฉด, ๊ทธ ๊ฐ์ true
์ด๋ค. ์๋ํ๋ฉด, ์ขํญ๊ณผ ์ฐํญ์ ๊ฐ์ด ๋ชจ๋ โ1โ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ์
์ ์๊ดํ์ง ์๋๋ค.
===
๋ ์ขํญ๊ณผ ์ฐํญ์ ๊ฐ๋ฟ๋ง ์๋๋ผ, ํ์
๋ ๋น๊ตํ๋ค. ๋ง์ฝ 1 == "1"
๊ณผ ๊ฐ์ ํํ์ด ์๋ค ํ๋ฉด, ๊ทธ ๊ฐ์ false
์ด๋ค. ์๋ํ๋ฉด, ์ขํญ๊ณผ ์ฐํญ์ ๊ฐ์ ๋ชจ๋ โ1โ์ด์ง๋ง, ์ขํญ์ ํ์
์ Number
์ด๊ณ , ์ฐํญ์ ํ์
์ String
์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด null == undefined
์ null === undefined
๋ ์ด๋จ๊น?
null
๊ณผ undefined
๋ ๊ฐ์ด ๊ฐ์ด ์์์ ๋ดํฌํ์ง๋ง null
์ ๊ฐ์ด ์์์ ๋ช
์์ ์ผ๋ก ํํํ ํํ์ด๊ณ undefined
๋ ๊ฐ์ด ์์์ ์์์ ์ผ๋ก ํํํ ํํ์ด๋ค.
๊ทธ๋์ null == undefined
๋ true
์ด๊ณ null === undefined
๋ false
๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ ์๊ฒฉํ ๋น๊ต๊ฐ ํ์ํ๋ค๋ฉด ===
, ๊ฐ๋ง ๋น๊ตํ๋ค๋ฉด ==
๋ฅผ ์ฌ์ฉํ์.
typeof
์ instanceof
๋ 2.1์ ๋ฌธ์ ์ฒ๋ผ ๊ฐ์ ๋ชฉ์ ์ ์ถ๊ตฌํ์ง๋ง, ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
์ฐ์ typeof
๋ unary operator์ด๋ฉฐ, ๋ฆฌํด ๊ฐ์ ๊ฐ ๋ณ์์ primitive type์ String
ํ์
์ ๊ฐ์ง ๊ฐ์ผ๋ก ์ค๋ค.
e.g)
typeof 3; // === 'number'
typeof 'str'; // === 'string'
typeof {}; // === 'object'
typeof []; // === 'object'
typeof function () {}; // === 'function'
typeof null; // === 'object'
instanceof
๋ binary operator์ด๋ฉฐ, ๋ฆฌํด ๋ฐธ๋ฅ๋ ๊ฐ ๋ณ์์ prototype์ chain์ ๋น๊ตํ ๋ค Boolean
์ผ๋ก ์ค๋ค.
e.g)
"foo" instanceof String; // === false
"foo" instanceof Object; // === false
true instanceof Boolean; // === false
true instanceof Object; // === false
[0,1] instanceof Array; // === true
{0:1} instanceof Object; // === true
var color1 = new String("red");
var color2 = "red";
color1 == color2; // === true
color1 instanceof String; // === true
color2 instanceof String; // === ๋ฌด์์ผ๊น์?
์์ ๋ด์ฉ์ ๋ณด๊ณ ์ ๊ฒ์ ํด๋ณด์. ๋ง์ง๋ง์ ๋ต์ ๋ฌด์์ผ๊น? ๋ต์ ๋ฐ๋ก false
์ด๋ค. ๋ง์ฝ ๋ต์ ๋งํ์ง ๋ชปํ๋ค๋ฉด ๋ค์์ ์ฝ๊ณ ๋ค์ ๋ณด์.
์ด์ ๊ด๋ จ๋ ๋ด์ฉ์ธ, ํ๋กํ ํ์ ์ ๊ดํ ๋ด์ฉ์ JavaScript ํฌ์คํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ๋ค๋ค๋ณผ ์์ ์ด๋ค.
๋ณ ๋ค๋ฅธ ๋ฌธ๋ฒ ์์ด ์ค๊ดํธ๋ง์ ์ฌ์ฉํ์ฌ ์ ์ธํ๋ ๋ฐฉ์์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ด๋ผ๊ณ ๋งํ๋ค.
var object = {
name: "Yunhoe",
age: 23,
gender: "male"
}
Object์ ์์ฑ์ ํจ์์ธ, new Object()๋ฅผ ์ฌ์ฉํด์ ์ ์ธํ๋ ๋ฐฉ์์ด๋ค. new Object()
๋ก ์ ์ธํ ๊ฐ์ฒด๋ ์ด๊ธฐ์ ๋น์ด์๋ค.
var object = new Object(); // Empty object
object.name = "Yunhoe";
object.age = 23;
object.gender = "male";
Java๋ C++์ class
์ ๋งค์ฐ ๋น์ทํ ํ์์ด๋ค. ๋ง ๊ทธ๋๋ก ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ด๋ค.
function person(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
}
var object = new person("Yunhoe", 23, "male")
ES6๋ถํฐ ์ถ๊ฐ ๋ ๋ฌธ๋ฒ์ผ๋ก, ์ฐ๋ฆฌ๊ฐ ํํ๋ค ์๊ณ ์๋ class
์ ์ฌ์ฉ์ ํธํ๊ฒ ํ๊ณ ์ ๋ง๋ ๋ฌธ๋ฒ์ด๋ค.
๊ทธ๋ ๋ค๊ณ ์ด class
๋ javascript์ ๊ธฐ์กด ๋ชจ๋ธ์ธ ํ๋กํ ํ์
๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ
์ ํ๊ธฐํ๊ฒ ์๋๋ค.
๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ ํจํด์ Syntatic Sugar์์ ์์์ผ ํ๋ค.
class person {
constructor(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
}
}
var object = new person("Yunhoe", 23, "male");
๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉ๋๋ method๋ก์จ, ์๋ฒ์ ์กด์ฌํ๋ resource๋ฅผ requestํ๋๋ฐ ์ฌ์ฉ๋๋ค.
์๋ฒ๋ response๋ก body์ resource์ content๋ฅผ ์ค์ด์ ๋ณด๋ธ๋ค.
GET method์ ๋น์ทํ๊ฒ ์๋ฒ์ resource๋ฅผ requestํ์ง๋ง, response๋ก header๋ง ๋ฐ๋๋ค.
HEAD๋ฅผ ์ฌ์ฉํ๋ฉด resource๋ฅผ requestํ์ง ์์๋ object์ ์กด์ฌ๋ฅผ ํ์ธํ ์ ์๊ณ ์์ ์ด ๋์๋์ง๋ ํ์ธ ํ ์ ์๋ค.
๊ฐ์ธ์ ์ผ๋ก GET์ find ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
GET method์ ์ ๋ฐ๋๋ก ์๋ฒ์ ๋ฌธ์๋ฅผ ์ธ ๋ ์ฌ์ฉํ๋ค.
PUT method๋ ์๋ฒ๊ฐ client์ request body๋ฅผ ํ์ธํ๊ณ , ๋ง์ฝ ์๋ฒ์ ํด๋น request์ ๊ด๋ จ๋ URL์ด ์กด์ฌํ๋ค๋ฉด replaceํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด createํ๋ค.
ํด๋น method๋ URL์ ์ง์ ์์ ํ๋ฏ๋ก, ์น ์ฌ์ดํธ๋ฅผ ๋ณ์กฐํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ๋ง ํ ๊ฒ์ด๋ค.
PUT method์ ๋น์ทํ๊ฒ ์๋ฒ์ resource data๋ฅผ HTMLํผ์ ์ด์ฉํ์ฌ ์ ์กํ ๋ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ PUT method์ ๋ค๋ฅธ ์ ์ด ์๋๋ฐ, ๋ฐ๋ก ๋ฉฑ๋ฑ์ฑ(idempotency)์ ์ฐจ์ด์ด๋ค.
๋์ผํ ์์ฒญ์ ํ ๋ฒ ๋ณด๋ด๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๋ฒ ์ฐ์์ผ๋ก ๋ณด๋ด๋ ๊ฒ์ด ๊ฐ์ ํจ๊ณผ๋ฅผ ์ง๋๊ณ , ์๋ฒ์ ์ํ๋ ๋์ผํ๊ฒ ๋จ์ ๋, ํด๋น HTTP ๋ฉ์๋๊ฐ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ก๋ค๊ณ ๋งํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋์ ์ฐจ์ด๋ผ๋๊ฒ์, PUT method๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ก์ง๋ง POST method๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์ด๋ค.
ํด๋น ๋ด์ฉ์ ์ถํ์ ๋ค๋ฅธ ํฌ์คํธ๋ฅผ ํตํ์ฌ ์์ธํ ๋ค๋ฃจ์ด ๋ณผ ์์ ์ด๋ค.
Client์ request๋ firewall, proxy server, gateway ๋ฑ์ ๊ฑฐ์น๋ฉด์ ์์ ๋ ์ ์๋ ์ฌ์ง๊ฐ ์กด์ฌํ๋ค.
TRACE method๋ ์์ ๋จ๊ณ๋ค์ ๊ฑฐ์น๊ณ ๋์ ์ต์ข
๋ชฉ์ ์ง(์๋ฒ)์ ๋์ฐฉํ์ ๋์ request๋ ์ด๋ป๊ฒ ์๊ฒผ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ method์ด๋ค.
OPTIONS method๋ ์๋ฒ๊ฐ ์ด๋ ํ method๋ค์ ์ง์ํด์ฃผ๋์ง ํ์ธํ๋ method์ด๋ค.
DELETE method๋ request์ ๊ธฐ์ฌ๋ URL์ ํด๋น๋๋ resource๋ฅผ ์ญ์ ํ ์ ์๋๋ก ํ๋ method์ด๋ค.
์ฃผ์ํด์ผํ ์ ์, HTTP ๋ช
์ธ์์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ DELETE request๋ฅผ ๋ฌด์ํ ์ ์์ผ๋ฏ๋ก 100% ์ญ์ ๊ฐ ๋จ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค๋ ์ ์ด๋ค.
๋ ๋ค JavaScript์ ํน์ฑ ๋๋ฌธ์ ์๊ธฐ๋ ๋ฌธ์ ์ธ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ํจํด์ด๋ค.
์์๋ฅผ ํ๋ ๋ค์ด๋ณด์. ๋ง์ฝ ๋น์ ์ด ์น ์ฌ์ดํธ๋ฅผ ์ด์ํ๊ณ , ๊ทธ ์ฌ์ดํธ์์ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํด๋จ๋๋ฐ ๊ทธ๊ฒ๋ค์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๋๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ ๋ง ๋์ฐํ๊ฒ ๋ ๊ฒ์ด๋ค. ๋น์ ์ ์น ์ฌ์ดํธ์ ์ด์ฉ์๋ค์, ๋จ์ํ ์ข์์๋ฅผ ๋๋ฆ์๋ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๊ฐ ๋์ ๋ค๋ฅธ ๊ฒ์๊ธ๋ค์ ๋ณด์ง ๋ชปํ๊ฒ ๋ ๊ฑฐ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ ๋ ์์๋ฅผ ๋ค์ด๋ณด์. ๋ง์ฝ ๋น์ ์ ์น ์ฌ์ดํธ๊ฐ ์์ฒญ๊ณผ ์๋ต์ด ๋ชจ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ค๊ณ ๋ง์ด๋ค. ์ด๋ค ์ํฉ์ด ์ผ์ด๋ ๊น?
๋น์ ์ ์น ์ฌ์ดํธ ์ด์ฉ์๋ค์ ๋น๋๊ธฐ์ ์ธ ์์ฒญ์ ๋ง์กฑํ ๊ฒ์ด๋ค. ๋๊ธ์ ๋ฌ๊ณ ๋์์ ์ข์์๋ ๋๋ฅผ ์ ์๊ณ . ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๋ค. ๋น์ ์ ์ฝ๋์ ๋ง์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฌ๋๋ค์ ๋๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ง๊ธฐ ๋ง๋ จ์ด๋ค. ์์ฐจ์ ์ธ ํ๋ฆ์ด ์๋ค๋ ๊ฒ์ด๋ค. ๋ก๊ทธ์ธ์ผ๋ก ์๋ฅผ ๋ค์ด๋ณด๋ฉด, ๋ก๊ทธ์ธ ์ฐฝ์ด ๋์ค๊ณ ๊ทธ ์ดํ์ ์ ๋ ฅํ๊ณ ๊ทธ ์ดํ์ ์ ์ถํ๊ณ ๊ทธ ์ดํ์ ์ธ์ฆํ๊ณ ๋ฑ๋ฑ..
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ต์ด ๋์ฐฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๋น์ ์ ์ฝ๋๋ ์์ฐจ์ ์คํ์ ๋ณด์ฅํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ์๋, ์ ์ง ๋ฐ ๋ณด์ํ๋๊ฒ ํ๋ค ๊ฒ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ์กด์ฌํ๋ ๊ฒ๋ค์ด Callback๊ณผ Promise์ด๋ค.
function getData() {
var data;
axios.get('https://idonknowurl.com/posts/1', function(response) {
data = response;
});
return data;
}
console.log(getData()); // undefined
C, C++, java ๊ทธ๋ฆฌ๊ณ python๊ณผ ๊ฐ์ ์ธ์ด์์๋ ์ดํด๊ฐ ๊ฐ๊ธฐ ์ด๋ ค์ด ๊ฒฐ๊ณผ์ด๋ค. ์ undefined๊ฐ ๋์ฌ๊น? ์ด์ ๋ ์์์๋ ๋งํ์ง๋ง, JavaScript๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, JavaScript๋ axios.get์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ์คํํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ์ ๋ํด์ ์๊ฐ์ ํด์ผ๋ง ํ๊ณ , ๊ทธ๊ฒ์ ํด๊ฒฐ๋ฐฉ์์ด callback pattern์ธ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ Callback pattern์ ๋ง ๊ทธ๋๋ก callback ํจ์๋ฅผ ์ฌ์ฉํ๋ ํจํด์ด๋ค. ๊ทธ๋ ๋ค๋ฉด Callback ํจ์๋ ๋ฌด์์ผ๊น?
๋ง ๊ทธ๋๋ก โcallbackโ, ๋์ค์ ํน์ event๋ point์์ ๋ถ๋ฅด๊ฒ ๋ค๋ ํจ์์ด๋ค. ์ฐ๋ฆฌ๋ ์ด ํจ์ํจํด์ ์ด์ฉํด์ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ค์๊ณผ ๊ฐ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
function getData(callback) {
axios.get('https://idonknowurl.com/posts/1',
function(response) {
callback(response)
});
}
getData(function(Data) {
console.log(Data)
});
์ด๋ ๊ฒ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๋ก์ง์ด ๋๋ฌ์ ๋ ์ํ๋ ๋์์ ์คํ์ํฌ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ ์ข์ Callback์ ๋จ๋ฐํ๊ฒ ๋๋ค๋ฉด โCallback Hellโ์ด๋ผ๋ ๋ฌธ์ ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ฝ๋ฐฑ ๋ค์ ์ฝ๋ฐฑ, ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฐฑ.. ์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ค ๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ธฐ๊ดดํ ๊ตฌ์กฐ์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๊ฒ ๋๋ค. ์ด๋ฅผ ์ฐ๋ฆฌ๋ โCallback Hellโ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Callback Hell์ด ๋ฌธ์ ์ธ ์ด์ ๋ ๊ฐ๋ ์ฑ์ ํ๋ฝ, ๋ก์ง ๋ณ๊ฒฝ์ ์ด๋ ค์, ์ฝ๋ ์คํ ์์ ํ์ ์ ์ด๋ ค์, ๊ทธ๋ฆฌ๊ณ ์ฝ๋์ ์ ์ง ๋ฐ ๋ณด์๊ฐ ํ๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
Callback Hell์ ๋ฌด์์์ ์ ํํํด์ฃผ๋ ์ฌ์ง
๊ทธ๋ ๋ค๋ฉด ์ ๋ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ callback ํจํด์ ์ธ๋ฉฐ ๊ฒจ์๋จน๊ธฐ๋ก ์ฌ์ฉํด์ผ ํ ๊น? ๋คํํ๋ Promise๋ผ๋ ๋์์ด ์กด์ฌํ๋ค. ๊ทธ๋ ๋ค๋ฉด Promise๋ ๋ฌด์์ผ๊น?
๋ค์์ ์ฌ์ดํธ์์๋ Promise๋ฅผ ์๋์ ๊ฐ์ด ์ค๋ช ํ๋ค.
A promise is an object that may produce a single value some time in the future
์ฝ๊ฒ ๋งํ์๋ฉด, Promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ์ฒด์ด๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅ์๋ก์จ, ์ดํ์ ๊ณผ์ ๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ผ์ข ์ ์ง๊ฒ๋ค๋ฆฌ ์ญํ ์ ํด์ค๋ค.
Promise๋ callback๊ณผ ๋์ผํ๊ฒ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ก์ง์ด์ง๋ง, callback๊ณผ ๋ค๋ฅธ์ ์ด ์๋ค. ๋ฐ๋ก ์ํ๊ฐ ์๋ค๋ ์ ์ด๋ค. ํ ๋ฒ ์์๋ณด์.
Promise๋ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง ์ํ๊ฐ ์กด์ฌํ๋ค.
์ด ์ํ๋ฅผ Promise์ ๋ถ๊ธฐ์ ์ผ๋ก ์ผ์, ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์งํํ ์ ์๋ค. ์์์ ์๋๋ก ๊ฐ๋ ์ผ๋ฐ์ ์ธ ์ฝ๋ ์์๋ฅผ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๋ฏ๋ก ์ฝ๋์ ์ ์ง ๋ฐ ๋ณด์๊ฐ ์ฝ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก callback์์ ๋์จ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค.
function getData() {
return new Promise(function(resolve, reject) {
axios.get('https://idonknowurl.com/posts/1', function(response) {
if (response) {
resolve(response);
}
reject(new Error("Request is failed"));
});
});
}
getData()
.then(function(data) {
console.log(data); // response ๊ฐ ์ถ๋ ฅ
})
.catch(function(err) {
console.error(err); // Error ์ถ๋ ฅ
});
์์ ๋ฌธ์ ์ ๋น์ทํ ๋๋์ฒ๋ผ, Callback๊ณผ Promise์ Async&await ๋ชจ๋ JavaSscript์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ๋ค์ด๋ค.
ํ์ง๋ง Callback๊ณผ Promise๊ฐ ์ฐจ์ด๊ฐ ์๋ฏ์ด, Promise์ Async&Await๋ ์ฐจ์ด๊ฐ ์กด์ฌํ๊ธฐ ๋ง๋ จ์ด๋ค. ๊ทธ ์ฐจ์ด์ ์ ๋ณด๋ ๋ค์์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์๋ค.
์ฐ๋ฆฌ๋ Promise๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ก์ง์ ์ฒ๋ฆฌํ ๋ then()๊ณผ catch(), resolve()์ reject()๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ํ์๋ค. Callback hell์ ํผํ๊ธฐ ์ํ ์ฅ์น์ด๊ธฐ๋ ํ์๊ณ , ์ค์ ๋ก ๋ณด๊ธฐ์ ๊น๋ํ๋ค.
๊ทธ๋ฌ๋ async&await์ ์ฌ์ฉํ๋ฉด, promise๋ณด๋ค ๋ ๊น๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง ๋น๋๊ธฐ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์์ ์์ async๋ฅผ ๋ถํ๊ณ , ๋ด๋ถ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ถ๋ถ์ await์ ๋ถํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ฌ์ง์ด return์ ํ์๋ promise๋ก ๋ฐํ๋์ด ๋์ค๊ธฐ ๋๋ฌธ์, ์ด์ ์ promise๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์๋์๋ค.
Promise ๋ด๋ถ์์ ์์ ๋์ค๋ error๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋, try/catch
๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ๊ทธ error๋ Promise ๋ด๋ถ์์ ๋์จ error์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ๋น์ ์ด ๊ทธ๋ฌํ error๋ฅผ ์ก๊ณ ์ถ๋ค๋ฉด, ๊ทธ error ์ฒ๋ฆฌ๋ฌธ์ promise ๋ด๋ถ์ ๋ค์ด๊ฐ ์์ด์ผ๋ง ํ๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ async&await์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค. ํด๋น ๊ตฌ๋ฌธ์, try/catch
๊ตฌ๋ฌธ์ผ๋ก error๋ฅผ ๊ฒ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค!
Promise์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์ ๋ Promise๋ฅผ ๋ฐํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐ์์ ๋ Promise๋ฅผ ๋ฐํํ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ์๊ฐํ์.
์์๋ ์๋์ ๊ฐ๋ค.
const makeRequest = () => {
return promise1()
.then(value1 => {
return promise2(value1)
.then(value2 => {
return promise3(value1, value2)
})
})
}
์ด๋ฌํ Nested๋ promise๋ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋, ๋ง์น Callback hell๊ณผ๋ ๋น์ทํ ๊ฒฝํ์ ์ ์ฌํด์ค๋ค.
๋ง์ฝ ์ด๋ฐ ์ํฉ์ async&await์ผ๋ก ํด๊ฒฐํ๋ค๋ฉด? ๊ฝค๋ ๊ฐ๋จํ๊ฒ ์ค์ฌ์ง๋ค. ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
const makeRequest = async () => {
const value1 = await promise1()
const value2 = await promise2(value1)
return promise3(value1, value2)
}
ํด๋น ๋ฌธ์๋ ๋ค์์ ์นจ๊ณ ํ์๋ค.
JavaScript์๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฐฉ์์ด 2๊ฐ์ง๊ฐ ์กด์ฌํ๋๋ฐ, ๊ทธ 2๊ฐ์ง๊ฐ ๋ฐ๋ก Event Bubbling/Event Capture์ด๋ค.
Event Bulbbing: ํน์ ํ๋ฉด ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ํด๋น ์์์ ์ด๋ฒคํธ๊ฐ ํด๋น ์์์ ์์ ์์๋ก ์ ํ๋๋ ํน์ฑ
์ด๋ฒคํธ ์บก์ณ: ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ ๋ฐ๋์ ๋ฐฉ์. ์์ ์์์์ ํ์ ์์๋ก ํผ์ ธ๋๊ฐ์ ์๋ฏธํจ.
+) event.stopPropagation(), Event Delegation
์ด์ ๊ฐ์ ํ์์์ ์์ ์์๋ก์ ์ด๋ฒคํธ ์ ํ ๋ฐฉ์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง(Event Bubbling)์ด๋ผ๊ณ ํฉ๋๋ค.
Vue์์๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๋ถ๋ถ๋ค์ ์์ฃผ ์ธ๊ธํ๋ค. Mixin๋ ์ฌ์ฌ์ฉ์ ์ด์ ์ ๋ง์ถ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค.
Mixin์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ ์ต์ ๋ค์ ์ํ ๊ธฐ๋ฅ์ธ๋ฐ, ์ปดํฌ๋ํธ์ mixin์ผ๋ก ์ ์ธํ ๋ณ์๋ค์ ์ฃผ์ ํ๊ฒ ๋๋ค๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ mixin์ ์ต์ ์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ๋ค. ๋ง ๊ทธ๋๋ก โmix-inโ, ์์ฌ ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ด๋ค.
var myMixin = {
created: function () {
this.hello()
},
methods: {
hello: function () {
console.log('hello from mixin!')
}
}
}
var Component = Vue.extend({
mixins: [myMixin]
})
var component = new Component() // => "hello from mixin!"
Vue ๊ฐ์ฒด๋ฅผ extendํ component์ mixin๊ฐ์ผ๋ก myMixin์ ํ ๋นํด์ฃผ๋ myMixin์ ํน์ฑ์ ๊ฐ์ ธ๊ฐ๊ฒ ๋์๋ค. Mix-in๋ ๊ฒ์ด๋ค!
Vue์ eventbus๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ฌ์ฉํ๋ค.
Vue์ ๋ถ๋ชจ์ ์์(Parent and child)๋ ๋ฐ์ดํฐ๋ฅผ props์ event์ ํ์์ผ๋ก ์ฃผ๊ณ ๋ฐ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ด๊ฐ ๋ถ๋ชจ์๊ฒ์ ๋ณ์๋ฅผ ์์์ ์์์ ์์์ ์์์ ์์์ ์์์๊ฒ ์ฃผ๋ ค๋ฉด..?? ์ด ๋ชจ๋ ๊ฒ์ props๋ก ์ฐ๊ฒฐ์์ผ์ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์ ๋ง ํฉ๋ฆฌ์ ์ผ๊น?
์ด๋ฌํ ์ํฉ์์ ์ข ๋ ์์ ๋กญ๊ฒ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ํต์ ์ ํ ์ ์๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก eventbus์ด๋ค. ์ด๋ป๊ฒ ์ฐ๋์ง๋ ๋ค์ ๋ฐฉ๋ฒ์ ๋ณด์.
(componentA.vue)
Vue.prototype.EventBus = new Vue();
export default {
name: 'componentA',
methods: {
showMsg: function() {
this.EventBus.$emit('alertMessage', 'Hello');
});
}
}
(componentB.vue)
Vue.prototype.EventBus = new Vue();
export default {
name: 'componentB',
mounted: function() {
this.EventBus.$on('alertMessage', function(payload) {
console.log(payload)
});
}
}
ํด๋น ์์ ๋ ๋ค์์์ ๊ฐ์ ธ์์ผ๋ฉฐ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ Vue.prototype.EventBus ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ, โcomponentAโ์์๋ event๋ฅผ emitํ๊ณ โcomponentBโ์์๋ event๋ฅผ listenํ์ฌ โcomponentAโ์์ ์ ๋ฌ๋ฐ์ ๋ณ์์ธ โHelloโ๋ฅผ payload๋ก ๋ฐ์ ์ถ๋ ฅํ๋ค.
์ด๋ ๋ฏ eventbus๋ component๊ฐ์ ์์ ๋ก์ด ํต์ ์ ํ๋ฝํด์ฃผ๋๋ก ํ์ง๋ง, ์ ์ญ ๋ฒ์๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด ๋ฐ์ดํฐ ์ถฉ๋์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ๋ง ํ๋ ๋จ์ ์ด ์๋ค.
Vue์์๋ component๋ฟ๋ง ์๋๋ผ instance๋ค๋ Lifecycle์ ๊ฐ์ง๊ณ ์๋ค.
Vue์ Lifecycle์ด ๋ฌด์์ด๋๋ฉด, ๋ง ๊ทธ๋๋ก component๋ instance๋ค์ ์๋ช ์ฃผ๊ธฐ์ด๋ค. ์์ฑ๋ ๋๋ถํฐ ํ๊ดด๋๋ ์์ ๊น์ง์ ๊ณผ์ ๋ค์ ๊ฑฐ์น๋ ๊ฒ์ ์ค๋ช ํ๋ ๊ฐ๋ ์ด๋ค.
ํฌ๊ฒ created, mounted, updated, destroyed์ 4๊ฐ์ง ๊ตฌ์ฑ์ผ๋ก ๋ณผ ์ ์์ผ๋ฉฐ ์ด ์ฃผ๊ธฐ๋ค์ ์ด๋ฆ์ผ๋ก ๊ฐ๋ ํจ์๋ฅผ ์ด์ฉํด์ ํน์ lifecycle์ ํน์ method๋ค์ ๋ถ๋ฅผ ์ ์๊ฒ ํ์ฉํด์ค๋ค.
์์ธํ ๊ทธ๋ฆผ์ Vue ๊ณต์์ฌ์ดํธ์์ ์ ๊ณตํด์ฃผ๋ ๋ค์ ์ฌ์ง์ผ๋ก ๋์ฒดํ๋ค.
์์ธํ ๋ด์ฉ์ ์ด ์ฌ์ดํธ๋ก ๋์ฒดํ๊ฒ ๋ค.. ์ ๋ชจ๋ฅด๋ ๋ด์ฉ์ด๋ค..
Vuex๋ ์ํ๊ด๋ฆฌ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฐ์ , vuex๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ํ๊ด๋ฆฌ์ ๋ํด์ ๋จผ์ ์ ํ์๊ฐ ์๋ค.
๋ค์์ ์ฌ์ดํธ์์๋ ์ํ๊ด๋ฆฌ๋ฅผ ์ด๋ ๊ฒ ์ค๋ช ํ๋ค.
์ํ ๊ด๋ฆฌ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ๊ณผ ์ด๋ฒคํธ ํต์ ์ ํ๊ณณ์์ ๊ด๋ฆฌํ๋ ํจํด์ ์๋ฏธํฉ๋๋ค. ๋ทฐ์ ์ฑ๊ฒฉ์ด ๋น์ทํ ํ๋ ์์ํฌ์ธ ๋ฆฌ์กํธ(React)์์๋ Redux, Mobx์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ๋ทฐ์์๋ Vuex๋ผ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ํ๊ด๋ฆฌ๋ก ํด๊ฒฐํ ์ ์๋ ์ผ์ด ๋ฌด์์ด๊ธธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ๋ง๋ค์์๊น? ์์ ์ฌ์ดํธ์์ , ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ๋ค.
์ํ ๊ด๋ฆฌ๋ ์ค๋ํ ๊ท๋ชจ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ์ ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ทฐ์ ์ปดํฌ๋ํธ ํต์ ๋ฐฉ์์ธ props, event emit ๋๋ฌธ์ ์ค๊ฐ์ ๊ฑฐ์ณํ ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง๊ฑฐ๋, ์ด๋ฅผ ํผํ๊ธฐ ์ํด Event Bus๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ค์ด ๊ฒ
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐ์ดํฐ ํต์ ์ ํ ๊ณณ์์ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ํ ๊ด๋ฆฌ๋ผ๊ณ ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ด๋ฐ ์ํ๊ด๋ฆฌ๋ฅผ ํธํ๊ฒ, ๊ทธ๋ฆฌ๊ณ ํจ์จ์ ์ผ๋ก ํ๋ค๋ ์ ์์ Vuex๋ฅผ ์ฐ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
position
์์ฑ์ CSS์์ ๋ ์ด์์์ ๋ฐฐ์นํ ๋ ์ฌ์ฉํ๋ ์์ฑ์ด๋ค.
position
์์ฑ์ top
, right
, bottom
๊ทธ๋ฆฌ๊ณ left
์ ๊ฐ์ผ๋ก ์์น๋ฅผ ์กฐ์ ํ ์ ์์ผ๋ฉฐ, ์์๋๋ ๊ฐ์ด ์๋๋ค.
position
์์ฑ์๋ 4๊ฐ์ง์ ์์ฑ์ด ์กด์ฌํ๋๋ฐ static
, relative
, absolute
๊ทธ๋ฆฌ๊ณ fixed
์์ฑ์ด ์กด์ฌํ๋ค.
1. static: "default"์์ฑ์ด๋ฉฐ, ๋ณ๋ค๋ฅธ ์์น๋ฅผ ์ง์ ํ์ง ์์๋ ์ฌ์ฉํ๋ค.
2. relative: ์์น๊ณ์ฐ์ ํ ๋, ๊ฐ์ฒด๊ฐ "static"์ผ๋์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ ์ด๋์ํฌ ์ ์๋ค.
3. absolute: ์์น๊ณ์ฐ์ ํ ๋, ๊ฐ์ฒด์ ์์์์(static ์์ฑ์ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด๋ ์ ์ธ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ๋ก ์ด๋ํ ์ ์๋ค. ๊ฐ์ฒด์ ์์์์๊ฐ ์๋ค๋ฉด, ๊ธฐ์ค์ html ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ก๋๋ค.
4. fixed: ํ์ฌ ๋ธ๋ผ์ฐ์ ์ ํ๋ฉด์ ๋ํ ์์น๋ฅผ ๊ฐ์ง๋ฉฐ, ํ๋ฉด์ด ์ด๋ํจ์ ๋ฐ๋ผ ๋ณํ๋ ์์น๊ฐ ์๋ ๊ณ ์ ๋ ์์น๊ฐ์ ๊ฐ์ง๋ค.
๋น์ทํ ์์ฑ์ผ๋ก๋ float
๊ฐ ์กด์ฌํ๋๋ฐ, ๋น์ทํ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅด๋ ๋ชจ๋ ์๊ณ ๋์ด๊ฐ์.
block
์์ฑ์ ์ผ๋ฐ์ ์ธ div
ํ๊ทธ์ ์์ฑ๊ณผ ๋น์ทํ๋ค. block
์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ height
๋งํผ์ ํ ์ค์ ์ฐจ์งํ๊ฒ ๋๊ณ , ๋ค์ ํ๊ทธ๋ ๋ค์ ์ค๋ก ๋์ด๊ฐ๋ค.
inline
์์ฑ์ ์ผ๋ฐ์ ์ธ span
ํ๊ทธ์ ์์ฑ๊ณผ ๋น์ทํ๋ค. inline
์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ text ๋งํผ์ ํฌ๊ธฐ๋ฅผ ์ ์ ํ๋ฉฐ, width
, height
, margin
๊ทธ๋ฆฌ๊ณ line-height
๋ฑ์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
inline-block
์์ฑ์ ์์ ๋ ๊ฐ์ง ์์ฑ์ธ, block
๊ณผ inline
์์ฑ์ ๋ ๊ฐ์ง ํผํฉํ ์์ฑ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค. inline
์์ฑ๊ณผ ๋น์ทํ๊ฒ ํ ์ค์ด์ง๋ง block
ํํ๋ฅผ ์ ์งํ๊ณ ์๊ณ width
, height
๊ทธ๋ฆฌ๊ณ line-height
๋ฑ inline
์์ฑ์์ ์ปจํธ๋กค ํ ์ ์์๋ ์์ฑ๋ค์ ์ปจํธ๋กค ํ ์ ์๊ฒ ๋๋ค.
๊ด๋ จ ์ง์์ ์ฐพ๋ค๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ดํธ์์ ์ด๋ฌํ ๋ฌธ์ฅ์ ๋ณด์๋ค.
ํผํฌ๋จผ์ค์ ์ฐจ์ด๋ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์์๋ณผ ์ ์์๋ค.
๋จผ์ left๋ฅผ ์ด์ฉํ์ฌ ๋ชจ์
์ ๊ตฌํํ์ ๋์ Timeline ๋ชจ์ต์ด๋ค.
์ด 5.4์ด์ ์๊ฐ๋์ ๋ชจ์
์ด ์ด๋ฃจ์ด์ก๊ณ Rendering ์๊ฐ์ 247.9 ms, Painting ์๊ฐ์ 292.6 ms ๊ฑธ๋ ธ๋ค.
๋๋ฒ์งธ transform:translate๋ฅผ ์ด์ฉํ์ฌ ๋ชจ์
์ ๊ตฌํํ์ ๋์ Timeline ๋ชจ์ต์ด๋ค.
์ด 5.6์ด์ ์๊ฐ๋์ ๋ชจ์
์ด ์ด๋ฃจ์ด์ก๊ณ Rendering ์๊ฐ์ 18.6 ms, Painting ์๊ฐ์ 5.1 ms ๊ฑธ๋ ธ๋ค.
์ซ์๋ง ๋์ถฉ ๋ด๋ ๋น์ทํ ์๊ฐ์ ํ ์ชฝ์, rendering๊ณผ painting์ ์์ํ๋ ์๊ฐ์ด ์๋นํ์ง๋ง ๋ค๋ฅธ ํ๋๋ ๊ทธ๋ ์ง ์๋ค.
์ ์ด๋ฌํ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๊น? ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์๊ธฐ ์ํด์ ๋ธ๋ผ์ฐ์ ์ ๋์์๋ฆฌ์ ๋ํด์ ์ ํ์๊ฐ ์๋ค.
๋ธ๋ผ์ฐ์ ์ ๋์์๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฐจ์ด๊ฐ ์์ง๋ง, ๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ถ๋ฌ์ค๊ธฐ : ๋ฆฌ์์ค ํ์ผ ๋ก๋ฉ
2. ํ์ฑ : DOM ํธ๋ฆฌ๋ฅผ ์์ฑ
3. ๋ ๋๋ง ํธ๋ฆฌ ์์ฑ : ํ๋ฉด์ DOM์ ํ์ํ๊ธฐ ์ํด์๋, ์์น ๋ฐ ํฌ๊ธฐ ์ ๋ณด๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ณ๋์ ํธ๋ฆฌ(๋ ๋๋ง ํธ๋ฆฌ)๊ฐ ํ์ํ๋ฐ, ์ด ํธ๋ฆฌ๋ฅผ ์์ฑ
4. CSS ์คํ์ผ ๊ฒฐ์ : ํน์ ํ๊ทธ์ ์ด๋ ํ ์คํ์ผ์ด ์ ์ฉ๋จ์ ํ์ธ
5. ๋ ์ด์์ : ๊ฐ ๊ฐ์ฒด๊ฐ ์์น์ ํฌ๊ธฐ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ ๊ณผ์
6. ํ์ธํ
: ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ํ์ํ๋ฉฐ ํน์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ RGB๊ฐ์ ์ฃผ์
left
๋ ์ด ๊ณผ์ ์์์ element๊ฐ ์ด๋ํ๋ ๋์์ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๊ณ , CSS ์คํ์ผ์ ์ฌ๊ฒฐ์ ํ๊ณ , ๋ ์ด์์์ ์ฌ์ค์ ํ๋ฉฐ ๊ทธ๋ฆฌ๊ณ ํ์ธํ
์ ๋ค์ํ๊ฒ ๋๋ค.
๋ฐ๋ฉด translate
๋ element๊ฐ ์ด๋ํ๋ ๋์์ ์์ ๊ฐ์ ๊ณผ์ ์ด ๋ ์ผ์ด๋๋๊ฒ์ ๋ณผ ์๊ฐ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก performance ์ธก๋ฉด์์ translate
์ ํตํ ์ด๋์ด left
์ ํตํ ์ด๋๋ณด๋ค optimalํ๋ค๋ ์ ์ด ์ฐจ์ด์ ์ด๋ค.
๊ด๋ จ๋ ๋ด์ฉ์ ๋ค์์์๋ ๋ณผ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก HTTP ์์ฒญ์ <img>
, <link>
๊ทธ๋ฆฌ๊ณ <script>
ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ํ์ฉ๋๋ค.
๊ทธ๋ฌ๋ <script></script>
์ ํ๊ทธ ๋ด๋ถ๋ถ๋ถ์์ ์ธ๋ถ ์๋ฒ๋ก ์์ฒญ๋๋ CORS๋ Same Origin Policy๋ผ๋ ๋ณด์์์ ์ด์ ๋ก ์์ฒญ์ ๊ธ์งํ๋ค.
๋ค์์ ์์(์ถ์ฒ)์ด๋ค.
e.g) ์ฌ์ดํธ ๋๋ฉ์ธ์ด www.a.com ์ผ ๊ฒฝ์ฐ...
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === xhr.DONE) {
if (xhr.status === 200 || xhr.status === 201) {
console.log(xhr.responseText);
} else {
console.error(xhr.responseText);
}
}
};
xhr('get', 'https://www.b.com/api/v1/user/13');
xhr.send();
์์์์ ์ฐ๋ฆฌ๋ ์ฌ์ดํธ ๋๋ฉ์ธ์ด www.a.com์ธ ๊ณณ์์, ๋๋ฉ์ธ์ด www.b.com์ธ ๊ณณ์ผ๋ก HTTP ์์ฒญํจ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ์์ฒญ์ ํ๋ค๋ฉด, ํ๋กํ ์ฝ(http/https), ํฌํธ๋๋ฒ, ๋๋ฉ์ธ์ด ๋ค๋ฅธ ์๋ฒ๋ก HTTP ์์ฒญ์ ํ์ผ๋ฏ๋ก CORS ๊ด๋ จ ์๋ฌ๊ฐ ๋์ค๊ฒ ๋๋ค.
์ด๋ฌํ CORS ๊ด๋ จ ์๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌํ๋ค.
์ด๋ก ์ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค..!!
์ค์ํ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋๋ฉ์ธ๊ณผ ํฌํธ๊ฐ ๋์ผํ ๊ฒฝ์ฐ๊ฐ ์์ํ ๋ ํจ์ค..
๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ์์ CORS๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ด๋๊น์ง๋ ํด๋ผ์ด์ธํธ์ โ์น ๋ธ๋ผ์ฐ์ โ์์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์ ๋ก ์ด์๋๋ ์๋น์ค๋ ๊ทธ๋ฐ๊ณณ์์ ์ฌ์ฉ๋๊ธฐ๋ ์ด๋ ต๋ค. ๊ฐ์ธ์ด ์ค์ ์ ํด์ค์ผํ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์, ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ค.
1. ์น ๋ธ๋ผ์ฐ์ ์ ์ปค๋งจ๋๋ฅผ ํตํ CORS ํด๊ฒฐ
2. ์น ๋ธ๋ผ์ฐ์ ์ ํ๋ฌ๊ทธ์ธ์ ํตํ CORS ํด๊ฒฐ
3. JSONP๋ฐฉ์์ ํตํ CORS ํด๊ฒฐ
ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ๊ณ ํ๋ฉด ์ข๊ฒ ๋ค.
app.get('/data', (req, res) => {
res.header("Access-Control-Allow-Origin", "*");
res.send(data);
})
๋ค์๊ณผ ๊ฐ์ด REST api์ header๋ถ๋ถ์ Access-Contorl-Allow-Origin ๋ถ๋ถ์ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๋จ์ ์ด ์๋ค๋ฉด, ๋ชจ๋ REST api์ header๋ฅผ ๋ฃ์ด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
RESTful์ด๋ผ๋ ์๋ฏธ๋ REpresentational State Transfer์ ์ฝ์์ธ REST๋ผ๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ์ํคํ ์ฒ์ ๋น๊ณต์์ ๊ฐ์ด๋(ํ์ฉ์ฌํ์ด๋ฏ๋ก)๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์ดํดํ ๋ ค๋ฉด ์ด๋ ค์ฐ๋ฏ๋ก, RESTful์ ์ดํดํ๋ ค๋ฉด ๊ทธ๊ฒ์ ๊ทผ๊ฐ์ด ๋๋ REST์ ๋ํด์ ์์์ผ๋ง ํ๋ค.
ํ๋ถ์์ ์ REST์ํคํ ์ณ๋ฅผ ๋ง๋ก๋ง ๋ค์ด๋ด์ ์๋ฏธ๋ฅผ ์ ๋ชฐ๋ผ ํ๊ตญ์ด๋ก ๋ฒ์ญํด๋ดค๋๋ฐ, ๋ํ์ ์ธ ์ํ ์ ๋ฌ์ด๋ผ๊ณ ํ๋ค. ๋๊ฐ ์ด๋ ๊ฒ ์ดํดํ ๊น..??
์๋ฏธ๋ฅผ ์ฐพ์๋ณด๋ ์ค, ๋ค์๊ณผ ๊ฐ์ ๋ธ๋ก๊ทธ์์๋ REST์ ๋ํด์ ์ด๋ ๊ฒ ์ค๋ช ํ๋ค.
โฆ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด ๋จ์ด๋ฅผ ๋ณํํด์ โ์์(resource)์ ๋ํ(representation)์ ์ํ ์ํ ์ ๋ฌโ ์ด๋ผ๊ณ ์ค๋ช ํ๋ ค ํฉ๋๋ค โฆ
๊ทธ๋ ๋ค๋ฉด ์์์ด๋ผ๋ ๊ฒ์ ๋ฌด์์ผ๊น? ํด๋น ๋ธ๋ก๊ทธ์์ ์ค๋ช ํ๋ ์์์ด๋ผ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๊ธฐ์ โ์์โ์ด๋ ๋ป์ ๋์ ์๋ฏธ๋ก ํด๋น ์ํํธ์จ์ด๊ฐ ๊ด๋ฆฌํ๋ ๋ชจ๋ ๊ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ฌธ์๊ฐ ๋ ์๋ ์๊ณ ๊ทธ๋ฆผ์ด ๋ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ๋ ์๋ ์๊ณ ์ฌ์ง์ด ํด๋น ์ํํธ์จ์ด ์์ฒด๊ฐ ๋ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DB์ ํ์ ๋ช ๋ถ๊ฐ ์ ์ฅ๋์ด ์๋ค๊ณ ํ๋ค๋ฉด ์ด ํ์๋ค์ ์ ๋ณด๊ฐ ์์์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ โ์์์ ๋ํโ์ ์๋ฏธ๋ ๊ทธ ์์์ ๋ํํ๊ธฐ ์ํ ์ด๋ฆ์ ๋ปํฉ๋๋ค. ํ์๋ฐ์ดํฐ๋ฅผ ๋ํํ๊ธฐ ์ํ ์ด๋ฆ์ ๋ฌด์์ด ์ข์๊น์? ๋ฌผ๋ก ํ์(students:๋ณต์ํ์ ์ฌ์ฉํฉ๋๋ค)์ ๋๋ค. ํ์ ์ ์ฒด ๋ช ๋ถ๊ฐ ์๋๋ผ ๋ช ๋ถ์์ ํ ํ์์ ๋ํ ์์์ ์ป๊ณ ์ ํ๋ค๋ฉด ๋ํ์ด๋ฆ๊ณผ ํ ํ์์ ํน์ ํ ์ ์๋ ๊ฐ(id ๋ฑ)์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ํ์ ๋ฌ์ด๋ ์๋ฏธ๋ ๋ฌด์์ผ๊น? ํด๋น ๋ธ๋ก๊ทธ์์ ์ค๋ช ํ๋ ์ํ์ ๋ฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐ์ดํฐ๊ฐ ์์ฒญ๋์ด์ง๋ ์์ ์์ ์์์ ์ํ(์ ๋ณด)๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋ปํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ โ์ํโ๋ผ๋ ํํ์ ์ด ๊ฒ์ด๋ผ ์ถ์ธกํด ๋ด ๋๋ค. ํ๋ก๊ทธ๋จ์ด ํ์ ๋ช ๋ถ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์์ฒญ๋ฐ์ผ๋ฉด ์์ฒญ๋ฐ์ ์์ ์ โ์ํโ ์ฆ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค. ๋ํ ์๋ก์ด ํ์ ๋ช ๋ถ โ์ํโ๋ฅผ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ์ฌ ํด๋น ์์์ ์์ ํ ์๋ ์์ต๋๋ค.
๊ณ ๋ก ์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ, ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ์ํคํ ์ณ๋ค์ REST ์ํคํ ์ณ์ธ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ๋ด๊ฐ ์กฐ๊ธ ๋ค์ด๋ณธ ์ง์๋ค์ ์กฐํฉํด์ ์๊ฐํด๋ณด๋ฉด, REST๋ผ๋ ๊ฒ์ ๋ํ ๋ด ์๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
์์(Resources)์ ๋ํํ๋ ์ด๋ฆ(URL)์ ์ด์ฉํ์ฌ, ์์์ ์ ํํ๊ณ ๊ทธ ์์์ ์ํ๋ฅผ ๋ค๋ฃจ๋(HTTP Method) ์ํคํ ์ณ
๋ํ ์ด๋ฐ REST๋ฅผ ์ ์ํ๊ธฐ ์ํ ์กฐ๊ฑด๋ค์ด ์๋๋ฐ, ๊ทธ ์กฐ๊ฑด๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
* ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ
* ๋ฌด์ํ(Stateless)
* ์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ(Cacheable)
* ๊ณ์ธตํ(Layered System)
* Code on demand (optional)
* ์ธํฐํ์ด์ค ์ผ๊ด์ฑ
์ฐธ๊ณ ๋ก, RESTful์ ์ ๋ต์ ์๋ค. ๊ทธ์ REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ ๋ค์ ํํํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ ๋จ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
1. GET
2. POST
3. PUT
4. DELETE
์ ๋๊ฐ ์๊ฒ ๋ค. ์๊ธฐ์ 4๊ฐ์ง HTTP method๋ค์ ํตํ์ฌ CRUDํ๋, ์ต๋ํ REST์ ๋ฐฉํฅ์ ๋ฐ๋ผ๊ฐ์ผ๋ง ํ๋ค.
RESTful์ ๋ํด์๋ ๋์ค์ ๋ฐ๋ก ํฌ์คํธ๋ฅผ ์ฌ๋ฆด ๊ฑฐ์ง๋ง(์ฌ๋ ค์ผ ํ์ง๋ง), ์ข์ REST API๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ criticalํ condition๋ค์ ๋ง์กฑํด์ผ๋ง ํ๋ค. ์๋ฅผ๋ค์ด ๋ชฉ์ ์ ๋ถํฉํ๊ฒ method๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋์ง, URL์ ํํ ๋ฐฉ์์ ๋ํด์๋ ์ค๋ช
ํ๋ ๊ธ๋ค์ด ๋ง๋ค.
์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ๊ณ ํด๋ณด์. ์์ง ๋์๊ฒ๋ ๋ง์ด ์ด๋ ค์ด ๋ด์ฉ๊ฐ๋คโฆ
๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.
1. URL ์ฃผ์ ์
๋ ฅ์ ๋ฐ๋ฅธ DNS ์๋ฒ์ IP ์ฃผ์ ๋ฐํ ๋ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฐ๊ฒฐ ์์ฒญ
2. ํด๋ผ์ด์ธํธ-์๋ฒ ์ฐ๊ฒฐ ์๋
- ์ฐ๊ฒฐ ๋ฐฉ์์ TCP ์ฐ๊ฒฐ๋ฐฉ์, 3-hand shaking์ ํตํ์ฌ ์ฐ๊ฒฐ์ ์ ๋ขฐ์ฑ๋ณด์ฅ
3. ์ฐ๊ฒฐ์ด ์ฑ๊ณต๋๋ฉด, ํด๋ผ์ด์ธํธ์ HTTP Request๊ฐ ์๋ฒ์๊ฒ ์ ๋ฌ
4. ์๋ฒ์ HTTP Response๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
5. ํด๋ผ์ด์ธํธ-์๋ฒ์ TCP ์ฐ๊ฒฐ ํค์
ํด๋น ๋ด์ฉ์ ๋ค์์ ์ฐธ๊ณ ํ๋ค.
ํ์ฌ์ ์ ์ฌํ๊ณ 1๋ฌ ์ฆ์ ๋์์ ๋, ์ฒ์์ผ๋ก ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ๊ดํ ์ด์๋ฅผ ์ฌ์๋ถ๊ป ๋ค์์๋ค.
๋น์์ ๋๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ด๋ผ๋ ์ด์๋ฅผ ๋จ์ํ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ํ๋ฉด ๋ณด์ด๊ฒ ํ๊ธฐ ์ ๋์ ์ด์๋ก ์๊ฐํ์๋๋ฐ, ์ด๋ฒ์ ์ด ๊ธ์ ์ฐ๊ฒ ๋๋ฉด์ ๊ทธ๋ฐ ์๊ฐ์ ๊ณ ์น๊ฒ ๋์๋ค.
์ด ๊ธ์ ์ฐ๊ธฐ ์ํด์ ์ฐธ๊ณ ํ ์ฌ์ดํธ๋ ๋ค์๊ณผ ๊ฐ๊ณ , ํด๋น ์ฌ์ดํธ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์ฐพ์ ์ ์๋ค.
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ๋์ผ์ฑ์ ์๋ฏธํ์ง ์๋๋ค.
๋จ์ํ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ด ์ฌ๋ฌ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๊ฒ ๋ณด์ด๊ฒ ํ๋ ๊ธฐ์ ๋ก ์ฐฉ๊ฐํ๋ ๋๋ฅผ ๋น๋กฏํ ์๋ง์ ์ด๋ณด ๊ฐ๋ฐ์๋ค์ ์ด ๊ธ์ ์ฝ๊ณ ๋ค์๊ณผ ์๋ฌธ์ด ๋ค์์ ๊ฒ์ด๋ค.
์๋ ๊ทธ๋ฌ๋ฉด ๋๋์ฒด ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ๋ญ๋ฐ?
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ด๋, ์์ ์ฌ์ดํธ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ์ ์ํด์ค๋ค.
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ด๋ ์ ์ด๋ ํ์ค ์น ๊ธฐ์ ์ ์ฑ์ฉํ์ฌ ๋ค๋ฅธ ๊ธฐ์ข ํน์ ํ๋ซํผ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ ๊ตฌํ๋๋ ๊ธฐ์ ์ ๋น์ทํ๊ฒ ๋ง๋ฆ๊ณผ ๋์์ ์ด๋ ํ์ชฝ์ ์ต์ ํ๋์ด ์น์ฐ์น์ง ์๋๋ก ๊ณตํต ์์๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ์ ์ํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ ๊ฒ์ด๋ค. ๋ํ, ์ง์ํ ์ ์๋ ๋ค๋ฅธ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ฅ์น๋ฅผ ๊ตฌํํ์ฌ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ์ ๋ ์ ๋ณด๋ก์์ ์์ธ๊ฐ์ ๋๋ผ์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ๋ก ์ ๊ฐ์ด๋๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
ํ ๋ง๋๋ก, ๋์ผ์ฑ์ด ์๋ ๋๋ฑ์ฑ์ ๋ํด์ ๋ ผํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ์น ๋ธ๋ผ์ฐ์ ์๋ ์น์ฐ์น์ง ์๋, ๊ณตํต์์๋ฅผ ์ต๋ํ ๋ง์ด ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ์ ์ํ๋ ๊ธฐ๋ฒ์ด ๋ฐ๋ก ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ด๋ผ๋ ๊ฒ์ด๋ค.
๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฃผ์ง ์์๋ ๊ด์ฐฎ๋ค. ์๋ํ๋ฉด, ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ๊ทธ๋ฐ ๊ฒ์ด ์๋, ํน์ ๋ธ๋ผ์ฐ์ ์๋ง ์์กด๋๋ ๊ธฐ์ ๋ค์ ์ฌ์ฉํ์ง ์๊ณ ์ต๋ํ์ ํธํ์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ ๋ํ์ฌ ๋์ฒ๋ผ ์ ๋ณด๋ฅผ ์๋ชป ์๊ณ ์๋ ๋ถ๋ค์ด ๋ค์ ์์๊ฐ์ผ๋ฉด ์ข๊ฒ ๋ค :)