๋‚˜์ค‘์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” Q&A

1. HTML ์งˆ๋ฌธ

"div", "section", "article", "nav", "header", "aside" ํƒœ๊ทธ์˜ ์ฐจ์ด์ ์€?

W3C์—์„œ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•œ๋‹ค.
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๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํผ์„ ์ œ์‹œํ•ด์ฃผ๊ณ ์žˆ๋‹ค.

alt

"form" ํƒœ๊ทธ์— ์žˆ๋Š” "input" ํƒœ๊ทธ์˜ ๊ฐ’์„ ์„œ๋ฒ„์— ์ „์†กํ•  ๋•Œ, "JavaScript" ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

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" ํƒœ๊ทธ์™€ "div" ํƒœ๊ทธ์˜ ์ฐจ์ด์ ์€?

๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
<p> : "๋ฌธ์žฅ์˜ ๋‹จ๋ฝ(paragraph)"์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ์ด๋‹ค. <div> ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค.
<div> : "๊ตฌ๊ฐ„์˜ ๊ตฌ๋ถ„(division)"์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ์ด๋‹ค. <p> ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
"meta" ํƒœ๊ทธ์˜ ์—ญํ• ์€?

meta ํƒœ๊ทธ๋Š” ์›น ์„œ๋ฒ„์™€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ„์— ์ƒํ˜ธ ๊ตํ™˜๋˜๋Š” ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

HTML๋ฌธ์„œ์˜ head ํƒœ๊ทธ์— ์กด์žฌํ•˜๋ฉฐ, ์›น ์‚ฌ์ดํŠธ์˜ ๋””์ž์ธ์—๋Š” ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹  ๋ฌธ์„œ๋ฅผ ๋ˆ„๊ฐ€ ๋งŒ๋“ค์—ˆ๊ณ , ๋ฌธ์„œ์˜ ํ‚ค์›Œ๋“œ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ๋ˆ„๊ฐ€ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋“ฑ์˜ ๋ฌธ์„œ์˜ ํŠน์„ฑ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ meta ํƒœ๊ทธ์—๋Š” 3๊ฐ€์ง€ ์†์„ฑ์ด ์กด์žฌํ•˜๋ฉฐ, ๊ทธ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. http-equiv = "ํ•ญ๋ชฉ๋ช…"  
์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ์†์„ฑ์œผ๋กœ name ์†์„ฑ์„ ๋Œ€์‹ ํ•˜์—ฌ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, HTML ๋ฌธ์„œ๊ฐ€ ์‘๋‹ต ํ—ค๋”์™€ ํ•จ๊ป˜ ์›น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ „์†ก๋˜์—ˆ์„ ๋•Œ์—๋งŒ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.  

2. content = "์ •๋ณด๊ฐ’"
meta ์ •๋ณด์˜ ๋‚ด์šฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.  

3. name = "์ •๋ณด ์ด๋ฆ„"
๋ช‡ ๊ฐœ์˜ meta ์ •๋ณด์˜ ์ด๋ฆ„์„ ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด http-equiv ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ, ์ œ์ž‘์ผ, ์–ธ์–ด, ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

"script" ํƒœ๊ทธ๋ฅผ "head" ํƒœ๊ทธ์— ๋„ฃ๋Š” ๊ฒƒ๊ณผ "body" ํƒœ๊ทธ์— ๋„ฃ๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋Š”?

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 ํƒœ๊ทธ์˜ ์ตœํ•˜๋‹จ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋ชจ๋‘ ์ ํ•ฉํ•˜๋‹ค.

2. JavaScript ์งˆ๋ฌธ

"===" ์™€ "==" ์˜ ์ฐจ์ด๋Š”?

===๊ณผ ==๋Š” ๊ฐ™์€ ๋ชฉ์ ์„ ์ถ”๊ตฌํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

==๋Š” ์ขŒํ•ญ๊ณผ ์šฐํ•ญ์˜ ๊ฐ’๋งŒ์„ ๋น„๊ตํ•œ๋‹ค. ๋งŒ์•ฝ 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"์˜ ์ฐจ์ด์ ์€?

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 ํฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ด๋‹ค.

์˜ˆ์‹œ ์ถœ์ฒ˜

"JavaScript"์—์„œ "๊ฐ์ฒด๋ฅผ ์ •์˜"ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

1. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด

๋ณ„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ• ์—†์ด ์ค‘๊ด„ํ˜ธ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์„ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

  var object = {
    name: "Yunhoe",
    age: 23,
    gender: "male"
  }

2. Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

Object์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ, new Object()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. new Object()๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด๋Š” ์ดˆ๊ธฐ์— ๋น„์–ด์žˆ๋‹ค.

  var object = new Object(); // Empty object

  object.name = "Yunhoe";
  object.age = 23;
  object.gender = "male";

3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜

Java๋‚˜ C++์˜ class์™€ ๋งค์šฐ ๋น„์Šทํ•œ ํ˜•์‹์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  function person(name, age, gender){
    this.name = name;
    this.age = age;
    this.gender = gender;
  }

  var object = new person("Yunhoe", 23, "male")

4. Class ํ•จ์ˆ˜

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");
HTTP ์ „์†ก ๋ฐฉ์‹("Method")์˜ ์ข…๋ฅ˜๋Š”?

1. GET

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” method๋กœ์จ, ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” resource๋ฅผ requestํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.  

์„œ๋ฒ„๋Š” response๋กœ body์— resource์˜ content๋ฅผ ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค.

2. HEAD

GET method์™€ ๋น„์Šทํ•˜๊ฒŒ ์„œ๋ฒ„์— resource๋ฅผ requestํ•˜์ง€๋งŒ, response๋กœ header๋งŒ ๋ฐ›๋Š”๋‹ค.  

HEAD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด resource๋ฅผ requestํ•˜์ง€ ์•Š์•„๋„ object์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์ˆ˜์ •์ด ๋˜์—ˆ๋Š”์ง€๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๊ฐœ์ธ์ ์œผ๋กœ GET์˜ find ๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

3. PUT

GET method์˜ ์ •๋ฐ˜๋Œ€๋กœ ์„œ๋ฒ„์— ๋ฌธ์„œ๋ฅผ ์“ธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.   

PUT method๋Š” ์„œ๋ฒ„๊ฐ€ client์˜ request body๋ฅผ ํ™•์ธํ•˜๊ณ , ๋งŒ์•ฝ ์„œ๋ฒ„์— ํ•ด๋‹น request์— ๊ด€๋ จ๋œ URL์ด ์กด์žฌํ•œ๋‹ค๋ฉด replaceํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด createํ•œ๋‹ค.  

ํ•ด๋‹น method๋Š” URL์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ, ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณ€์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ๋งŒ ํ•  ๊ฒƒ์ด๋‹ค.

4. POST

PUT method์™€ ๋น„์Šทํ•˜๊ฒŒ ์„œ๋ฒ„์— resource data๋ฅผ HTMLํผ์„ ์ด์šฉํ•˜์—ฌ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.  

๊ทธ๋Ÿฌ๋‚˜ PUT method์™€ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ๋ฉฑ๋“ฑ์„ฑ(idempotency)์˜ ์ฐจ์ด์ด๋‹ค.  

๋™์ผํ•œ ์š”์ฒญ์„ ํ•œ ๋ฒˆ ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ์—ฌ๋Ÿฌ ๋ฒˆ ์—ฐ์†์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ง€๋‹ˆ๊ณ , ์„œ๋ฒ„์˜ ์ƒํƒœ๋„ ๋™์ผํ•˜๊ฒŒ ๋‚จ์„ ๋•Œ, ํ•ด๋‹น HTTP ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์กŒ๋‹ค๊ณ  ๋งํ•œ๋‹ค. 

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‘˜์˜ ์ฐจ์ด๋ผ๋Š”๊ฒƒ์€, PUT method๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์กŒ์ง€๋งŒ POST method๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.  

ํ•ด๋‹น ๋‚ด์šฉ์€ ์ถ”ํ›„์— ๋‹ค๋ฅธ ํฌ์ŠคํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ์ž์„ธํžˆ ๋‹ค๋ฃจ์–ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

5. TRACE

Client์˜ request๋Š” firewall, proxy server, gateway ๋“ฑ์„ ๊ฑฐ์น˜๋ฉด์„œ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.  

TRACE method๋Š” ์œ„์˜ ๋‹จ๊ณ„๋“ค์„ ๊ฑฐ์น˜๊ณ  ๋‚˜์„œ ์ตœ์ข… ๋ชฉ์ ์ง€(์„œ๋ฒ„)์— ๋„์ฐฉํ–ˆ์„ ๋•Œ์˜ request๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” method์ด๋‹ค.

6. OPTIONS

OPTIONS method๋Š” ์„œ๋ฒ„๊ฐ€ ์–ด๋– ํ•œ method๋“ค์„ ์ง€์›ํ•ด์ฃผ๋Š”์ง€ ํ™•์ธํ•˜๋Š” method์ด๋‹ค.

7. DELETE

DELETE method๋Š” request์— ๊ธฐ์žฌ๋œ URL์— ํ•ด๋‹น๋˜๋Š” resource๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” method์ด๋‹ค.  

์ฃผ์˜ํ•ด์•ผํ•  ์ ์€, HTTP ๋ช…์„ธ์—์„œ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ DELETE request๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 100% ์‚ญ์ œ๊ฐ€ ๋จ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
"Promise", "Callback" ํŒจํ„ด์€ ๊ฐ๊ฐ ๋ฌด์—‡์ด๋ฉฐ, ์ฐจ์ด์ ์€?

๋‘˜ ๋‹ค JavaScript์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ธ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŒจํ„ด์ด๋‹ค.

์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด์ž. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์›น ์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๊ณ , ๊ทธ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•ด๋†จ๋Š”๋ฐ ๊ทธ๊ฒƒ๋“ค์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ •๋ง ๋”์ฐํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์˜ ์›น ์‚ฌ์ดํŠธ์˜ ์ด์šฉ์ž๋“ค์€, ๋‹จ์ˆœํžˆ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฆ„์—๋„ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€๋“ค์„ ๋ณด์ง€ ๋ชปํ•˜๊ฒŒ ๋  ๊ฑฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜ ๋” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž. ๋งŒ์•ฝ ๋‹น์‹ ์˜ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๋ชจ๋‘ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋ง์ด๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์ด ์ผ์–ด๋‚ ๊นŒ?

๋‹น์‹ ์˜ ์›น ์‚ฌ์ดํŠธ ์ด์šฉ์ž๋“ค์€ ๋น„๋™๊ธฐ์ ์ธ ์š”์ฒญ์— ๋งŒ์กฑํ•  ๊ฒƒ์ด๋‹ค. ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ๋™์‹œ์— ์ข‹์•„์š”๋„ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๊ณ . ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๋‹น์‹ ์˜ ์ฝ”๋“œ์— ๋ง์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์€ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์ˆœ์ฐจ์ ์ธ ํ๋ฆ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋กœ๊ทธ์ธ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ๋กœ๊ทธ์ธ ์ฐฝ์ด ๋‚˜์˜ค๊ณ  ๊ทธ ์ดํ›„์— ์ž…๋ ฅํ•˜๊ณ  ๊ทธ ์ดํ›„์— ์ œ์ถœํ•˜๊ณ  ๊ทธ ์ดํ›„์— ์ธ์ฆํ•˜๊ณ  ๋“ฑ๋“ฑ..

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‘๋‹ต์ด ๋„์ฐฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋‹น์‹ ์˜ ์ฝ”๋“œ๋Š” ์ˆœ์ฐจ์  ์‹คํ–‰์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ์—๋„, ์œ ์ง€ ๋ฐ ๋ณด์ˆ˜ํ•˜๋Š”๊ฒŒ ํž˜๋“ค ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์กด์žฌํ•˜๋Š” ๊ฒƒ๋“ค์ด Callback๊ณผ Promise์ด๋‹ค.

Callback Pattern

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํ•œ ๋ฒˆ ๊ฒฐ๊ณผ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
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 Hell์˜ ๋ฌด์„œ์›€์„ ์ž˜ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ์‚ฌ์ง„

Promise Pattern

๊ทธ๋ ‡๋‹ค๋ฉด ์ €๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” 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๊ฐ€์ง€ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • ๋Œ€๊ธฐ(pending) : ์ดํ–‰๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์€, ์ดˆ๊ธฐ์˜ ์ƒํƒœ
  • ์ดํ–‰(fulfilled) : ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ
  • ๊ฑฐ๋ถ€(rejected) : ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ

Promise_map

์ด ์ƒํƒœ๋ฅผ 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 ์ถœ๋ ฅ
});
"async", "await"๊ณผ "Promise"์˜ ์ฐจ์ด์ ์€?

์œ„์˜ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ๋Š๋‚Œ์ฒ˜๋Ÿผ, Callback๊ณผ Promise์™€ Async&await ๋ชจ๋‘ JavaSscript์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•๋“ค์ด๋‹ค.

ํ•˜์ง€๋งŒ Callback๊ณผ Promise๊ฐ€ ์ฐจ์ด๊ฐ€ ์žˆ๋“ฏ์ด, Promise์™€ Async&Await๋„ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๊ทธ ์ฐจ์ด์˜ ์ •๋ณด๋Š” ๋‹ค์Œ์˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

1. ๊ฐ„๊ฒฐํ•จ๊ณผ ๊น”๋”ํ•จ

์šฐ๋ฆฌ๋Š” Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ๋•Œ then()๊ณผ catch(), resolve()์™€ reject()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์„ ํ•˜์˜€๋‹ค. Callback hell์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜์ด๊ธฐ๋„ ํ•˜์˜€๊ณ , ์‹ค์ œ๋กœ ๋ณด๊ธฐ์— ๊น”๋”ํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ async&await์„ ์‚ฌ์šฉํ•˜๋ฉด, promise๋ณด๋‹ค ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์˜ ์•ž์— async๋ฅผ ๋ถ™ํžˆ๊ณ , ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์— await์„ ๋ถ™ํžˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์‹ฌ์ง€์–ด return์˜ ํ˜•์‹๋„ promise๋กœ ๋ฐ˜ํ™˜๋˜์–ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „์— promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์ƒ๋˜์—ˆ๋‹ค.

2. ์—๋Ÿฌ ํ•ธ๋“ค๋ง

Promise ๋‚ด๋ถ€์—์„œ ์—์„œ ๋‚˜์˜ค๋Š” error๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, try/catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ error๋Š” Promise ๋‚ด๋ถ€์—์„œ ๋‚˜์˜จ error์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ทธ๋Ÿฌํ•œ error๋ฅผ ์žก๊ณ ์‹ถ๋‹ค๋ฉด, ๊ทธ error ์ฒ˜๋ฆฌ๋ฌธ์€ promise ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ async&await์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•ด๋‹น ๊ตฌ๋ฌธ์€, try/catch๊ตฌ๋ฌธ์œผ๋กœ error๋ฅผ ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค!

3. Nested code ํ•ด๊ฒฐ

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)
}
"Event Bubbling"๊ณผ "Capture"๋ž€? (๋ฏธ์™„)

ํ•ด๋‹น ๋ฌธ์„œ๋Š” ๋‹ค์Œ์„ ์นจ๊ณ ํ•˜์˜€๋‹ค.

JavaScript์—๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด 2๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ 2๊ฐ€์ง€๊ฐ€ ๋ฐ”๋กœ Event Bubbling/Event Capture์ด๋‹ค.

Event Bulbbing: ํŠน์ •ํ™”๋ฉด ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์š”์†Œ์˜ ์ด๋ฒคํŠธ๊ฐ€ ํ•ด๋‹น ์š”์†Œ์˜ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ํŠน์„ฑ

์ด๋ฒคํŠธ ์บก์ณ: ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์˜ ์ • ๋ฐ˜๋Œ€์˜ ๋ฐฉ์‹. ์ƒ์œ„ ์š”์†Œ์—์„œ ํ•˜์œ„ ์š”์†Œ๋กœ ํผ์ ธ๋‚˜๊ฐ์„ ์˜๋ฏธํ•จ.

+) event.stopPropagation(), Event Delegation

์ด์™€ ๊ฐ™์€ ํ•˜์œ„์—์„œ ์ƒ์œ„ ์š”์†Œ๋กœ์˜ ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์‹์„ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง(Event Bubbling)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

3. Vue.js ์งˆ๋ฌธ

"Mixin"์ด๋ž€?

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๋œ ๊ฒƒ์ด๋‹ค!

"EventBus"๋ž€?

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๊ฐ„์˜ ์ž์œ ๋กœ์šด ํ†ต์‹ ์„ ํ—ˆ๋ฝํ•ด์ฃผ๋„๋ก ํ•˜์ง€๋งŒ, ์ „์—ญ ๋ฒ”์œ„๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์— ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

"Component LifeCycle" ์ด๋ž€?

Vue์—์„œ๋Š” component๋ฟ๋งŒ ์•„๋‹ˆ๋ผ instance๋“ค๋„ Lifecycle์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Vue์˜ Lifecycle์ด ๋ฌด์—‡์ด๋ƒ๋ฉด, ๋ง ๊ทธ๋Œ€๋กœ component๋‚˜ instance๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ์ด๋‹ค. ์ƒ์„ฑ๋  ๋•Œ๋ถ€ํ„ฐ ํŒŒ๊ดด๋˜๋Š” ์‹œ์ ๊นŒ์ง€์˜ ๊ณผ์ •๋“ค์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

ํฌ๊ฒŒ created, mounted, updated, destroyed์˜ 4๊ฐ€์ง€ ๊ตฌ์„ฑ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ฃผ๊ธฐ๋“ค์„ ์ด๋ฆ„์œผ๋กœ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํŠน์ • lifecycle์— ํŠน์ • method๋“ค์„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ด์ค€๋‹ค.

์ž์„ธํ•œ ๊ทธ๋ฆผ์€ Vue ๊ณต์‹์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋‹ค์Œ ์‚ฌ์ง„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

vue_component_life_cycle


"Vue" vs "React", "Angular" (๋ฏธ์™„)

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ์‚ฌ์ดํŠธ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.. ์ž˜ ๋ชจ๋ฅด๋Š” ๋‚ด์šฉ์ด๋‹ค..

"Vuex"๋ž€? ์จ์•ผํ•˜๋Š” ์ด์œ ๋Š”?

Vuex๋ž€ ์ƒํƒœ๊ด€๋ฆฌ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์šฐ์„ , vuex๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋‹ค์Œ์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค.

์ƒํƒœ ๊ด€๋ฆฌ๋ž€ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๊ณผ ์ด๋ฒคํŠธ ํ†ต์‹ ์„ ํ•œ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ทฐ์™€ ์„ฑ๊ฒฉ์ด ๋น„์Šทํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ ๋ฆฌ์•กํŠธ(React)์—์„œ๋Š” Redux, Mobx์™€ ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๋ทฐ์—์„œ๋Š” Vuex๋ผ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ƒํƒœ๊ด€๋ฆฌ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๋ฌด์—‡์ด๊ธธ๋ž˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ์„๊นŒ? ์œ„์˜ ์‚ฌ์ดํŠธ์—์„ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•œ๋‹ค.

์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์ค‘๋Œ€ํ˜• ๊ทœ๋ชจ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ทฐ์˜ ์ปดํฌ๋„ŒํŠธ ํ†ต์‹  ๋ฐฉ์‹์ธ props, event emit ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ๊ฑฐ์ณํ•  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜, ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Event Bus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ํ•œ ๊ณณ์—์„œ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ƒํƒœ ๊ด€๋ฆฌ๋ผ๊ณ ํ•œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ์ด๋Ÿฐ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํŽธํ•˜๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•œ๋‹ค๋Š” ์ ์—์„œ Vuex๋ฅผ ์“ฐ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

4. CSS ์งˆ๋ฌธ

CSS "position" ์†์„ฑ์—์„œ "relative" ์™€ "absolute" ์˜ ์ฐจ์ด์ ์€?

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๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๋น„์Šทํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์šฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ˆ ๋ชจ๋‘ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž.

"display" ์†์„ฑ์—์„œ "inline", "inline-block", "block" ์˜ ์ฐจ์ด์ ์€?

block์†์„ฑ์€ ์ผ๋ฐ˜์ ์ธ div ํƒœ๊ทธ์˜ ์†์„ฑ๊ณผ ๋น„์Šทํ•˜๋‹ค. block์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋Š” height๋งŒํผ์˜ ํ•œ ์ค„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๊ณ , ๋‹ค์Œ ํƒœ๊ทธ๋Š” ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

inline์†์„ฑ์€ ์ผ๋ฐ˜์ ์ธ span ํƒœ๊ทธ์˜ ์†์„ฑ๊ณผ ๋น„์Šทํ•˜๋‹ค. inline์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋Š” text ๋งŒํผ์˜ ํฌ๊ธฐ๋ฅผ ์ ์œ ํ•˜๋ฉฐ, width, height, margin ๊ทธ๋ฆฌ๊ณ  line-height๋“ฑ์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

inline-block์†์„ฑ์€ ์œ„์˜ ๋‘ ๊ฐ€์ง€ ์†์„ฑ์ธ, block๊ณผ inline์†์„ฑ์„ ๋‘ ๊ฐ€์ง€ ํ˜ผํ•ฉํ•œ ์†์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. inline ์†์„ฑ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ•œ ์ค„์ด์ง€๋งŒ block ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ณ  width, height ๊ทธ๋ฆฌ๊ณ  line-height ๋“ฑ inline ์†์„ฑ์—์„œ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์†์„ฑ๋“ค์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

"transform" ์†์„ฑ์—์„œ "translate" ๋กœ ์—˜๋ฆฌ๋จผํŠธ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ "left", "right", "bottom", "top" ์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์€?

๊ด€๋ จ ์ง€์‹์„ ์ฐพ๋‹ค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์žฅ์„ ๋ณด์•˜๋‹ค.

ํผํฌ๋จผ์Šค์˜ ์ฐจ์ด๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋จผ์ € 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ํ•˜๋‹ค๋Š” ์ ์ด ์ฐจ์ด์ ์ด๋‹ค.

๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ๋‹ค์Œ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

5. ์›น ๊ฐœ๋ฐœ ์งˆ๋ฌธ

CORS๋ž€? ๊ทธ๋ฆฌ๊ณ  CORS๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€?

CORS๋Š” Cross-Origin Resource Sharing์˜ ์•ฝ์ž๋กœ, **ํฌํŠธ ๋˜๋Š” ๋„๋ฉ”์ธ**์ด ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ 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 ๊ด€๋ จ ์—๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋“ค์ด ์กด์žฌํ•œ๋‹ค.

1. ๋™์ผํ•œ ๋„๋ฉ”์ธ๊ณผ ํฌํŠธ๋„˜๋ฒ„ ์‚ฌ์šฉํ•˜๊ธฐ

์ด๋ก ์ƒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค..!!

์‹ค์ƒํ™œ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋„๋ฉ”์ธ๊ณผ ํฌํŠธ๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์—†์„ํ…Œ๋‹ˆ ํŒจ์Šค..

2. ์›น ๋ธŒ๋ผ์šฐ์ €๋‹จ์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ CORS๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์–ด๋””๊นŒ์ง€๋‚˜ ํด๋ผ์ด์–ธํŠธ์˜ โ€œ์›น ๋ธŒ๋ผ์šฐ์ €โ€์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ ์šด์˜๋˜๋Š” ์„œ๋น„์Šค๋‚˜ ๊ทธ๋Ÿฐ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ๊ฐœ์ธ์ด ์„ค์ •์„ ํ•ด์ค˜์•ผํ•˜๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์—†๋‹ค.

1. ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•œ CORS ํ•ด๊ฒฐ
2. ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ CORS ํ•ด๊ฒฐ
3. JSONP๋ฐฉ์‹์„ ํ†ตํ•œ CORS ํ•ด๊ฒฐ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค.

3. Access-Control-Allow-Origin response header ์ถ”๊ฐ€

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์ด๋ž€?

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์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ๋“ค์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

RESTful์˜ ๋ฉ”์†Œ๋“œ ์ข…๋ฅ˜๋Š”?

  1. GET
  2. POST
  3. PUT
  4. DELETE

์ •๋„๊ฐ€ ์žˆ๊ฒ ๋‹ค. ์ƒ๊ธฐ์˜ 4๊ฐ€์ง€ HTTP method๋“ค์„ ํ†ตํ•˜์—ฌ CRUDํ•˜๋˜, ์ตœ๋Œ€ํ•œ REST์˜ ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ๊ฐ€์•ผ๋งŒ ํ•œ๋‹ค.

RESTful์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ๋”ฐ๋กœ ํฌ์ŠคํŠธ๋ฅผ ์˜ฌ๋ฆด ๊ฑฐ์ง€๋งŒ(์˜ฌ๋ ค์•ผ ํ•˜์ง€๋งŒ), ์ข‹์€ REST API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” criticalํ•œ condition๋“ค์„ ๋งŒ์กฑํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๋ชฉ์ ์— ๋ถ€ํ•ฉํ•˜๊ฒŒ method๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋˜์ง€, URL์˜ ํ‘œํ˜„ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•˜๋Š” ๊ธ€๋“ค์ด ๋งŽ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•ด๋ณด์ž. ์•„์ง ๋‚˜์—๊ฒŒ๋Š” ๋งŽ์ด ์–ด๋ ค์šด ๋‚ด์šฉ๊ฐ™๋‹คโ€ฆ

์›น์—์„œ HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ์˜ ๊ณผ์ •์€?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

  1. URL ์ฃผ์†Œ ์ž…๋ ฅ์— ๋”ฐ๋ฅธ DNS ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ ๋ฐ˜ํ™˜ ๋ฐ ํด๋ผ์ด์–ธํŠธ์˜ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์š”์ฒญ
  2. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹œ๋„  
      - ์—ฐ๊ฒฐ ๋ฐฉ์‹์€ TCP ์—ฐ๊ฒฐ๋ฐฉ์‹, 3-hand shaking์„ ํ†ตํ•˜์—ฌ ์—ฐ๊ฒฐ์˜ ์‹ ๋ขฐ์„ฑ๋ณด์žฅ
  3. ์—ฐ๊ฒฐ์ด ์„ฑ๊ณต๋˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์˜ HTTP Request๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ
  4. ์„œ๋ฒ„์˜ HTTP Response๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ
  5. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„์˜ TCP ์—ฐ๊ฒฐ ํ—ค์ œ

ํ•ด๋‹น ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด๋ž€?

ํšŒ์‚ฌ์— ์ž…์‚ฌํ•˜๊ณ  1๋‹ฌ ์ฆˆ์Œ ๋˜์—ˆ์„ ๋•Œ, ์ฒ˜์Œ์œผ๋กœ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์— ๊ด€ํ•œ ์ด์Šˆ๋ฅผ ์‚ฌ์ˆ˜๋ถ„๊ป˜ ๋“ค์—ˆ์—ˆ๋‹ค.

๋‹น์‹œ์˜ ๋‚˜๋Š” ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด๋ผ๋Š” ์ด์Šˆ๋ฅผ ๋‹จ์ˆœํžˆ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ™์€ ํ™”๋ฉด ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์ •๋„์˜ ์ด์Šˆ๋กœ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์— ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜๋ฉด์„œ ๊ทธ๋Ÿฐ ์ƒ๊ฐ์„ ๊ณ ์น˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด ๊ธ€์„ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ , ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์€ ๋™์ผ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹จ์ˆœํžˆ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ™๊ฒŒ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ์ฐฉ๊ฐํ–ˆ๋˜ ๋‚˜๋ฅผ ๋น„๋กฏํ•œ ์ˆ˜๋งŽ์€ ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด ๊ธ€์„ ์ฝ๊ณ  ๋‹ค์Œ๊ณผ ์˜๋ฌธ์ด ๋“ค์—ˆ์„ ๊ฒƒ์ด๋‹ค.

์•„๋‹ˆ ๊ทธ๋Ÿฌ๋ฉด ๋„๋Œ€์ฒด ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์€ ๋ญ”๋ฐ?

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด๋ž€, ์œ„์˜ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…์„ ์ž˜ํ•ด์ค€๋‹ค.

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด๋ž€ ์ ์–ด๋„ ํ‘œ์ค€ ์›น ๊ธฐ์ˆ ์„ ์ฑ„์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ธฐ์ข… ํ˜น์€ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ฌ๋ฆฌ ๊ตฌํ˜„๋˜๋Š” ๊ธฐ์ˆ ์„ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ฆ๊ณผ ๋™์‹œ์— ์–ด๋Š ํ•œ์ชฝ์— ์ตœ์ ํ™”๋˜์–ด ์น˜์šฐ์น˜์ง€ ์•Š๋„๋ก ๊ณตํ†ต ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ์ง€์›ํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ ์žฅ์น˜๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ์ •๋ณด๋กœ์„œ์˜ ์†Œ์™ธ๊ฐ์„ ๋Š๋ผ์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์  ๊ฐ€์ด๋“œ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ ๋งˆ๋””๋กœ, ๋™์ผ์„ฑ์ด ์•„๋‹Œ ๋™๋“ฑ์„ฑ์— ๋Œ€ํ•ด์„œ ๋…ผํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋Š ์›น ๋ธŒ๋ผ์šฐ์ €์—๋„ ์น˜์šฐ์น˜์ง€ ์•Š๋Š”, ๊ณตํ†ต์š”์†Œ๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ธฐ๋ฒ•์ด ๋ฐ”๋กœ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ฃผ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์€ ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์•„๋‹Œ, ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์˜์กด๋˜๋Š” ๊ธฐ์ˆ ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ตœ๋Œ€ํ•œ์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์— ๋Œ€ํ•˜์—ฌ ๋‚˜์ฒ˜๋Ÿผ ์ •๋ณด๋ฅผ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋˜ ๋ถ„๋“ค์ด ๋‹ค์‹œ ์•Œ์•„๊ฐ”์œผ๋ฉด ์ข‹๊ฒ ๋‹ค :)


Written by@[Yunhoe Ku]
For studying computer vision

GitHub