Giter VIP home page Giter VIP logo

tech_interview's Introduction

header

Hits

Hello! There๐Ÿ˜„

I'm Hana, currently studying front-end development


About Me

  • I want to develop things that are helpful in daily life๐Ÿ”ฅ
  • I enjoy learning new things โœ๏ธ
  • I'm quite a curious person ๐Ÿ”
  • I live with lovely two cats ๐Ÿˆ๐Ÿˆโ€โฌ›

If you have any questions, feel free to ask anytime!

Tech stack



Get in Touch



github status


trophy

tech_interview's People

Contributors

hah-nna avatar young-02 avatar

Watchers

 avatar

tech_interview's Issues

NetWork: CORS(Cross-Origin Resource Sharing)

CORS(Cross-Origin Resource Sharing, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ )

์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin) ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ

์ถœ์ฒ˜(origin)๋ž€?

origin์€ protocol + host + port๋ฅผ ์˜๋ฏธํ•จ
(์ฐธ๊ณ ๋กœ ํฌํŠธ๋Š” https๋Š” 443, http๋Š” 80๋ฒˆ์ด๋ฉฐ, ์ƒ๋žต๊ฐ€๋Šฅํ•จ)

SOP(same origin policy, ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…)์ด๋ž€?

SOP์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋™์ผํ•œ ์ถœ์ฒ˜๋ผ๋ฆฌ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ์ •์ฑ…์„ ๋œปํ•จ

์˜ˆ์ „์—๋Š” ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์— ๊ตฌ์„ฑํ•ด์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ๊ฐ€๋Šฅํ–ˆ์Œ
ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ํ๋ฅด๊ณ  ์›น์ด ์ปค์ง€๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ api๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ -> ๊ทธ๋Ÿฐ๋ฐ ํด๋ผ์ด์–ธํŠธ์™€ api๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ -> CORS ์ƒ๊น€(์ฆ‰, ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค ํ˜ธ์ถœ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜๋ฅผ ๋ช…์‹œํ•ด์ฃผ๋ฉด ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์ž!)

CORS ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ์„œ๋ฒ„๋‹จ์—์„œ Access-Control-Allow-Origin ์‘๋‹ต ํ—ค๋” ์…‹ํŒ…ํ•˜๊ธฐ
    Access-Control-Allow-Origin ํ—ค๋”๋ฅผ ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•ด์„œ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•  ์ถœ์ฒ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
    *(์™€์ผ๋“œ์นด๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถœ์ฒ˜์— ์ƒ๊ด€์—†์ด ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•ด์ง
    ๋”ฐ๋ผ์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ง์ ‘ ํ—ˆ์šฉํ•  ์ถœ์ฒ˜๋ฅผ ์…‹ํŒ…ํ•˜๋Š” ๊ฒŒ ์ข‹์Œ
'Access-Control-Allow-Origin': https://example.com
  1. Proxy ์„ค์ •(in React)
    ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•œ ์ถœ์ฒ˜์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ CORS ์—๋Ÿฌ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

๋ฆฌ์•กํŠธ์—์„œ๋Š” package.json์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

"proxy": "https://openapi.naver.com"

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐœํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์„œ ๋ฐฐํฌํ•˜๋ฉด ์ ์šฉ์ด ์•ˆ ๋จ

  1. API Routes(Next.js์—์„œ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•)
    ์—ฌ๊ธฐ ์ฐธ์กฐ

[React] useEffect ์™€ useRef

useEffect

API๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์ธ HTTPํ†ต์‹  ์ž‘์—…์€ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
์ปดํฌ๋„ŒํŠธ ๋ณธ๋ฌธ์•ˆ์— HTTPํ†ต์‹  ์ž‘์—…์ด ์กด์žฌํ•˜๋ฉด ๋ฆฌ๋ Œ๋œ์ด ๋ ๋•Œ๋งˆ๋‹ค ์ž‘์—…์„ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉฐ
API๋กœ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํด ๊ฒฝ์šฐ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŒ… ์ž‘์—…์ด ๋Šฆ์ถฐ์ ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์šด์˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ์„ ๋ถ€์ˆ˜ํšจ๊ณผ(Site Effect)๋ผ๊ณ  ํ•œ๋‹ค.
side Effect๋“ค์€ ์ฃผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ๋ Œ๋”๋ง ์ž‘์—…๊ณผ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š”๋ฐ์— ๋„์›€์„ ์ฃผ๊ณ  ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ค€๋‹ค.
์ด๋Ÿฌํ•œ side Effect์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ hook์ด useEffect ์ด๋‹ค.

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์ธ componentDidMout componentDidUpdate componentWillUnmount๊ธฐ๋Šฅ์„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์—์„œ useEffect๋กœ 3๊ฐ€์ง€์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ API๋กœ ํ†ตํ•ฉํ•ด์„œ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฝ”๋“œํ•ด์„ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

useEffect ๊ตฌํ˜„

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘๊ฐ€์ง€ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค

  1. callbackํ•จ์ˆ˜
  2. ์˜์กด์„ฑ๋ฐฐ์—ด( ์„ ํƒ์ ์œผ๋กœ ์ž‘์„ฑ)
useEffect()=>{
	//callback ํ•จ์ˆ˜
}) //์˜์กด์„ฑ ๋ฐฐ์—ด
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†๋Š” ๊ฒฝ์šฐ
    • componentDidMount componentDidUpdate๋ฅผ ํ•ฉ์นœ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์ž‘
    • ๋ Œ๋”๋ง ๋ ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.
useEffect()=>{
	//callback ํ•จ์ˆ˜
},[]) //์˜์กด์„ฑ ๋ฐฐ์—ด
  • ๋นˆ๋ฐฐ์—ด
    • componentDidMount์ฒ˜๋Ÿผ ๋™์ž‘
    • ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง ๋ ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
useEffect()=>{
	//callback ํ•จ์ˆ˜
},[state,props]) //์˜์กด์„ฑ ๋ฐฐ์—ด
  • ๋ฐฐ์—ด์ƒํƒœ๋‚˜ ์†์„ฑ ์ง€์ •
    • componentDidMount componentDidUpdate ๋ฅผ ํ•ฉ์นœ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์ž‘
    • ํ™”๋ฉด ์ฒซ ๋ Œ๋”๋ง ํ–ˆ์„ ๊ฒฝ์šฐ ์™€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋ ๋•Œ ์‹คํ–‰๋œ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด
์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’๋“ค์— ์˜์กด ํ•˜๊ณ  ์žˆ์–ด์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด ์ด๋ผ๊ณ  ํ•œ๋‹ค.

useEffect()=>{
	//callback ํ•จ์ˆ˜
	return ()=>{
		//cleanUP
	}
},[state,props]) //์˜์กด์„ฑ ๋ฐฐ์—ด
  • ์ •๋ฆฌ ํ•จ์ˆ˜ (clean-up function)
    • componentWillUnmount ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋ ๋•Œ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. (๊ตฌ๋…ํ•ด์ง€)
    • ์˜ˆ) ํƒ€์ด๋จธ ์ข…๋ฃŒ

useRef

1. useRef์˜ ์‚ฌ์šฉ ๋ชฉ์ 

  1. ํŠน์ • DOM์— ์ ‘๊ทผํ•˜์—ฌ ์ œ์–ดํ•ด์•ผ ํ•  ๊ฒฝ์šฐ
  2. ๋ Œ๋”๋ง๊ณผ ๊ด€๊ณ„์—†์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ

js์˜ ๊ฒฝ์šฐ getElementById, querySelector๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ DOM์— ์ ‘๊ทผํ•˜์—ฌ ์ œ์–ดํ• ์ˆ˜ ์žˆ์œผ๋‚˜ React์˜ ๊ฒฝ์šฐ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ ํ•˜์ง€ ์•Š๋Š”๋‹ค.๊ทธ๋Ÿฌ๋‚˜ ์Šคํฌ๋กค๋ฐ”์˜ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜, input ์š”์†Œ์— ์ž๋™ ํฌ์ปค์Šค๋ฅผ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•  ๊ฒฝ์šฐ ์ฒ˜๋Ÿผ ์ง์ ‘ DOM์„ ์ œ์–ดํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์ด ์ƒ๊ฒผ์„๋•Œ useRef๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

React๋Š” virtual DOM์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— DOM ์กฐ์ž‘์œผ๋กœ ์ธํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™” ํ•œ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์žฅ์  ๋•Œ๋ฌธ์— ์ง์ ‘ DOM์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

useRef๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์ด ์ „ ์ƒ์•  ์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด ์œ ์ง€ ๋œ๋‹ค. .current์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋ Œ๋”๋ง์„ ํ•  ๋•Œ ๋™์ผํ•œ ref ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ’์˜ ๋ณ€๊ฒฝ์€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ฌ ํ•„์š”๋Š” ์—†์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

2. useRef ์™€ useState ์ฐจ์ด

useRef์™€ useState๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
useState๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ›„์— ๋ฆฌ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜๊ณ , useRef๋Š” ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
useRef๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ’์ด ๋ณ€ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ณด์ด์ง€ ์•Š๋‹ค๊ฐ€ ๋ Œ๋”๋ง์ด ๋˜๋Š” ์‹œ์ ์— ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์— ๋งž์ถ”์–ด ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ state์˜ ๊ฒฝ์šฐ์—๋Š” useState๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์šฉ๋„์™€ ์ƒ์•  ์ฃผ๊ธฐ ๋‚ด๋‚ด ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ ์žˆ๋‹ค๋Š” ์ฐจ๋ณ„์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

3. useRef ์™€ DOM

function App(){
   const textInput = useRef(null)

   const handleClickBtn =()=>{
       textInput.current.focus();
     }
	return (
	<div>
		<input type="text" ref={textInput}/>
		<input type="button" value="ref" onClick={handleClickBtn}/>
	</div>
      )
}
export default App;

3. useRef๋กœ DOM ์„ ํƒ ํ›„ ์‚ฌ์šฉ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

useRef์€ React Dom์„ ๋ Œ๋”๋ง ํ•˜๊ณ  ๊ธฐ์กด์˜ DOM์— ๋ฐ˜์˜๋˜๊ณ  ๋‚œํ›„์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์กฐ๊ฑด๋ถ€๋ Œ๋”๋ง์„ ํ†ตํ•ด ref.current๊ฐ€ ์กด์žฌํ•  ๋•Œ์—๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

import React, { useEffect, useRef } from "react";
import music from "./assets/music.mp3";

function Player() {
  const audioRef = useRef(null);

  useEffect(() => {
    audioRef.current && audioRef.current.play(); //

});

  const handlePlay = () => { 
    audioRef.current.play(); console.log(" ");
  };

  const handlePause = () => {
    audioRef.current.pause();
    console.log("โธ !"); 
  };

return ( <>

    <audio src={music} ref={audioRef} controls></audio>
    <br />
    <div style={{ margin: "10px 89px" }}>
	    <button onClick={handlePlay}></button>
		<button onClick={handlePause}> โธ </button>
	</div>

</> );

}
export default Player;

[js] ๊นŠ์€๋ณต์‚ฌ ,์–•์€ ๋ณต์‚ฌ

์–•์€๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’(์ฃผ์†Œ๊ฐ’)์„ ๋ณต์‚ฌํ•˜๊ณ , ๊นŠ์€ ๋ณต์‚ฌ๋Š” ๊ฐ์ฒด์˜ ์‹ค์ œ ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค.

์›์‹œ๊ฐ’

  • Number, String, Boolean, Null, Undefined
  • ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ €์žฅ
  • ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ €์žฅ๋œ ์‹ค์ œ ๊ฐ’์ด ์กฐ์ž‘๋œ๋‹ค.

์ฐธ์กฐ๊ฐ’

  • Object, Symbol
  • ๋ณ€์ˆ˜์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋ฉด ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฐธ์กฐ(์œ„์น˜ ๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
  • ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๊ฒƒ

๊นŠ์€๋ณต์‚ฌ

์›์‹œ๊ฐ’

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

const a = 'a'
let b = 'b'

b = 'c'

console.log(a) //a
console.log(b) //c

์–•์€ ๋ณต์‚ฌ

๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’(์ฃผ์†Œ๊ฐ’)์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ ํ•œ๋‹ค.
๋ณต์‚ฌํ•  ๋•Œ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋œ ๋ณ€์ˆ˜ ๋˜ํ•œ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‘ ๋ณ€์ˆ˜๋Š” ๋˜‘๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

const a = {
	one:1,
	two:2,
}
let b = a;

b.one = 3;

console.log(a) // {one:3, two:2}
console.log(b) // {one:3, two:2}

์–•์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•

์–•์€ ๋ณต์‚ฌ๋ž€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ๊ธฐ์กด ๊ฐ’๊ณผ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ๊ฐ™์€ ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋ผ๋„ ๊ธฐ์กด ๋ณ€์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์–•์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•œ๋‹ค.

1. Array.prototype.slice()

start ~ end ์ธ๋ฑ์Šค ๊นŒ์ง€ ๊ธฐ์กด ๋ฐฐ์—ด์—์„œ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ

const original = ['a',2,true,4,'hi']
const copy = original.slice()

console.log(JSON.stringfy(original) === JSON.stringify(copy)) // true

copy.push(10)
console.log(JSON.stringify(original) === JSON.stringfy(copy)) //false

console.log(original); // [ 'a', 2, true, 4, 'hi' ]

console.log(copy); // [ 'a', 2, true, 4, 'hi', 10 ]

2. Object.assign()

๋ฉ”์†Œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋ณต์‚ฌํ•  ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด๋œ๋‹ค.

const object = {
	a:'a',
	number:{
		one:1,
		two:2
	}
}

const copy = Object.assign({},object)
copy.number.one = 3

console.log(object === copy) //false
console.log(object.number.one === copy.number.one) //true

๊นŠ์€ ํด๋กœ๋‹์— ๋Œ€ํ•œ ์ฃผ์˜์‚ฌํ•ญ
๊นŠ์€ ํด๋กœ๋‹์— ๋Œ€ํ•ด์„œ, Object.assign()์„ ์†์„ฑ์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
์ถœ์ฒ˜ ๊ฐ’์ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฒฝ์šฐ, ์ฐธ์กฐ ๊ฐ’๋งŒ์„ ๋ณตํ•œ๋‹ค.

deapth๊ฐ€ 1์ผ๋•Œ ๊นŒ์ง€๋งŒ ์ ์šฉ

3. spread์—ฐ์‚ฐ์ž

const object = {
	a:'a',
	number:{
		one:1,
		two:2
	}
}
const copy = {...object}
copy.number.one = 3

console.log(object === copy) //false
console.log(object.number.one === copy.number.one) //true

deapth๊ฐ€ 1์ผ๋•Œ ๊นŒ์ง€๋งŒ ์ ์šฉ

๊นŠ์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•

๊นŠ์€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋„ ์›๋ณธ๊ณผ ์ฐธ์กฐ๊ฐ€ ์™„์ „ํžˆ ๋Š์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

JSON.parse && JSON.stringify

JSON.stringify()๋Š” ๊ฐ์ฒด๋ฅผ json๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ -> ์›๋ณธ๊ฐ์ฒด์™€ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ๋Š์–ด์ง„๋‹ค.
JSON.parse()๋ฅผ ์ด์šฉํ•ด ๋‹ค์‹œ ์›๋ž˜ ๊ฐ์ฒด(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.)
์‰ฝ์ง€๋งŒ ๋‹ค๋ฅธ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ๋Š๋ฆผ.
function์ผ ๊ฒฝ์šฐ undefined๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹จ์ ์ด๋‹ค.

const object = {
  a: "a",
  number: {
    one: 1,
    two: 2,
  },
  arr: [1, 2, [3, 4]],

};
const copy = JSON.parse(JSON.stringify(object))
copy.number.one = 3;
copy.arr[2].push(5)
console.log(object === copy); //false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 
console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

Lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ• ์ˆ˜ ์žˆ๋‹ค.

const deepCopy = require("lodash.clonedeep")

const object = {
  a: "a",
  number: {
    one: 1,
    two: 2,
  },
  arr: [1, 2, [3, 4]],

};

const copy = deepCopy(object)
copy.number.one = 3
copy.arr[2].push(5)
console.log(object === copy); // false

console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false
console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ ๋ณต์‚ฌ

const object = {

  a: "a",
  number: {
    one: 1,
    two: 2,
  },

  arr: [1, 2, [3, 4]],

};


function deepCopy(object) {

  if (object === null || typeof object !== "object") {
    return object;
  }

  // ๊ฐ์ฒด์ธ์ง€ ๋ฐฐ์—ด์ธ์ง€ ํŒ๋‹จ
  const copy = Array.isArray(object) ? [] : {};
  for (let key of Object.keys(object)) {
    copy[key] = deepCopy(object[key]);
  }
  return copy;
}

const copy = deepCopy(object);
copy.number.one = 3;
copy.arr[2].push(5);

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false
console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

[js] ๋ณ€์ˆ˜ ์™€ ํ˜ธ์ด์ŠคํŒ…

var, let, const ์˜ ์ฐจ์ด

var

  • var๋Š” ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ์กด์— ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์žŠ๊ณ  ๊ฐ’์„ ์žฌ ํ• ๋‹น ํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ํ• ์ˆ˜ ์žˆ๋‹ค.
  • var์€ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • var๋Š” ์ตœ์ƒ์œ„์— ๋Œ์–ด์˜ฌ๋ ค์ง„ ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค (ํ˜ธ์ด์ŠคํŒ…)
  • var๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ๋งŒ ์ง€์—ญ ๋ณ€์ˆ˜ ์ด๊ณ  ์ด์™ธ์˜ ๊ณณ์—์„œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

let

  • let์€ ์ค‘๋ณต ์„ ์–ธ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • let์€ ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • let์€ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜์ง€๋งŒ TDZ(Templar Dead Zone)๋•Œ๋ฌธ์— ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€๋‚œ๋‹ค. - ์„ ์–ธ ์ „์—๋Š” ์‚ฌ์šฉํ• ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ์˜ˆ์ธก๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๊ณ  ์ž ์žฌ์ ์ธ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • let์€ ๋ธ”๋ก์Šค์ฝ”ํ”„ ์ด๋ฉฐ ๋ธ”๋ก์Šค์ฝ”ํ”„ ์ด์™ธ์—์„œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜ ์ด๋‹ค.

const

  • const๋Š” ์„ ์–ธ+์ดˆ๊ธฐํ™”+ํ• ๋‹น ๋‹จ๊ณ„๊ฐ€ ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง„๋‹ค.
  • const ๋Š” ์žฌํ• ๋‹น์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • const๋„ ํ˜ธ์ด์ŠคํŒ…์€ ๋˜์ง€๋งŒ TDZ์— ์ ์šฉ๋˜์–ด ์„ ์–ธ์ „์—๋Š” ์ ‘๊ทผ ํ• ์ˆ˜ ์—†๋‹ค.
  • const ๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„์ด๋‹ค.

ํ˜ธ์ด์ŠคํŒ…

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

๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…

var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ์ƒํƒœ Undefined๋กœ ํ˜ธ์ด์ŠคํŒ…๋œ๋‹ค.
let,const ๋Š” TDZ์— ๋“ค์–ด๊ฐ€ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ ‘๊ทผ ํ• ์ˆ˜ ์—†์–ด ์ด๊ธฐ๊ฐ„๋™์•ˆ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค

ํ•จ์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ์„ ์–ธ์ „์—๋„ ํ˜ธ์ถœํ• ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜์„ ์–ธ์ด ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์™„์ „ํžˆ ํ˜ธ์ด์ŠคํŒ…๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ•˜๋ฏ€๋กœ ๋ณ€์ˆ˜ ์„ ์–ธํ›„ ์— ํ•จ์ˆ˜๋ฅผ ์•„์ง ํ• ๋‹น ๋ฐ›์ง€ ๋ชปํ•œ์ƒํƒœ๋กœ ํ˜ธ์ถœ ํ•˜์—ฌ error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ETC : ๊ธฐ์ˆ  ์™ธ ์งˆ๋ฌธ - 1

ํ˜‘์—…์—์„œ ๊ธฐ์–ต์— ๊ฐ€์žฅ ๋‚จ๋Š” ์ƒํ™ฉ, ํ˜‘์—…์—์„œ ์–ด๋ ค์› ๋˜ ๊ฒฝํ—˜(์–ด๋ ค์› ๋˜ ์ด์œ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€)

โ€œํŒ€์—์„œ 1์ธ๋ถ„์„ ํ•œ๋‹คโ€๊ณ  ํ•  ๋•Œ, 1์ธ๋ถ„์€ ์–ด๋–ค๊ฑธ ์˜๋ฏธํ•˜๋Š”๊ฑธ๊นŒ์š”?

NetWork: OAuth์™€ JWT์˜ ์ฐจ์ด์ 

OAuth, JWT

OAuth(Open Authorization)๋ž€?

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

OAuth์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • Resource Owner(์ž์› ์†Œ์œ ์ž): ์œ ์ €๋ฅผ ๋งํ•จ
  • Client(ํด๋ผ์ด์–ธํŠธ): ์œ ์ €์˜ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    (ex: ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ ค๋Š” ์›น ์‚ฌ์ดํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ)
  • Resource Server(์ž์› ์„œ๋ฒ„): ์œ ์ €์˜ ๊ณ„์ • ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„
    (ex: '๊ตฌ๊ธ€ ๋กœ๊ทธ์ธํ•˜๊ธฐ' ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ๊ธ€์ด ์ž์› ์„œ๋ฒ„๊ฐ€ ๋จ)
  • Authorization Server(์ธ์ฆ ์„œ๋ฒ„): ์œ ์ €์˜ ๊ณ„์ • ์ •๋ณด์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์„œ๋ฒ„
    ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž์› ์„œ๋ฒ„์™€ ์ธ์ฆ ์„œ๋ฒ„๋Š” ๊ฐ™์€ ์„œ๋ฒ„๊ฐ€ ๋งก๊ฒŒ ๋จ
    ๋”ฐ๋ผ์„œ, '๊ตฌ๊ธ€ ๋กœ๊ทธ์ธํ•˜๊ธฐ' ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ๊ธ€ ์—ญ์‹œ ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ๋จ
  • Redirect URI(๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI): ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ฃผ์†Œ
    ํด๋ผ์ด์–ธํŠธ๊ฐ€ OAuth ๊ณต๊ธ‰์ž(ex: '๊ตฌ๊ธ€ ๋กœ๊ทธ์ธํ•˜๊ธฐ' ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ตฌ๊ธ€์ด OAuth ๊ณต๊ธ‰์ž๊ฐ€ ๋จ. ์œ ์ €๋Š” ๊ตฌ๊ธ€์„ ํ†ตํ•ด ์ธ์ฆ ๋ฐ›๊ณ , ๊ตฌ๊ธ€์€ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ(์›น์‚ฌ์ดํŠธ)์—๊ฒŒ ์ œ๊ณต)์—๊ฒŒ ์ด ์ฃผ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ํ›„ ์ด ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋จ
  • Access Token(์•ก์„ธ์Šค ํ† ํฐ): ์ธ์ฆ ํ›„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์› ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์„ ๋งํ•จ
    ์ด ํ† ํฐ์„ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์› ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ

OAuth์˜ ๋™์ž‘ ๋ฐฉ์‹

๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋’ค์ชฝ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์„๊นŒ? - 1 <- ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์ข‹์Œ

๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋’ค์ชฝ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์„๊นŒ? - 2 <- ์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ์™€ ์„ค๋ช…

๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋’ค์ชฝ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์„๊นŒ? - 3 <- ๊ทธ ๋ถ„์˜ ๋ธ”๋กœ๊ทธ

JWT

#23 ์ค‘ JWT๋ฅผ ์ฐธ๊ณ 

OAuth์™€ JWT์™€ ์ฐจ์ด์ 

์ฐจ์ด์ ์ด๋ผ๊ธฐ ๋ณด๋‹ค๋Š” OAuth์˜ ์ธ์ฆ๊ณผ์ •์—์„œ JWT๋Š” ์—‘์„ธ์Šค ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
์ฆ‰, JWT๋Š” ํ† ํฐ์˜ ํ•œ ์ข…๋ฅ˜์ด๊ณ  OAuth๋Š” ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์ž„

React : Key Props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

Key Props

Key Props๋ž€?

Key Props๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์–ด๋–ค ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ• ์ง€ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋•๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ ,
์š”์†Œ์— ์•ˆ์ •์ ์ธ ๊ณ ์œ ์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ์š”์†Œ์— ์ง€์ •ํ•ด์•ผํ•จ
๋•Œ๋ฌธ์— key๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ๋‹ˆํฌํ•œ ๊ฐ’์ด์–ด์•ผํ•˜๊ณ , ๋ณดํ†ต ๋ฐ์ดํ„ฐ์˜ id๋ฅผ key๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•จ

const todoItems = todos.map((todo) =>
  <li key={todo.id}>
    {todo.text}
  </li>
);

Key Props๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋ฆฌ์•กํŠธ๋Š” ํ™”๋ฉด์ด ๋ฐ”๋€Œ๊ธฐ ์ „ ๊ฐ€์ƒ DOM๊ณผ ํ™”๋ฉด์ด ๋ฐ”๋€ ํ›„์˜ ๊ตฌ์กฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๊ฐ€์ƒDOM์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
์ด ๋‘˜์„ ๋น„๊ตํ•ด ๋ฐ”๋€ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์‹ค์ œ DOM์— ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ์„ ์ ์šฉํ•ด ๋ฐ”๊พธ์–ด ์คŒ
ํ•˜์ง€๋งŒ key๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ”๋€ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•ด์ค„ ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ด ํ•„์š”์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•จ

์˜ˆ๋ฅผ ๋“ค๋ฉด todo๋ผ๋Š” ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด todo๋ผ๋Š” ์•„์ดํ…œ์ด ์ถ”๊ฐ€๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด„
key๊ฐ€ ์—†๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘๋™ํ•จ

  1. ๋ฐ”๋€Œ๊ธฐ ์ „ ๊ฐ€์ƒ DOM๊ณผ ๋ฐ”๋€ ํ›„ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•  ๊ฐ€์ƒ DOM์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•จ
  2. key๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์š”์†Œ์™€ ๋™์ผํ•œ์ง€ ์•„๋‹Œ์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์•กํŠธ๋Š” ์ด์ „ ์š”์†Œ๋“ค๊ณผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•จ
  3. ์‹ค์ œ DOM์—์„œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•จ

=> ํ•„์š”์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•จ!

๋งŒ์•ฝ key๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘๋™ํ•  ๊ฒƒ์ž„

  1. ๋ฐ”๋€Œ๊ธฐ ์ „ ๊ฐ€์ƒ DOM๊ณผ ๋ฐ”๋€ ํ›„ ๋ณด์—ฌ์ฃผ์–ด์•ผํ•  ๊ฐ€์ƒ DOM์—์„œ ๋ฐ”๋€ ์š”์†Œ์˜ key๋ฅผ ๋ฐœ๊ฒฌํ•จ
  2. ํ•ด๋‹น key๊ฐ€ ์žˆ๋Š” ์š”์†Œ๋งŒ ๋ Œ๋”๋งํ•จ(์ „์ฒด ๋ Œ๋”๋งx)

key๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด ์ „์ฒด ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ !

React :Props์™€ State์˜ ์ฐจ์ด

Props์™€ State

props (short for โ€œpropertiesโ€) and state are both plain JavaScript objects. While both hold information that influences the output of render, they are different in one important way: props get passed to the component (similar to function parameters) whereas state is managed within the component (similar to variables declared within a function).

๋ฆฌ์•กํŠธ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” props์™€ state ๋‘˜ ๋‹ค ๋ Œ๋”๋ง ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ผ๊ณ  ์ •์˜ํ•จ.
์ฆ‰, ๋‘˜ ๋‹ค ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฐ์ดํ„ฐ์ž„.

props์™€ state์˜ ์ฐจ์ด์ 

  • props : ๋ถ€๋ชจ์—์„œ ์ž์‹์ปดํฌ๋„ŒํŠธ๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐ์ดํ„ฐ์ด๋ฉฐ, ๋‚ด๋ ค๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
  • state : ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” (ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ๋ฐ์ดํ„ฐ์ž„. useState ๊ฐ™์€ ํ›…์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•จ

์ฆ‰, state๋Š” ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ด ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ž„.
์˜ˆ๋ฅผ ๋“ค๋ฉด ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฐฏ์ˆ˜๊ฐ€ ๋ณ€ํ™”ํ•œ๋‹ค๋“ ์ง€, ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ œํ’ˆ์„ ๋‹ด์„ ๋•Œ ์ œํ’ˆ์ด ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œํ•  ๋•Œ๋Š” ์ œํ’ˆ์ด ์‚ญ์ œ๋˜๋Š” ๋“ฑ ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ด ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

JavaScript: variables, hoisting

JavaScript

Variables(var, let, const )

var

  • ์ค‘๋ณต์„ ์–ธ O , ์žฌํ• ๋‹น O
var a = 1;
var a = 10
a = 2

console.log(a) // 2
  • ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ window ๊ฐ์ฒด์˜ ์†์„ฑ์ด ๋จ
var a = 'hi';
console.log(window.a) // 'hi';
  • ํ˜ธ์ด์ŠคํŒ…๋  ๋•Œ ์ดˆ๊ธฐํ™”๋จ
console.log(x) // undefined
var x = 1
console.log(x) // 1

  • ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง
    (ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์–ด๋””๋“  var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ)
function example() {
  if (true) {
    var a = 1;
  }

  for (var i = 0; i < 5; i++) {
    console.log(i, "i") // 0 1 2 3 4
  }

  console.log(a); // 1
  console.log(i); // 5
}

example();

let

  • ์ค‘๋ณต์„ ์–ธ X, ์žฌํ• ๋‹น O
let b = 1
b = 2
console.log(b) // 2

-----------------------------
let p = 111
let p = 222 // error
  • ์„ ์–ธ๋ฌธ ์ด์ „ ์ ‘๊ทผ ๋ถˆ๊ฐ€(์ฐธ์กฐํ•  ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐœ์ƒ) -> ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
console.log(x) // ์ฐธ์กฐ ์—๋Ÿฌ
let x = 1
  • ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง (์„ ์–ธ๋œ ๋ธ”๋ก({}) ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ )
function example() {
  if (true) {
    let a = 1;
  }

  for (let i = 0; i < 5; i++) {
    console.log(i, "i") // 0 1 2 3 4
  }

  console.log(a); // ์ฐธ์กฐ ์—๋Ÿฌ
  console.log(i); // ์ฐธ์กฐ ์—๋Ÿฌ
}

example();

const

  • ์ค‘๋ณต์„ ์–ธX, ์žฌํ• ๋‹น X
  • let๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ ์–ธ๋ฌธ ์ด์ „ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ(์ƒˆ๋กœ์šด ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ)
  • ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง (์„ ์–ธ๋œ ๋ธ”๋ก({}) ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ )

Hoisting

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์„ ์–ธ๋ถ€๊ฐ€ ์ œ์ผ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง„ ๊ฒƒ ๊ฐ™์€ ํ˜„์ƒ์„ ๋งํ•จ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์–ด๋‚˜๊ฐ. ๊ทธ ๊ณผ์ •์—์„œ ์„ ์–ธํ•ด๋‘˜ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋จผ์ € ์„ ์–ธํ•ด๋‘๋Š”๋ฐ, ์„ ์–ธํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹คํ–‰ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(์•„๋ž˜ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ ์ „์—ญ ์ปจํ…์ŠคํŠธ) ์•ˆ์— ์ƒˆ๋กœ์šด ์‹๋ณ„์ž(์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” cat)๋ฅผ environment record์— ์ €์žฅํ•จ. ์•„๋ž˜ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ cat์€ var ํ‚ค์›Œ๋“œ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ

console.log(cat) // undefined

var cat = 'rey';

console.log(cat) // 'rey'

let์ด๋‚˜ const๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด environment record์— ์ €์žฅ์„ ํ•˜๊ธด ํ•˜์ง€๋งŒ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ.
๋”ฐ๋ผ์„œ ์‹๋ณ„์ž cat์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด cat์˜ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ)

์ฆ‰, let์ด๋‚˜ const๋กœ ์„ ์–ธํ–ˆ์„ ๋•Œ ์„ ์–ธ ์ด์ „์— ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์—ญ์ธ TDZ(temporal Dead Zone)๊ฐ€ ๋ฐœ์ƒํ•จ

console.log(cat) // reference error

let cat = 'rey';

console.log(cat) // rey


์ •๋ฆฌ

๋ณ€์ˆ˜

var

  • ์ค‘๋ณต์„ ์–ธ O , ์žฌํ• ๋‹น O
  • ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ window ๊ฐ์ฒด์˜ ์†์„ฑ์ด ๋จ
  • ํ˜ธ์ด์ŠคํŒ…๋  ๋•Œ ์ดˆ๊ธฐํ™”๋จ
  • ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง

let

  • ์ค‘๋ณต์„ ์–ธ X, ์žฌํ• ๋‹น O
  • ์„ ์–ธ๋ฌธ ์ด์ „ ์ ‘๊ทผ ๋ถˆ๊ฐ€(์ฐธ์กฐํ•  ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์—๋Ÿฌ ๋ฐœ์ƒ) -> ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ

const

  • ์ค‘๋ณต์„ ์–ธX, ์žฌํ• ๋‹น X
  • let๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ ์–ธ๋ฌธ ์ด์ „ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ์•ˆ์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ(์ƒˆ๋กœ์šด ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ)
  • ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง (์„ ์–ธ๋œ ๋ธ”๋ก({}) ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ )

ํ˜ธ์ด์ŠคํŒ…

  1. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
  • var ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚จ
  • let, const์˜ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ -> ๋”ฐ๋ผ์„œ ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ณ€์ˆ˜์— ์•„๋ฌด๋Ÿฐ ๊ฐ’์ด ๋‹ด๊ฒจ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์—†์Œ -> ์„ ์–ธ ๋ผ์ธ ์ด์ „์—๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Œ(TDZ ๋ฐœ์ƒ)

์„ ์–ธ
๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์‹๋ณ„์ž์™€ ์—ฐ๊ฒฐ

์ดˆ๊ธฐํ™”
์‹๋ณ„์ž์— ์•”๋ฌต์ ์œผ๋กœ undefined ๊ฐ’ ๋ฐ”์ธ๋”ฉ

  1. ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ ์ „์ฒด๊ฐ€ ํ˜ธ์ด์ŠคํŒ…๋จ
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ ์„ ์–ธ๋ถ€๋งŒ ํ˜ธ์ด์ŠคํŒ…๋จ

[network] JWT์™€ OAuth์˜ ์ฐจ์ด

OAuth์™€ JWT๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋‘๊ฐ€์ง€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ๋‘˜ ๋‹ค ์ธ์ฆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์‚ฌ์šฉ์‚ฌ๋ก€๊ฐ€ ๋‹ค๋ฅด๋‹ค.

OAuth

OAuth๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํƒ€์‚ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ์ธ์ฆ ํ‘œ์ค€์ด๋‹ค. OAuth ํ๋ฆ„์—๋Š” ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž(์‚ฌ์šฉ์ž),ํด๋ผ์ด์–ธํŠธ(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„ ์ด ์„ธ๊ฐ€์ง€๊ฐ€ ๊ด€๋ จ๋œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” Authorization Server๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์—๊ฒŒ Authorization(๊ถŒํ•œ๋ถ€์—ฌ)์„ ์š”์ฒญํ•˜๊ณ , ์Šน์ธ์ด ๋‚˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ Access Token์„ ๋ฐ›๋Š”๋‹ค.
OAuth๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ Facebook๋˜๋Š” Google์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์…œ ๋ฏธ๋””์–ด ๋กœ๊ทธ์ธ์— ์‚ฌ์šฉ๋œ๋‹ค.

JWT

JWT(JSON Web Token)๋Š” ๋‘ ๋‹น์‚ฌ์ž ๊ฐ„์— ์ „์†ก๋  ํด๋ ˆ์ž„(Clam)์„ ํ‘œํ˜„ํ•˜๋Š” URL ์•ˆ์ „์˜ ์ปดํŒฉํŠธํ•œ ์ˆ˜๋‹จ์ด๋‹ค.
header, payload, signature์˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ—ค๋”๋Š” ํ† ํฐ ์œ ํ˜•๊ณผ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•˜๊ณ , ํŽ˜์ด๋กœ๋“œ์—๋Š” ํด๋ ˆ์ž„์ด ํฌํ•จ๋˜๋ฉฐ, ์„œ๋ช…์€ ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
JWT๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋กœ๊ทธ์ธํ•˜๊ณ  JWT๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ›๋Š” ์ธ์ฆ์— ์‚ฌ์šฉ๋œ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ JWT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.

OAuth์™€ JWT์˜ ์ฐจ์ด์ 

OAuth์™€ JWT๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ๋‹ค๋ฅด๋‹ค. OAuth๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ (authorization)์— ์‚ฌ์šฉ๋˜๊ณ  JWT๋Š” ์ธ์ฆ(authentication)์— ์‚ฌ์šฉ๋œ๋‹ค.
OAuth๋Š” ํƒ€์‚ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, JWT๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ ๋œ๋‹ค.
OAuth์—๋Š” ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ JWT์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. OAuth ํ๋ฆ„์—๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์™€ ๋‹น์‚ฌ์ž๊ฐ€ ํฌํ•จ๋˜๋Š” ๋ฐ˜๋ฉด, JWTํ๋ฆ„์€ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋‘ ๋‹น์‚ฌ์ž๋งŒ ํฌํ•จํ•œ๋‹ค.

[JS] ์‹คํ–‰์ปจํ…์ŠคํŠธ

์‹คํ–‰์ปจํ…์ŠคํŠธ๋ž€?

์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ฐ์ฒด์ด๋‹ค.
์–ด๋–ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋Š” ์‹œ์ ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•œ๋‹ค.

  1. ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์œ„๋กœ ๋Œ์–ด ์˜ฌ๋ฆฐ๋‹ค. (ํ˜ธ์ด์ŠคํŒ…)
  2. ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑ
  3. this๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์˜ ๋‹ด๊ธฐ๋Š” ์ •๋ณด

  1. Variable Environment
    • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž ์ •๋ณด(recode)๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
    • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
    • ์„ ์–ธ ์‹œ์  LexicalEnvironment ์˜ snapshot
  2. LexicalEnvironment
    • variableEnvironment์™€ ๋™์ผํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค.
  3. this Binding

VariableEnvironment, LexicalEnvironment ๊ฐœ์š”

  1. VE vs LE
    • VE : ์Šค๋ƒ…์ƒท์„ ์œ ์ง€
    • LE : ์Šค๋ƒ…์ƒท์„ ์œ ์ง€ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ณ„์†ํ•ด์„œ ๋ฐ˜์˜ํ•œ๋‹ค.

LexicalEnvironment - EnvironmentRecord

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, VE์— ์ •๋ณด๋ฅผ ๋จผ์ € ๋‹ด์€ ๋‹ค์Œ, ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด LE๋ฅผ ๋งŒ๋“ค๊ณ  ์ดํ›„์—๋Š” ์ฃผ๋กœ LE๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

  • EnvironmentRecord : ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์‹๋ณ„์ž์™€ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’์ด ๊ธฐ๋ก๋˜๋Š” ๊ณต๊ฐ„ (๋‚ด๋ถ€ ์ „์ฒด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ง‘)

LexicalEnvironment์˜ environmentRecord์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ์‹๋ณ„์ž์™€ ์‹๋ณ„์ž์˜ ๊ฐ’์ด ๊ธฐ๋ก ๋˜๋ฉฐ, ํ•จ์ˆ˜์˜ ์‹คํ–‰์‹œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ (์‹คํ–‰๋ณด๋‹ค environmentRecord์ˆ˜์ง‘์ด ๋จผ์ € ๋˜๋ฏ€๋กœ )๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค ๋ผ๋Š” ๊ฐœ๋…์˜ ํ˜ธ์ด์ŠคํŒ…์ด ์ƒ๊ฒผ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…

  1. ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ถ€๋ฅผ ํ˜ธ์ด์ŠคํŒ… ํ•œ๋‹ค.
function a (x) {
	console.log(x);
	var x;
	console.log(x);
	var x = 2
	console.log(x)
}
a(1)

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์ ์šฉ
function a (){
	var x = 1;
	console.log(x)
	var x;
	console.log(x);
	var x = 2
	console.log(x)
}
a(1)

//ํ˜ธ์ด์ŠคํŒ… ์ ์šฉ
function a() {
	var x;
	var x;
	var x;

	x =1;
	console.log(x)
	console.log(x)
	x =2
	console.log(X)
}
a(1) 
//1,1,2
  1. ํ•จ์ˆ˜ ์„ ์–ธ์€ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค.
function a(){
	console.log(b)
	var b ='bbb'
	console.log(b)
	function b(){}
	console.log(b)
}
a()

//ํ˜ธ์ด์ŠคํŒ… ์ ์šฉ
function a () {
	var b;
	function b(){} //var b = function b(){}

	console.log(b)
	b= "bbb"
	console.log(b)
	console.log(b)
}
a() // bํ•จ์ˆ˜, 'bbb','bbb'

LexicalEnvironment(2) - ์Šค์ฝ”ํ”„, ์Šค์ฝ”ํ”„์ฒด์ธ, outerEnvironmentReference(=outer)

outerEnvironmentReference(outer)๋ž€ ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
ํ•ญ์ƒ outer๋Š” ์˜ค์ง ์ž์‹ ์ด ์„ ์–ธ๋œ ์‹œ์ ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

var a = 1;
var outer = function(){
	var inner = function(){
		console.log(a) //undefined
		var a = 3
	}
	inner()
	console.log(a) //1
}
outer()

| outerEnvironmentReference๋ž€ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ์„ ํ•œ๋‹ค๋ฉด ํ•ด๋‹น LexicalEnvironment์—์„œ ๋ฐœ๊ฒฌ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ, ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ๋‹ค์‹œ outerEnvironmentReference ์ฐธ์กฐํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ํ•˜๋ฉฐ outerEnvironmentReference๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

this Binding

this์˜ ๊ฐ’์ด ํ• ๋‹น์ด ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •๋œ๋‹ค. ์ „์—ญ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ this๋Š” ์ „์—ญ๊ฐ์ฒด์ด๋‹ค.(window)
ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ์˜ ๊ฐ’์€ thisํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅธ๋ฐ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด ์ฐธ์กฐ์— ์˜ํ•ด์„œ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น๊ฐ์ฒด๋กœ ์„ค์ •๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ „์—ญ ๊ฐ์ฒด(window)๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฑฐ๋‚˜ strict mode์—์„œ๋Š” undefined๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

const person ={
	name: "choco",
	say: function(){
		console.log( `Hello, my name is${this.name}`);
	}
}

person.calcAge(); //Hello, my name is choco

const sayHello = person.say;
sayHello();//NaN ---(2) // ๊ฐ์ฒด ์ฐธ์กฐ ๊ฐ’์ด ์—†๋‹ค.  (.๋„ ์—†๊ธฐ๋•Œ๋ฌธ์— ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ž ์กฐ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๋Š” this๋Š” window ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ๋˜๊ณ  ์ „์—ญ ๊ฐ์ฒด์— sayHello๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— NaN์ด ๋‚˜์˜จ๋‹ค.

TypeScript: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ , Type๊ณผ Interface์˜ ์ฐจ์ด์ 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ ์ด์œ , Type๊ณผ Interface์˜ ์ฐจ์ด์ 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ ์ด์œ 

  1. ์ •์  ํƒ€์ž… ์ฒดํฌ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ํƒ€์ž…์ด ๊ฒฐ์ •๋จ
    ๋”ฐ๋ผ์„œ ํƒ€์ž…๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ์‹œ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ
    ๊ทธ๋ž˜์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์— ํƒ€์ž… ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ

  2. ํƒ€์ž…์ถ”๋ก 
    ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํƒ€์ž…์„ ์ถ”๋ก ํ•จ. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ์ง€์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ๊ฐ€๋…์„ฑ๋„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ

Type๊ณผ Interface์˜ ์ฐจ์ด์ 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋ฌ˜์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
์ฆ‰, ๋‹ค์–‘ํ•œ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์— ์‚ฌ์šฉํ•จ

ํƒ€์ž…์€ ๋‹ค ๊ฐ€๋Šฅํ•จ

Type๊ณผ Interface์˜ ์‚ฌ์šฉ๋ฒ•์—์„œ์˜ ์ฐจ์ด์ 

  1. ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
    ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋”ฐ๋กœ ์„ ์–ธํ•ด๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์œผ๋ฉด ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•ฉ์ณ์ง
    ํƒ€์ž…์€ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์•„๋„ ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ์•Œ์•„์„œ ํ•ฉ์ณ์ง€์ง€ ์•Š๊ณ  ์—๋Ÿฌ ๋ฐœ์ƒํ•จ
// interface

interface Person {
	name: string;
}

interface Person {
	age: number;
}

const haha: Person = {
	name: 'jerry',
	age: 4
} // ์—๋Ÿฌ X
// Types

type Person = {
	name: string;
}

type Person = {
	age: number;
}

const haha: Person = {
	name: 'jerry',
	age: 4
} // ์—๋Ÿฌ O
  1. ํ”„๋กœํผํ‹ฐ ํ™•์žฅ
    ์ธํ„ฐํŽ˜์ด์Šค๋Š” extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ณ 
    ํƒ€์ž…์€ & ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ

๋‘˜ ๋‹ค ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํƒ€์ž…์„ ์ƒ์†๋ฐ›์•„ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Œ(๋‹ค์ค‘ ์ƒ์†)

// Interface

interface Name = {
	name: string
}

interface Person extends Name{
	age: number;
} 

const person: Person = {
	name: 'gh',
	age: 42
}
// Type

type Name = {
	name: string
}

type Person = Name & {
	age: number;
} 

const person: Person = {
	name: 'gh',
	age: 42
}

TypeScript Generic Utility Types

์ด๋ฏธ ์ •์˜ํ•œ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ž„

  • Partial : ํŠน์ • ํƒ€์ž…์˜ ์ผ๋ถ€ ํ”„๋กœํผํ‹ฐ๋งŒ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…
  • Readonly : ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •.
  • Record<K,T> : <key, type>์œผ๋กœ Key(key):Type(value)ํ˜•ํƒœ์ž„
interface Person {
  age: number
}

type Member = 'mimi' | 'yujin' | 'youngji'

const example : Record<Member, Person> = {
   'mimi': {age: 25},
   'yujin': {age: 30},
   'youngji': {age: 2}
}
  • Pick : ํŠน์ • ํƒ€์ž…์—์„œ ๋ช‡ ๊ฐœ์˜ ์†์„ฑ์„ ์„ ํƒํ•œ ํƒ€์ž…
interface User {
  name: string;
  email: string;
  age: number;
}

type aaType = Pick<User, 'email', | 'phone'>

const user: aaType = {
  email: '[email protected],
  age: 111
}
  • Omit<T,K> : T ์ค‘์—์„œ k๋ฅผ ์ œ์™ธํ•œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•จ
interface User {
  	email: string;
  	password: string;
  	game: {
    	kill: number;
  		death: number;
      	assist: number;
    }
}

const userOne: Omit<User, 'game'> = {
	email: '[email protected]',
    password: '1234',
};

[js] ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋น„๋™๊ธฐ

์ฝœ๋ฐฑํ•จ์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์„œ ํ˜ธ์ถœ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

์ฝœ๋ฐฑํ•จ์ˆ˜๋ž€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌ ํ•˜๋Š”๊ฒƒ

function sayHello(name, callback){
	const words = `์•ˆ๋…•ํ•˜์„ธ์š” ๋‚ด ์ด๋ฆ„์€ ${name} ์ž…๋‹ˆ๋‹ค.`
	callback(words) // ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
}

sayHello('๋งˆ๋ฃจ', function printing(name){
	console.log(name) // ์•ˆ๋…•ํ•˜์„ธ์š” ๋‚ด ์ด๋ฆ„์€ ๋งˆ๋ฃจ ์ž…๋‹ˆ๋‹ค.
})

์ฝœ๋ฐฑํ•จ์ˆ˜ ์‚ฌ์šฉ ์›์น™

1. ์ต๋ช… ํ•จ์ˆ˜

์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ํ•จ์ˆ˜์— ์ผํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์ฝ”๋“œ๊ฐ„ ๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์ด๋ฆ„ ์—†๋Š” "์ต๋ช…ํ•จ์ˆ˜"๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

sayHello('๋งˆ๋ฃจ', funcion (name){
	console.log(name)
})
  • ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€
let add =10 

function sum(x,y,callback){
	callback(x+y)
}

sum(1,2,function add(result){
 console.log(result)
})

console.log(add) // ๋ณ€์ˆ˜ -> ํ•จ์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

2. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ชจ์–‘์˜ ์ฝœ๋ฐฑ

function sayHello(callback){
	var name = 'sunja'
	callback(name)
}

sayHello((name)=>{
	console.log('Hello,' + name)
})

3. ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋„˜๊ธฐ๊ธฐ

์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ผํšŒ์šฉ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ์žฌํ™œ์šฉ์œผ๋กœ ์ž์ฃผ ์ด์šฉ๋  ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•จ์ˆ˜์˜์ด๋ฆ„๋งŒ ํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ์ธ์ž์— ์ „๋‹ฌํ•˜๋Š” ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•œ๋‹ค.

function greet(name){
	console.log('hello'+ name)
}
function sayHello(callback){
	var name ="choco"
	callback(name)
}
function sayHello2(callback){
	var name ="sunja"
	callback(name)
}

sayHello(greet) // hello choco
sayHello2(greet) // hello sunja

์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•จ์ˆ˜ ํ˜„ํƒœ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์ „๋‹ฌ ๊ฐ€๋Šฅ

function introduce(last, first, callback){
	var fullName = last + first
	callback(fullName)
}

function say_hello(name){
	console.log('์•ˆ๋…•ํ•˜์„ธ์š”'+name + '์ž…๋‹ˆ๋‹ค.')
}
function say_bye(name){
	console.log('์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”' + name + ์ž…๋‹ˆ๋‹ค.)
}

introduce('ํ™','๊ธธ๋™',say_hello)

introduce('ํ™','๊ธธ๋™',say_bye)

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ™œ์šฉ ์‚ฌ๋ก€

1. ์ด๋ฒคํ„ฐ ๋ฆฌ์Šค๋„ˆ๋กœ ์‚ฌ์šฉ

addEventListner๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ
ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ๋กํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์“ฐ์ธ๋‹ค.

let button = document.getElementById('button')

button.addEventListener('click',function(){
	console.log('Button Clicked')
})

2. ๊ณ ์ฐจํ•จ์ˆ˜์— ์‚ฌ์šฉ

๊ณ ์ฐจํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๊ฑฐ๋‚˜ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ

let numbers = [1,2,3,4,5]
let doubled = []

numbers.forEach(function(num){
	doubled.push(num*2)
})
console.log(doubled) // [2,4,6,8,10]

3. Ajax ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ

์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ ํ•˜๋Š” fetch๋ฉ”์„œ๋“œ์˜ ์„œ๋ฒ„์š”์ฒญ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

fetch("https://jsonplaceholder.typicode.com/users")
  .then(function (response) {
    // fetch ๋ฉ”์„œ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ response ์ธ์ž๋ฅผ ๋ฐ›์Œ
    return response.json(); // response ๊ฐ์ฒด์˜ json ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
  })
  .then(function (data) {
    // json ๋ฉ”์„œ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ data ์ธ์ž๋ฅผ ๋ฐ›์Œ
	console.log(data);
  })

4. ํƒ€์ด๋จธ ์‹คํ–‰ ํ•จ์ˆ˜

setTimeout ์ด๋‚˜ setInterval ๊ณผ ๊ฐ™์€ ํƒ€์ด๋จธํ•จ์ˆ˜์—์„œ ์ผ์ •ํ•œ ์‹œ๊ฐ„๋งˆ๋‹ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์šฉ๋„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ฃผ์˜์ 

this๋ฅผ ์‚ฌ์šฉํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜

์ž์‹ ์„ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ์ด๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜ํ•œ ๋ฐ”์—๋”ฐ๋ฅด๋ฉฐ, ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

let userData = {
    signUp: '2021-4-06 12:00:00',
    name: 'Not Set',
    setName: function(firstName, lastName) {
        this.name = firstName + ' ' + lastName;
    }
}
function getUserName(firstName, lastName, callback) {
    callback(firstName, lastName);
}
// ํ•ด๋‹น ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” userData.setName๊ณผ ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ๋งŒ ๋น„์Šทํ•œ ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜์ด๋‹ค.
getUserName('ํ™', '๊ธธ๋™', function(firstName, lastName) {
	this.name = firstName + ' ' + lastName;
});
console.log('1: ', userData.name); // Not Set
console.log('2: ', window.name); // ํ™ ๊ธธ๋™

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๋ณ„๋„๋กœ this๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

this ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  1. call, bind,apply ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
    ์ฐธ์กฐํ•  ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ call(), apply() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•  ๊ฐ์ฒด๋ฅผ ์ง€์ •
  2. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ
    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ this๋ฅผ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ this์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋ฌด์กฐ๊ฑด ์ž์‹ ์„ ๋“ค๊ณ  ์žˆ๋Š” ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ฝœ๋ฐฑ ์ง€์˜ฅ

์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ž€ ํ•จ์ˆ˜์˜ย ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ง€๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ์ฝ”๋“œ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์ด ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค์–ด์งˆ ์ •๋„๋กœ ๊นŠ์–ด์ง€๋Š” ํ˜„์ƒ

์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ํ•ด๊ฒฐ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋น„๋™๊ธฐ

๋™๊ธฐ

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

๋น„๋™๊ธฐ?

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํŠน์ง•

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์œ ์šฉ์„ฑ

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

Ajax

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋„ ์‚ฌ์šฉ์ž์™€ ์ธํ„ฐ๋„ฅ์…˜์„ ์œ ์ง€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ ์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค.

// fetch ํ•จ์ˆ˜์— URL ์ „๋‹ฌ
fetch("https://jsonplaceholder.typicode.com/todos/1")
  .then(function(response) {
    return response.json(); // ์‘๋‹ต์„ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
  })
  .then(function(data) {
    console.log(data); // JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
  })
  .catch(function(error) {
    console.error(error); // ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅ
  });

๋น„๋™๊ธฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์›๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด ์ด์ง€๋งŒ ์ž‘์—…(task)๋“ค์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š”

๋ธŒ๋ผ์šฐ์ €๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ด๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ web API์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋™์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์€ ์•„๋‹ˆ๋‹ค.
web api ๋งŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ๊ทธ์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ€ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

HTML ๋งˆํฌ์—… ์–ธ์–ด์—์„œ ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
<script>ํƒœ๊ทธ์— async ์™€ defer์˜ ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™ํžˆ๋ฉด๋œ๋‹ค

  • async : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ํŒŒ์‹ฑ๋˜๋Š” ๋™์•ˆ์—๋„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€์‹คํ–‰๋จ
  • defer : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€์˜ ํŒŒ์‹ฑ์„ ๋ชจ๋‘ ๋๋‚ด๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ
  • ๋ชจ๋‘ ๋ช…์‹œ ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ”๋กœ ์‹คํ–‰

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

๋น„๋™๊ธฐ์™€ ์ฝœ๋ฐฑํ•จ์ˆ˜

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

function getDB(callback){
// ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ 3์ดˆ ํ›„์— ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ฐ›์•„์˜จ ํ›„, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
	setTimeout(()=>{
		const value = 100
		callback(value)
	},3000)
}

function main(){
  
// ํ˜ธ์ถœํ•  ์ž‘์—…์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธด๋‹ค
	getDB(function(value){
		let data = value * 2
		console.log('data :', 'data' )
	})
}
main()

ํ•˜์ง€๋งŒ ๊ณผ๋„ํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ• ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์ง€์˜ฅ์— ๋น ์งˆ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด

์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ 'ํŽธ๋ฒ•' ๊ฐ™์€ ๊ฒƒ์ด๋ฉฐ ๋น„๋™๊ธฐ ์ „์šฉ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
ํ”„๋กœ๋ฏธ์Šค์˜ ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ „์šฉ๊ฐ์ฒด์ด๋‹ค.
๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.

function getDB(){
	 return new Promise((resolve)=>{
		 setTimeout(()=>{
			 const value = 100;
			 resolve(value)
		 },3000)
	 })
}

function main(){
		getDB().then((valve)=>{ //์„ฑ๊ณต์ ์‘๋กœ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ์‹คํ–‰์ฝ”๋“œ
		let data =value * 2
		console.log('data',data)
	})
	.catch((error)=>{ // ์‹คํŒจ ํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
		console.error(error)
	})
	.finally(()=>{ //์„ฑ๊ณตํ•˜๋“  ์‹คํŒจํ•˜๋“  ๋ฌด์กฐ๊ฑด ์‹คํ–‰
	
	})
}

ํ”„๋กœ๋ฏธ์Šค 3๊ฐ€์ง€ ์ƒํƒœ

  1. Pending : ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
  2. Fulfilled :์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ์ƒํƒœ (then)
  3. Rejected: ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจ๋กœ ๋๋‚œ์ƒํƒœ (catch)

ํ”„๋กœ๋ฏธ์Šค ํ•ธ๋“ค๋Ÿฌ

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜

  1. then() : ์ดํ–‰๋˜์—ˆ์„ ๋•Œ
  2. catch(): ๊ฑฐ๋ถ€๋˜์—ˆ์„ ๋•Œ
  3. finally(): ์ดํ–‰ ๊ฑฐ๋ถ€ ์ƒ๊ด€์—†์ด ์‹คํ–‰

ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

ํ”„๋กœ๋ฏธ์Šค ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๋‹ฌ์•„ ์—ฐ๊ฒฐํ•˜๋Š”๊ฒƒ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค ์ •์  ๋ฉ”์„œ๋“œ

  1. Promise.resolve()
// Promise.resolve() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function getPromiseNumber() {
  const num = getRandomNumber(); // ์ผ๋ฐ˜ ๊ฐ’
  return Promise.resolve(num); // ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด
}
// ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
getPromiseNumber()
    .then((value) => {
      console.log(`๋žœ๋ค ์ˆซ์ž: ${value}`);
    })
    .catch((error) => {
      console.error(error);
    });
  1. Promise.reject()
// ์ฃผ์–ด์ง„ ์‚ฌ์œ ๋กœ ๊ฑฐ๋ถ€๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ
const p = Promise.reject(new Error('error'));
// ๊ฑฐ๋ถ€ ์‚ฌ์œ ๋ฅผ ์ถœ๋ ฅ
p.catch(error => console.error(error)); // Error: error
  1. Promise.all()
    ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ดํ–‰ ๋ ๋Œ€ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์„œ, ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ๋•Œ thenํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
// 1. ์„œ๋ฒ„ ์š”์ฒญ API ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์ƒ์„ฑ (fetch)
const api_1 = fetch("https://jsonplaceholder.typicode.com/users");
const api_2 = fetch("https://jsonplaceholder.typicode.com/users");
const api_3 = fetch("https://jsonplaceholder.typicode.com/users");
// 2. ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋“ค์„ ๋ฌถ์–ด ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ
const promises = [api_1, api_2, api_3];
// 3. Promise.all() ๋ฉ”์„œ๋“œ ์ธ์ž๋กœ ํ”„๋กœ๋ฏธ์Šค ๋ฐฐ์—ด์„ ๋„ฃ์–ด, ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ดํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅ
Promise.all(promises)
    .then((results) => {
      // results๋Š” ์ดํ–‰๋œ ํ”„๋กœ๋ฏธ์Šค๋“ค์˜ ๊ฐ’๋“ค์„ ๋‹ด์€ ๋ฐฐ์—ด.
      // results์˜ ์ˆœ์„œ๋Š” promises์˜ ์ˆœ์„œ์™€ ์ผ์น˜.
      console.log(results); // [users1, users2, users3]
    })
    .catch((error) => {
      // ์–ด๋Š ํ•˜๋‚˜๋ผ๋„ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅ
      console.error(error);
    });
  1. Promise.allSettled()
    ์ฃผ์–ด์ง„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค ๊ฐ๊ฐ์˜ ์ƒํƒœ์™€ ๊ฐ’(๊ฑฐ๋ถ€์‚ฌ์œ )๋ฅผ ๋ชจ์•„ ๋ฐฐ์—ด์— ๋ฐ˜ํ™˜
  2. Promise.any()
    ์ฃผ์–ด์ง„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์™„๋ฃŒ๋˜๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜
  3. Promise.race()
    ์ดํ–‰, ์‹คํŒจ ์—ฌ๋ถ€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ”„๋กœ๋ฏธ์Šค ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜

ํ”„๋กœ๋ฏธ์Šค ๋˜ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด ์ง€๋ฉด ์ฝ์„์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜๋ฉฐ ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ async/await ๊ฐ€ ์žˆ๋‹ค.

async/await

๋งˆ์น˜ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

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

์—๋Ÿฌ ์ฒ˜๋ฆฌ

try cath๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

// async/await ๋ฐฉ์‹
async function func() {

    try {
        const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
        const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
        // data ์ฒ˜๋ฆฌ
        console.log(data);
    } catch (err) {
        // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
        console.error(err);
    }

}
func();

React: useRef, useEffect

useRef, useEffect

useRef

useRef returns a mutable ref object whose .current property is initialized to the passed argument (initialValue). The returned object will persist for the full lifetime of the component.

๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์˜ ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด .current ์†์„ฑ์ด ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋กœ(initialValue) ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ref ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ „์ฒด ์ˆ˜๋ช…๋™์•ˆ ์œ ์ง€๋œ๋‹ค๊ณ  ํ•จ
์ด๋ฅผ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Œ

  • useRef๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  • ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋Š” useRef ์ธ์ž๋ฅผ current๋ผ๋Š” ์†์„ฑ ์•ˆ์— ์ €์žฅํ•จ
const ref = useRef('hihi')
console.log(ref.current) // 'hihi'

// { current: 'hihi' } ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜ํ™˜๋จ
  • ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช…์ด ๋‹คํ•˜๊ธฐ ์ „๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค(์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „๊นŒ์ง€ ์œ ์ง€๊ฐ€ ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ)

๋˜ํ•œ useRef๋กœ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, useRef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Ref์˜ ๊ฐ’์ด ๋ณ€ํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๊ณ , ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „๊นŒ์ง€(์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช…์ด ๋‹ค ํ•˜๊ธฐ ์ „๊นŒ์ง€) Ref์˜ ๊ฐ’์ด ์œ ์ง€๋จ

useRef๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ

  • ์ €์žฅ ๊ณต๊ฐ„
    state ์ฒ˜๋Ÿผ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐจ์ด์ ์ด ์žˆ์Œ

State ๋ณ€ํ™” -> ๋ Œ๋”๋ง -> ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋“ค ์ดˆ๊ธฐํ™”
Ref ๋ณ€ํ™” -> ๋ Œ๋”๋ง X -> ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์ด ์œ ์ง€๋จ
State ๋ณ€ํ™” -> ๋ Œ๋”๋ง -> Ref์˜ ๊ฐ’์€ ๊ณ„์† ์œ ์ง€๋จ(์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ์ „๊นŒ์ง€)

=> ๊ทธ๋ž˜์„œ ๋ณ€๊ฒฝ์‹œ ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ๋ง์•„์•ผํ•˜๋Š” ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ

  • DOM ์— ์ ‘๊ทผ
    ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ document.querySelector() ๊ฐ™์ด ์ง์ ‘์ ์œผ๋กœ DOM ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋“ค์–ด์™”์„ ๋•Œ ์ž๋™์œผ๋กœ ์•„์ด๋””๋ฅผ ์ ๋Š” ์ธํ’‹์„ ํด๋ฆญํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๊ฐ€ ๊ฐ€๊ฒŒ ํ•œ๋‹ค๋“ ์ง€ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋จ

useEffect

useEffect๋Š” componentDidMount, componentDidUpdate, componentWillUnmount๋ฃฐ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ๋ฆฌ์•กํŠธ ํ›…์ด๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ๋œ side effect ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ (๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ˆ˜๋™ DOM ์กฐ์ž‘ ๋“ฑ), ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ›…์ž„

useEffect ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋œ ํ›„ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•จ.

useEffect(() => {
  console.log('componentDidMount')

  return () => {
    // cleanUp
    console.log('componentWillUnmount')
  }
}, [array dependencies])
// deps์— ํฌํ•จ๋œ state๋‚˜ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ Œ๋”๋ง ๋จ(componentDidMount์™€ componentDidUpdate๋ฅผ ํ•ฉ์นœ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘)
// deps์— ๋นˆ๋ฐฐ์—ด์„ ๋„ฃ์€ ๊ฒฝ์šฐ componentDidMount์ฒ˜๋Ÿผ ๋™์ž‘ํ•จ. ์ฆ‰, ๋งˆ์šดํŠธ๋˜๊ณ  ์ฒซ ๋ Œ๋”๋ง์ด ๋๋‚œ ์งํ›„์—๋งŒ ์ฒซ๋ฒˆ์งธ ์ธ์ž์ธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ
// ๋ฆฌํ„ด ๋ถ€๋ถ„์— ์“ฐ์ธ ํ•จ์ˆ˜๋Š” ํด๋ฆฐ์—… ํ•จ์ˆ˜๋กœ componentWillUnmount์ฒ˜๋Ÿผ ๋™์ž‘ํ•จ

useEffect๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ์„ฑ๋Šฅ์ด๋‚˜ ๋ Œ๋”๋ง์—๋Š” ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(๋ถ€์ˆ˜ํšจ๊ณผ, side effect)๋ž€?

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜๋กœ ์ •์˜๋˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•จ.
์ฆ‰, ์ž…๋ ฅ(props)์„ ๋ฐ›์œผ๋ฉด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ jsx๋ฅผ returnํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

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

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Œ

  • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ api ๋ฐ์ดํ„ฐ ์š”ํŽ‘
  • ๋ธŒ๋ผ์šฐ์ € api์™€ ์ƒํ˜ธ์ž‘์šฉ(document, window ์ง์ ‘ ์‚ฌ์šฉ ๋“ฑ DOM ์กฐ์ž‘์— ๊ด€๋ จ๋จ)
  • setTimeout, setInterval ๋“ฑ ํƒ€์ด๋จธ ๊ด€๋ จ ํ•จ์ˆ˜

์ •๋ฆฌ

useRef

  • useRef๋กœ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ
  • useRef๋Š” ๊ฐ’์ด ๋ณ€ํ•ด๋„ ๋ฆฌ๋ Œ๋”๋งX, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „๊นŒ์ง€(์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช…์ด ๋‹ค ํ•˜๊ธฐ ์ „๊นŒ์ง€) Ref์˜ ๊ฐ’์ด ์œ ์ง€๋จ

useEffect

  • componentDidMount, componentDidUpdate, componentWillUnmount๋ฃฐ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ํ›…
  • ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ๋œ side effect ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋น„๋™๊ธฐ ์ž‘์—…๊ณผ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

[network] ์ฟ ํ‚ค,์„ธ์…˜, ์›น์Šคํ† ๋ฆฌ์ง€ ์ฐจ์ด

HTTP ํ”„๋กœํ† ์ฝœ์ด๋ž€?

HTTP๋Š” ์ธํ„ฐ๋„ท ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ๋”ฐ๋ฅด๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

HTTP ํŠน์ง•

  • ๋น„์—ฐ๊ฒฐ์ง€ํ–ฅ : request์— ๋Œ€ํ•œ response๋ฅผ ํ•ด์ฃผ๋ฉด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„๋‹ค. ์ปค๋„ฅ์…˜์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌด์ƒํƒœ(stateless) : ์—ฐ๊ฒฐ์„ ๋Š๋Š” ์ˆœ๊ฐ„ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

1.์ฟ ํ‚ค (Cookie)

  • ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ์— ์ €์žฅ๋˜๋Š” ํ‚ค์™€ ๊ฐ’ ํ˜•ํƒœ์˜ ์ž‘์€ ํŒŒ์ผ๋กœ, ์ด๋ฆ„, ๊ฐ’, ๋งŒ๋ฃŒ์‹œ๊ฐ„, ๊ฒฝ๋กœ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋กœ์ปฌ์— ์ €์žฅํ–ˆ ๋‹ค๊ฐ€ ์ฐธ์กฐํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์— 300๊ฐœ๊นŒ์ง€ ์ €์žฅ๊ฐ€๋Šฅ, ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ๋‹น 20๊ฐœ์˜ ๊ฐ’๋งŒ ๊ฐ€์งˆ์ˆ˜ ์žˆ์œผ๋ฉด ํ•˜๋‚˜์˜ ์ฟ ํ‚ค ๊ฐ’์€ 4KB๊นŒ์ง€ ์ €์žฅ๊ฐ€๋Šฅ
  • ์ฟ ํ‚ค๋Š” ํŠน์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํšจํ™” ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ธฐ์— ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ์กด์žฌํ•œ๋‹ค
  • ํด๋ผ์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•œ ๋ฐฉ๋ฌธ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๊ธฐ์— ๋งค๋ฒˆ ์„œ๋ฒ„ ์ „์†ก์ด ๋˜๊ธฐ์— ์ž์› ์†Œ๋ชจ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์˜ค๋žœ์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ฟ ํ‚ค์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ์— CSRF ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค

CSRF (Cross Site Request Forgery) ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(์ˆ˜์ •,์‚ญ์ œ,๋“ฑ๋ก)๋ฅผ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ ์ด๋‹ค.

์ฟ ํ‚ค ์‚ฌ์šฉ์ฒ˜

  • ๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ ์•„์ด๋”” ์ž๋™์™„์„ฑ
  • ํŒ์—… ํ™”๋ฉด์—์„œ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋ณด์ง€ ์•Š๊ธฐ
  • ๋ฏธ ๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ

2.์„ธ์…˜

  • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํŒŒ์ผ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅํ•˜๋Š” ์ฟ ํ‚ค์™€ ๋‹ฌ๋ฆฌ ์„ธ์…˜์€ ==์„œ๋ฒ„์ธก์—์„œ ๊ด€๋ฆฌ==ํ•œ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜ ID๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ, ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์ธ์ฆ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  • ์ ‘์† ์‹œ๊ฐ„์— ์žฌํ•œ์„ ๋‘์–ด ์ผ์ • ์‹œ๊ฐ„ ์‘๋‹ต์ด ์—†๋‹ค๋ฉด ์ •๋ณด๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ๋‘๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ณด๋‹จ ๋ณด์•ˆ์ด ์ข‹์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ฐจ์ด์ 

๊ตฌ๋ถ„ ์ฟ ํ‚ค ์„ธ์…˜
๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ์„œ๋ฒ„
๋ณด์•ˆ ์ €์žฅ ์œ„์น˜ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋Š” CSRF ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ์„ธ์…˜ ์•„์ด๋””๋งŒ ์ €์žฅํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ ๋†’์Œ
๋ผ์ดํ”„์‚ฌ์ดํด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•ด๋„ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ๋‚จ์•„์žˆ์œผ๋ฉด ์กด์žฌ ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์— ์ƒ๊ด€์—†์ด ์ข…๋ฃŒ
์†๋„ ์„ธ์…˜๋ณด๋‹ค ๋น ๋ฆ„ ์ฟ ํ‚ค๋ณด๋‹ค ๋Š๋ฆผ
๋งŒ๋ฃŒ์‹œ์  ์ฟ ํ‚ค์ €์žฅ์‹œ ์„ค์ • ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ์‹œ ์‚ญ์ œ

3. ์›น์Šคํ† ๋ฆฌ์ง€

  • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก HTML5๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ์ €์žฅ์†Œ
  • ๊ฐ„๋‹จํ•œ Key-Value ์Šคํ† ๋ฆฌ์ง€ ํ˜•ํƒœ
  • ์ฟ ํ‚ค์™€ ๋‹ฌ๋ฆฌ ์ž๋™ ์ „์†ก ์œ„ํ—˜์„ฑ์ด ์—†๋‹ค.
  • ์˜ค๋ฆฌ์ง„(Origin)(๋„๋ฉ”์ธ,ํ”„๋กœํ† ์ฝœ, ํฌํŠธ)๋‹จ์œ„๋กœ ์ ‘๊ทผ์ด ์ œํ•œ๋˜๋Š” ํŠน์„ฑ ๋•๋ถ„์— CSRF๋กœ๋ถ€ํ„ฐ ์•ˆ์ „
  • ์ฟ ํ‚ค๋ณด๋‹ค ํฐ ์ €์žฅ ์šฉ๋Ÿ‰ ์ง€์›(๋ชจ๋ฐ”์ผ 2.5MB, ๋ฐ์ŠคํŠธํƒ‘ 5~10MB)
  • ์„œ๋ฒ„๊ฐ€ HTTPํ—ค๋”๋ฅผ ํ†ตํ•ด ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†์Œ(์ž๋ฐ”์Šคํฌ๋ฆผํŠธ ๋‚ด์—์„œ๋งŒ ์ˆ˜ํ–‰๊ฐ€๋Šฅ)
  • ์˜ค์ง ๋ฌธ์žํ˜•(String)๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์ง€์›
  • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด๋ฅผ ์ƒ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ผ

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ (localStorage)

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ์ง€ ์•Š๋Š” ์ด์ƒ, ๋ธŒ๋ผ์šฐ์ €๋‚˜ OS๋ฅผ ์ข…๋ฃŒํ•ด๋„ ๊ณ„์† ๋ธŒ๋ผ์šฐ์ €์— ๋‚จ์•„์žˆ๋‹ค(์˜๊ตฌ์„ฑ)
  • ๋™์ผํ•œ ๋„๋ฉ”์ธ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ง€์†์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ(์ž๋™ ๋กœ๊ทธ์ธ)

์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€(SessonStorage)

  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ OS๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ์‚ฌ๋ผ์ง€๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ์œ ์ง€๋  ๋•Œ์—๋งŒ ํ•ด๋‹น ์ €์žฅ์†Œ๊ฐ€ ์œ ์ง€
  • ๋™์ผํ•œ ๋„๋ฉ”์ธ๊ณผ ํƒญ์—์„œ๋งŒ ์œ ํšจํ•˜๊ณ , ๋‹ค๋ฅธ๋„๋ฉ”์ธ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋ฏธ๋กœ ์œ ์ง€๋˜๋Š” ์ž…๋ ฅํผ ์ •๋ณด, ์ผํšŒ์„ฑ ๋กœ๊ทธ์ธ, ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋ฐ์ดํ„ฐ ์œ ์ง€ ์ •๋ณด

[network]ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ

์ธ์ฆ๊ณผ ์ธ๊ฐ€

์‹œ์Šคํ…œ์˜ ์ž์›์„ ์ ์ ˆํ•˜๊ณ  ์œ ํšจํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ๊ณต๊ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•

์ธ์ฆ(Authentication)

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

์ธ๊ฐ€(Authorization)

์ธ์ฆ ์ž‘์—… ์ดํ›„์— ํ–‰ํ•ด์ง€๋Š” ์ž‘์—…,
์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ํ™•์ธ ์ ˆ์ฐจ
์œ ์ €1์ด ์“ด๊ธ€์— ์œ ์ €2 ๊ฐ€ ์ˆ˜์ • ์‚ญ์ œ ํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ์ด๋Š” ์ธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


HTTP๋Š” ๋น„์ƒํƒœ์„ฑ์ด๋ผ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ธ์ฆ๊ณผ์ •์„ ๊ฑฐ์ณค๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

์ด๋Ÿฌํ•œ HTTP ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋Š” ์„ธ์…˜ ๋˜๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์ธ๊ฐ€ํ•œ๋‹ค.


์„ธ์…˜๊ธฐ๋ฐ˜ ์ธ์ฆ

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ •๋ณด๊ฐ€ ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹

  1. ๋กœ๊ทธ์ธ -> ์ธ์ฆ์ •๋ณด ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ ์ €์žฅ
  2. Session ID ๋ฐœ๊ธ‰ -> ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค ํ˜•ํƒœ ์ €์žฅ -> ์‹ค์ œ ์ธ์ฆ ์ •๋ณด๋Š” ์„œ๋ฒ„์— ์ €์žฅ
  3. ์š”์ฒญ๋งˆ๋‹ค HTTP Cookie ํ—ค๋”์— Session ID๋ฅผ ํ•จ๊ป˜ ์„œ๋ฒ„๋กœ ์ „์†ก
  4. Session ID ํ•ด๋‹น ํ•˜๋Š” ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ ํŒ๋‹จ ํ•˜์—ฌ ์ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ ํ•ด ์ค€๋‹ค.

์žฅ์ 

  • ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ๊ฐ€ ๋งค์šฐ ํŽธํ•˜๊ณ  ํšจ์œจ์ 
  • ๊ตฌํ˜„์ด ๋ช…ํ™•ํ•˜๋ฉฐ ์‹ค์ œ ์„œ๋ฒ„์—์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ ์šฉ

๋‹จ์ 

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

๋กœ๋“œ ๋ฒจ๋Ÿฐ์‹ฑ
์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์—…๋ฌด ํ˜น์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ

์ด๋Ÿฌํ•œ ๋‹จ์ ๋“ค๋กœ์ธํ•ด ํ† ํฐ ๋ฐฉ์‹์ด ์ƒ๊ฒจ๋‚จ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹

์ธ์ฆ ์ •๋ณด๋ฅผ ํด๋ผ๋ฆฌ์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋“ค๊ณ  ์žˆ๋Š” ๋ฐฉ์‹.

  1. ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ์š”์ฒญ -> id, pw ์ •๋ณด์œ ํšจ -> ์„œ๋ฒ„์—์„œ Secret Key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ €์—๊ฒŒ ํ† ํฐ ๋ฐœ๊ธ‰
  2. ํด๋ผ์ด์–ธํŠธ ํ† ํฐ ์ €์žฅ -> ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์„œ๋ฒ„์— ์ „๋‹ฌ
  3. ์„œ๋ฒ„๋Š” ํ† ํฐ ๊ฒ€์ฆ -> ์š”์ฒญ ์‘๋‹ต

ํ† ํฐ ๊ตฌ์กฐ

์ธ์ฝ”๋”ฉ ์•”ํ˜ธํ™”๋œ 3๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์–ด ๋ถ™์ธ๊ฒƒ

  1. header : ํ† ํฐ์„ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๋‚ด์šฉ
  2. playload: ํ† ํฐ์— ๋‹ด๊ธด ์‚ฌ์šฉ์ž ์ •๋ณด ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ ๋˜์–ด์žˆ๋‹ค.
  • ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒ ๋ฐœ๊ธ‰?
  • ์œ ํšจ๊ธฐ๊ฐ„
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด ํ† ํŠผ์„ ํ†ตํ•ด ๊ณต๊ฐœํ•˜๊ธฐ ์›ํ•˜๋Š” ๋‚ด์šฉ (์‚ฌ์šฉ์ž์˜ ๋‹‰๋„ค์ž„, ์„œ๋น„์Šค ์ƒ์˜ ๋ ˆ๋ฒจ, ๊ด€๋ฆฌ์ž ์—ฌ๋ถ€)
    => ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ›์•„์„œ ๊ฐ–๊ณ  ์žˆ๋Š” ํ† ํฐ ์ž์ฒด์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์ด ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ๋“ค์ด ์ค„์–ด๋“ฌ
  1. signature: ๋ถ€ํ˜ธํ™” ์‹œํ‚จ header์™€ playload๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐœ๊ธ‰ํ•ด์ค€ ์„œ๋ฒ„๊ฐ€ ์ง€์ •ํ•œ scret key๋กœ ์•”ํ˜ธํ™” ์‹œ์ผœ ํ† ํฐ ๋ณ€์กฐํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ํ•œ๋‹ค.

์žฅ์ 

  • ํด๋ผ์ด์–ธํŠธ์— ํ† ํฐ์ด ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ Scale์— ์žˆ์–ด ๋Œ€๋น„์ฑ…์„ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ์—†๋‹ค.

๋‹จ์ 

  • ์•”ํ˜ธํ™”๊ฐ€ ํ’€๋ฆด ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฐ์ œ ํ• ์ˆ˜ ์—†๋‹ค.
    • ์•”ํ˜ธํ™”๊ฐ€ ํ’€๋ฆฌ๋”๋ผ๋„ ํ† ํฐ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์—†๋„๋ก ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•œ๋‹ค.(5,6๋ถ„~ 1์‹œ๊ฐ„)
  • playload ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋˜์ง€ ์•Š๊ณ  base64๋กœ ์ฝ”๋”ฉํ•œ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ, ์ค‘๊ฐ„์— playload๋ฅผ ํƒˆํ‡ดํ•˜๋ฉด ๋””์ฝ”๋”ฉ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ JWT์„ ํ†ตํ•ด ์•”ํ˜ธํ™” ํ•˜๊ฑฐ๋‚˜, playLoad์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

JWT ๋ž€?

(JSON Web Token)๋ž€ ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSONํ† ํฐ

JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ
JWT ํ† ํฐ(Access Token)์„ HTTPํ—ค๋”์— ์‹ค์–ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ์‹

JWT๋ฅผ ์ด์šฉํ•œ ์ธ์ฆ ๊ณผ์ •

  1. ์‚ฌ์šฉ์ž๊ฐ€ ID, PW๋ฅผ ์ž…๋ ฅ -> ์„œ๋ฒ„ ๋กœ๊ทธ์ธ ์ธ์ฆ
  2. Header,payLoad,Signature๋ฅผ ๊ฐ๊ฐ Base64๋กœ ํ•œ ๋ฒˆ๋” ์•”ํ˜ธํ™”ํ•˜์—ฌ JWT ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐœ๊ธ‰
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ ๋ฐ›์€ JWT๋ฅผ ๋กœ์ปฌ์Šคํ† ๋ฆฌ ์ €์žฅ(์ฟ ํ‚ค,์„ธ์…˜ ์ €์žฅ) API๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ Authorization header์— Access Token ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.
  4. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ Header์— ๋‹ด์•„ ๋ณด๋‚ธ JWT๊ฐ€ ์„œ๋ฒ„๋‚ด์— ๋ฐœํ–‰ํ•œ ํ† ํฐ์ธ์ง€ ์ผ์น˜์—ฌ๋ถ€ ํ™•์ธํ•˜์—ฌ ์ธ์ฆํ†ต๊ณผ ์‹œ์ผœ์ฃผ๊ณ  ํŽ˜์ด๋กœ๋“œ์— ๋“ค์–ด์žˆ๋Š” ์œ ์ €์˜ ์ •๋ณด๋“ค์„ selectํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์— ๋Œ๋ ค์ค€๋‹ค.
  5. ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„ ์š”์ฒญ ํ–ˆ๋Š”๋ฐ AccessToken ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” refresh token์„ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์—์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค.

์ฟ ํ‚ค์— JWT ์ €์žฅ ์‹œ ์ทจ์•ฝ์ 

  • Cross-Site Scripting (XSS) ๊ณต๊ฒฉ: ์ฟ ํ‚ค์— ์ €์žฅ๋œ JWT๋Š” XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋ฉด, ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜์—ฌ JWT๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CSRF (Cross-Site Request Forgery) ๊ณต๊ฒฉ: CSRF ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ์ค€๋น„ํ•œ ํŠธ๋žฉ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. JWT๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋ฉด, ์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค ์„ค์ •์˜ ์ค‘์š”์„ฑ: ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ HttpOnly, Secure, SameSite ๋“ฑ์˜ ์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HttpOnly๋Š” XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋ฉฐ, Secure๋Š” HTTPS๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. SameSite ์†์„ฑ์€ ์ฟ ํ‚ค๊ฐ€ ๋™์ผํ•œ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…

  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ: ์ฟ ํ‚ค ๋Œ€์‹  JWT๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ• ์—ญ์‹œ XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค์˜ ๋ณด์•ˆ ์†์„ฑ ์„ค์ •: ์ฟ ํ‚ค์— JWT๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” ๋ณด์•ˆ ์†์„ฑ์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋‹จ์ถ•: ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋Ÿฌํ•œ ์ ๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. JWT์™€ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๋ณด์•ˆ ์ธก๋ฉด์„ ๊ณ ๋ คํ•˜์—ฌ ์ ์ ˆํ•œ ๋ฐฉ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[react] Redux์™€ Recoil์— ๋Œ€ํ•ด ๋น„๊ต ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

Redux

๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅด๋Š” Flux ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ

์žฅ์ 

  • ๋ชจ๋“  ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์•ก์…˜์œผ๋กœ ์ •์˜ํ•˜๊ณ , ์•ก์…˜ ์ •๋ณด์— ๊ธฐ๋ฐ˜์ด์—ฌ ๋ฆฌ๋“€์„œ์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์— ๊ธ์ •์ ์ธ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค
  • redux devtools๋ฅผ ์ด์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•˜ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์žˆ๋‹ค (redux-thunk, redux-saga)

๋‹จ์ 

  • ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋ณต์žกํ•˜๋‹ค
  • ๋ณด์ผ๋Ÿฌํด๋ ˆ์ดํŠธ์ฝ”๋“œ(๋ณ€ํ™”์—†์ด ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ)๊ฐ€ ๋งŽ๋‹ค.
  • ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์œ„ํ•ด redux-thunk, redux-saga๋“ฑ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • hook ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋‹ค.

Recoil

Facebook์—์„œ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ใ…‡๊ตฌ์กฐ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹
์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๋ณด๋‹ค ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Recoil ์ฃผ์š”๊ธฐ๋Šฅ

  • Atom
    • ์—…๋ฐ์ดํŠธ์™€ ๊ตฌ๋… ๊ฐ€๋Šฅ
    • ๋กœ๊ฑธ state ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ณ ์œ ํ•œ ํ‚ค ๊ฐ’๊ณ  ๋””ํดํŠธ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.
    • ๋””ํดํŠธ ๊ฐ’์€ ์ •์ ์ธ ๊ฐ’, ํ•จ์ˆ˜, ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ ์ˆ˜ ์žˆ๋‹ค.
  • Selector
    • ๋‹ค๋ฅธ atom์— ์˜์กดํ•˜๋Š” ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์ด๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด์™”๋˜ ์ ์ด ์žˆ๋Š” ๊ฐ’์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(= ์บ์‹ฑ), ๊ฐ™์€ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” api call์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ์š”์ฒญํ•˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ ์œผ๋กœ ์œ ๋ฆฌํ•˜๋‹ค.
    • Selector๋Š” useRecoilValue()๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
const fontSizeLabelState = selector({
  key: 'fontSizeLabelState',
  get: ({get}) => {
    const fontSize = get(fontSizeState);
    const unit = 'px';

    return `${fontSize}${unit}`;
  },
});

์žฅ์ 

  • useStateํ›…๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ ํ•˜์—ฌ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๋‹ค
  • selector๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ย BoilerPlate-free API ๋ฆฌ๋•์Šค๋Š” ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ณ  ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋ ค๋ฉด ๊ทธ๋งŒํผ ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š”๋ฐ recoil์€ ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ ์ •์˜๋Š” ์ฆ๋ถ„ ๋ฐ ๋ถ„์‚ฐ๋˜์–ด code splitting์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  • ์•ˆ์ •์ ์ธ Devtools๊ฐ€ ์—†์–ด ๋””๋ฒ„๊น…์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ถˆํŽธ
  • ์–ด๋Š ์ปดํฌ๋„ŒํŠธ๋ผ๋„ ์ „์—ญ์ƒํƒœ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ์ „์—ญ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค. (์ „์—ญ์ƒํƒœ๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€)

ํŠน์ง•๋น„๊ต

ํŠน์ง• Redux Recoil
๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํŒจํ„ด์„ ์‚ฌ์šฉ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํŒจํ„ด์„ ์‚ฌ์šฉ
๋ฐ์ดํ„ฐ ๋ณ€ํ™” ๊ฐ์ง€ ์•ก์…˜(Action)์„ ํ†ตํ•ด ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ƒํƒœ
Atom์„ ์‚ฌ์šฉ
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ Redux-Thunk, Redux-Saga์™€ ๊ฐ™์€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•จ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
๋Ÿฌ๋‹ ์ปค๋ธŒ Redux๋Š” ๊ฐœ๋…์ด ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ ์ดˆ๊ธฐ ํ•™์Šต์ด ์–ด๋ ค์›€ Recoil์€ ๊ฐœ๋…์ด ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดˆ๊ธฐ ํ•™์Šต์ด ์ƒ๋Œ€์ ์œผ๋กœ ์šฉ์ดํ•จ

๋ฉด์ ‘ ๋Œ€๋น„๋ฅผ ์œ„ํ•œ CS tip : ์ƒํƒœ๊ด€๋ฆฌ์— ๋Œ€ํ•œ 3๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹

  1. Flux
    ์ €์žฅ์†Œ(store) / ์•ก์…˜ํ•จ์ˆ˜(action) / ๋ฆฌ๋“€์„œ ๋“ฑ์„ ํ†ตํ•ด์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹
    Redux, Zustand

  2. Atomic
    React์— ์‚ฌ์šฉ๋˜๋Š” state์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฆฌ์•กํŠธ ํŠธ๋ฆฌ ์•ˆ์—์„œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
    Recoil, Jotai

[Network]HTTP์™€ HTTPS ์ฐจ์ด

HTTP

http(Hyper Text Transfer Protocol)๋ž€ ์„œ๋ฒ„/ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

์ฆ‰ HTTP๋Š” ์ธํ„ฐ๋„ท์—์„œ ํ•˜์ดํผํ…์ŠคํŠธ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์‹  ๊ทœ์•ฝ์œผ๋กœ 80๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP ์„œ๋ฒ„๊ฐ€ 80๋ฒˆ ํฌํŠธ์—์„œ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” 80๋ฒˆ ํฌํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

HTTP์˜ ๊ตฌ์กฐ

HTTP๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์˜ ํ”„๋กœํ† ์ฝœ๋กœ TCP/IP ์œ„์—์„œ ์ž‘๋™ํ•œ๋‹ค. HTTP๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ Statelessํฌ๋กœํ† ์ฝœ์ด๋ฉฐ Method,Path,Version,Header,Body๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Method : Get, Post, Delete ...
  • Path: HTTP
  • Version: 1.1
  • Header: Accept-Language:kr...

ํ•˜์ง€๋งŒ HTTP๋Š” ์•”ํ˜ธํ™”๊ฐ€ ๋˜์ง€ ์•Š์€ ํ‰๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์—, HTTP๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ ๋“ฑ์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด ์ œ3์ž๊ฐ€ ์ •๋ณด๋ฅผ ์กฐํšŒ ํ• ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•ด HTTPS๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

HTTPS

HyperTExt Transfer Protocol over Secure Sokey Layer, HTTP over TLS, HTTP over SSL , HTTP Scure๋“ฑ ์œผ๋กœ ๋ถˆ๋ฆฌ๋Š” HTTPS๋Š” HTTP์— ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๊ฐ€ ์ถ”๊ฐ€๋œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. HTTPS๋Š” HTTP์™€ ๋‹ค๋ฅด๊ฒŒ 443๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ค‘๊ฐ„์— ์ œ 3์ž๊ฐ€ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์—†๋„๋ก ์•”ํ˜ธํ™”๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”์™€ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”

HTTPS๋Š” ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹๊ณผ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹ ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

  • ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•จ
    • ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด ๋งค์šฐ ์œ„ํ—˜ํ•˜์ง€๋งŒ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”
    • 1๊ฐœ์˜ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ณต๊ฐœํ‚ค์™€ ๊ฐœ์ธํ‚ค๋ฅผ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•จ
    • ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์–ด๋„ ๋น„๊ต์  ์•ˆ์ „ํ•˜์ง€๋งŒ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋Š๋ฆผ

HTTPS์˜ ๋™์ž‘ ๊ณผ์ •

HTTPS ๋Š” ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”์™€ ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์—ฌ๋‚œ ์†๋„์™€ ์•ˆ์ •์„ฑ์„ ๋ชจ๋‘ ์–ป๊ณ  ์žˆ๋‹ค. HTTPS ์—ฐ๊ฒฐ ๊ณผ์ •(Hand-Shaking)์—์„œ ๋จผ์ € ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์„ธ์…˜ํ‚ค๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ธ์…˜๊ธฐํ‚ค๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋Œ€์นญํ‚ค์ด๋ฉฐ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๊ตํ™˜์—๋Š” ๋น ๋ฅธ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์„ธ์…˜ํ‚ค๋Š” ๋Œ€์นญํ‚ค๋กœ ๋งŒ๋“ค์–ด ์ง„๋‹ค.
์„ธ์…˜ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋น„๋Œ€์นญํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตํ™˜ํ•œ๋‹ค. ์ฒ˜์Œ ์—ฐ๊ฒฐ์„ ์„ฑ๋ฆฝํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์„ธ์…˜ํ‚ค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น„๋Œ€์นญ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์ดํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น ๋ฅธ ์—ฐ์‚ฐ ์†๋„๋ฅผ ์œ„ํ•ด ๋Œ€์นญํ‚ค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

HTTPS ์—ฐ๊ฒฐ ๊ณผ์ •์ด ์„ฑ๋ฆฝ๋˜๋Š” ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ตœ์ดˆ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•จ
  2. ์„œ๋ฒ„๋Š” ๊ณต๊ฐœํ‚ค(์ธ์ฆ์„œ)๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋„˜๊ฒจ์คŒ
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ธ์ •์„œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์„ธ์…˜ํ‚ค๋ฅผ ๋ฐœ๊ธ‰
  4. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„ธ์…˜ํ‚ค๋ฅผ ๋ณด๊ด€ํ•˜๋ฉฐ ์ถ”๊ฐ€๋กœ ์„œ๋ฒ„์˜ ๊ณต๊ฐœํ‚ค๋กœ ์„ธ์…˜ํ‚ค๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์„œ๋ฒ„๋กœ ์ „์†ก
  5. ์„œ๋ฒ„๋Š” ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ ์„ธ์…˜ํ‚ค๋ฅผ ๋ณตํ˜ธํ™”ํ•˜์—ฌ ์„ธ์…˜ํ‚ค๋ฅผ ์–ป์Œ
  6. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ๋™์ผํ•œ ์„ธ์…˜ํ‚ค๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ์Œ” ์„ธ์…˜ํ‚ค๋กœ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•จ

HTTP์™€ HTTPS

HTTP๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ๋ฐ˜๋ฉด, HTTPS๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. HTTPS๋ฅผ ์ด์šฉํ•˜๋ฉด ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTTP๋ด ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.(๊ฑฐ์˜ ์ฐจ์ด๋ฅผ ๋ชป๋Š๋‚Œ)
HTTPS๋Š” ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

HTTP HTTPS ์“ฐ์ž„

  • HTTP: ๋…ธ์ถœ์ด ๋˜์–ด๋„ ๊ดœ์ฐฎ์€ ๋‹จ์ˆœํ•œ ์ •๋ณด ์กฐํšŒ ๋“ฑ ๋งŒ์„ ์ฒ˜๋ฆฌ ํ•˜๊ณ  ์žˆ๋‹ค.
  • HTTPS:๊ฐœ์ธ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„ํ– ํ•œ๋‹ค

์ฐธ๊ณ ์˜ˆ์‹œ
https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/

JavaScript: ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ

์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ธฐ ์ „ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค
๋ฐ์ดํ„ฐ ํƒ€์ž…, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

๋ฐ์ดํ„ฐ ํƒ€์ž…์—๋Š” ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Œ

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…(์›์‹œ ๋ฐ์ดํ„ฐ)

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋“ค์€ ๋ชจ๋‘ ๋ถˆ๋ณ€๊ฐ’์ž„.

์˜ˆ์‹œ
// ์˜ˆ์‹œ1
var a = 'abc';
a += 'def';

---- 
// ์˜ˆ์‹œ2
var b = 5;
var c = 5
b = 7

์ฒซ ๋ฒˆ์งธ ๋ณ€์ˆ˜ a์— ๋ฌธ์ž์—ด 'abc'๋ฅผ ํ• ๋‹นํ–ˆ๋‹ค๊ฐ€ 'def'๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ์กด์˜ 'abc'๊ฐ€ 'abcdef'๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋งŒ๋“ค๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ a์— ์ €์žฅํ•จ -> 'abc'์™€ 'abcdef'๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ๋ฐ์ดํ„ฐ์ž„

๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜ b๋ฅผ ๋ณ€์ˆ˜ ์˜์—ญ์— ํ• ๋‹นํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์˜์—ญ์— 5๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•จ -> ์žˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ์˜์—ญ์— ์žˆ๋Š” 5์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ b์— ์ €์žฅํ•˜๊ณ , ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์˜์—ญ์— 5๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ b์— ์ €์žฅํ•จ. ๋ณ€์ˆ˜ c์—์„œ๋„ 5๋ผ๋Š” ๊ฐ’์ด ํ• ๋‹น๋˜์—ˆ๋Š”๋ฐ ๋ณ€์ˆ˜ ์˜์—ญ์— c๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ 5๋ฅผ ๋จผ์ € ์ฐพ์Œ -> ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์˜์—ญ 5์˜ ์ฃผ์†Œ๊ฐ’์„ ์žฌํ™œ์šฉํ•จ

๋งˆ์ง€๋ง‰ ์ค„์—์„œ๋Š” ๋ณ€์ˆ˜ b์˜ ๊ฐ’์„ 7๋กœ ๋ฐ”๊ฟˆ -> ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ 7์ด ์žˆ๋Š”์ง€ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์ฃผ์†Œ๋ฅผ ์žฌํ™œ์šฉํ•˜๊ณ  ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์˜์—ญ์— 7์„ ๋งŒ๋“ค์–ด ๋ณ€์ˆ˜ b์— ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•จ

=> ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ๋งŒ๋“  ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋“ค์€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ
ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜๊ธฐ ์ „๊นŒ์ง„ ๋ณ€ํ•˜์ง€ ์•Š์Œ -> ๋ถˆ๋ณ€ํ•จ

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

  • Object : new Object Array, Map, Set, Weak map, Date
  • Function
์˜ˆ์‹œ
var obj1 = {
    a : 1,
    b : 'ccc'
}

obj1.a = 100;

๋ณ€์ˆ˜ ์˜์—ญ์— obj1์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ  ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ๋”ฐ๋กœ ์กด์žฌํ•จ

์˜ˆ์‹œ ์ฝ”๋“œ์˜ ๋งจ ๋งˆ์ง€๋ง‰์—์„œ obj1์˜ a์˜ ๊ฐ’์„ 100์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•จ
๋ณ€๊ฒฝํ•  ๊ฐ’์ธ 100์„ ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ์ฐพ๊ณ  ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ obj1์„ ์œ„ํ•œ ๋ณ„๋„ ๊ณต๊ฐ„์— ์žˆ๋Š” a์˜ ์˜์—ญ์— ๊ฐˆ์•„๋ผ์›Œ์คŒ
๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์€ ๋ชจ๋‘ ๋ถˆ๋ณ€๊ฐ’์ด์ง€๋งŒ obj1์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๊ณต๊ฐ„์€ ์–ผ๋งˆ๋“ ์ง€ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•จ(๋‹ค๋ฅธ ๊ฐ’์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ์Œ) ๋•Œ๋ฌธ์— ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๋‹ค(๊ฐ€๋ณ€ํ•˜๋‹ค)๋ผ๊ณ  ํ•จ

๋ณ€์ˆ˜ ๋ณต์‚ฌ ์ดํ›„ ๊ฐ’ ๋ณ€๊ฒฝ(์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ )

// ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
var a = 10
var b = a

// ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
var obj1 = { c: 10, d: 'qwer'};
va obj2 = obj1

// ๊ฐ’ ๋ณ€๊ฒฝ
b = 15
obj2.c = 20

๋ณ€์ˆ˜ b์˜ ๊ฐ’์„ 15๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ, ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ 15๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ b์— ์ €์žฅํ•จ. ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ์ƒˆ๋กœ์šด ๊ณต๊ฐ„์— 15๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ b์— ์ €์žฅํ•จ
๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ a์™€ b๋Š” ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•จ -> ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

obj2.c = 20์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์˜์—ญ์— 20์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์˜์—ญ์— 20์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜ ์˜์—ญ์— ์žˆ๋Š” obj2(@1004)์˜ ๊ฐ’(@5002)์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜ ์˜์—ญ์—์„œ ๋‹ค์‹œ c๋ฅผ ์ฐพ์•„ ๊ทธ๊ณณ์— ์ €์žฅํ•จ

๋ณ€์ˆ˜ obj1๋ฅผ ๋ณต์‚ฌํ•œ obj2๋Š” ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ฐ”๊พธ์—ˆ์ง€๋งŒ ์ €์žฅ๋œ ๊ฐ’(@5002)๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Œ -> obj1๊ณผ obj2๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Œ -> ๊ทธ๋ž˜์„œ obj1์ด๋‚˜ obj2์˜ ํ”„๋กœํผํ‹ฐ ์ค‘์— ๋ฌด์—‡์„ ๋ฐ”๊พธ๋“  ๋‘ ๊ฐ์ฒด์— ๋ชจ๋‘ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์ ์šฉ๋จ(๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋‹ˆ๊นŒ)
๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ obj2์˜ ๊ฐ’๋งŒ์„ ๋ฐ”๊พธ์—ˆ๋Š”๋ฐ ์˜๋„์น˜ ์•Š๊ฒŒ obj1์˜ ๊ฐ’๋„ ๋ฐ”๋€œ

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•„ํ•˜๋‚˜?
์›๋ณธ ๊ฐ์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋จ -> ๋ถˆ๋ณ€ ๊ฐ์ฒด ํ•„์š”ํ•จ


์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ์˜ ์ฐจ์ด์ 

  • ์–•์€ ๋ณต์‚ฌ : ๋ฐ”๋กœ ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๊นŠ์€ ๋ณต์‚ฌ : ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์–•์€ ๋ณต์‚ฌ
  1. ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž
const original = {name: '์ฒ ์ˆ˜', age: 12};
const clone = { ...original };
clone.name = '์˜ํฌ'

console.log(original) // { name: '์ฒ ์ˆ˜', age: 12 }
console.log(clone); // { name: '์˜ํฌ', age: 12 }

๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” ์–•์€ ๋ณต์‚ฌ๋งŒ ๊ฐ€๋Šฅํ•จ
๊ฐ์ฒด ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด(์ค‘์ฒฉ ๊ฐ์ฒด)๋‚˜ ๋ฐฐ์—ด, ํ•จ์ˆ˜ ๋“ฑ์˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์€ ์—ฌ์ „ํžˆ ์›๋ณธ์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•จ

const original = {profile: {name:'์ฒ ์ˆ˜', age:12}, grade: 'A'};
const clone = { ...original };

clone.profile.name = '์˜ํฌ';
clone.grade = 'B';

console.log(original) // {profile: {name: '์˜ํฌ', age: 12}, grade: 'A'}
console.log(clone); // {profile: {name: '์˜ํฌ', age: 12}, grade: 'B'}

์œ„์—์„œ grade ํ”„๋กœํผํ‹ฐ๋Š” ์ •์ƒ์ ์œผ๋กœ clone ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ profile์˜ name ๋ถ€๋ถ„์€ ์›๋ณธ์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
์ด๋Š” clone์˜ ๋‚ด๋ถ€ ๊ฐ์ฒด์ธ profile์€ original์˜ profile๊ณผ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž„.
๋”ฐ๋ผ์„œ clone์˜ ๋‚ด๋ถ€ ๊ฐ์ฒด์ธ profile์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์›๋ณธ์—์„œ๋„ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•จ.

์ด๋Ÿฌํ•œ ๋ณต์žกํ•œ ๊ฐ์ฒด ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ณต์‚ฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•จ

  1. Object.assign()
    Object.assign(target, source)์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
    Object.assign์€ ๋‘ ๋ฒˆ์งธ ์ธ์ž(source)์˜ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ฒซ ๋ฒˆ์งธ ์ธ์ž(target)์˜ ๊ฐ์ฒด์— ๋ฐ˜์˜ํ•จ
const original = {name: '์ฒ ์ˆ˜', age: 12};
const clone = Object.assign({}, original);
clone.name = '์˜ํฌ'

console.log(original) // {name: '์ฒ ์ˆ˜', age: 12}
console.log(clone); // {name: '์˜ํฌ', age: 12}
console.log(original === clone) // false

  1. slice, concat
  • slice
const originalArray = [1, 2, 3, { a: 4 }];

const shallowCopyArray = originalArray.slice();

shallowCopyArray[3].a = 10;

console.log(originalArray); // [1, 2, 3, {a: 10}]
console.log(shallowCopyArray); // [1, 2, 3, {a: 10}]

  • concat
const originalArray = [1, 2, 3, { a: 4 }];

const shallowCopyArray = originalArray.concat();

shallowCopyArray[3].a = 20;

console.log(originalArray); // [1, 2, 3, {a: 20}]
console.log(shallowCopyArray); // [1, 2, 3, {a: 20}]

๊นŠ์€ ๋ณต์‚ฌ
  1. JSON.stringify์™€ JSON.parse
  • ๋ฌธ์ž์—ดํ™”ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐฉ์‹.
  • ํ•จ์ˆ˜, ์‹ฌ๋ฒŒ, undefined, ํ˜น์€ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋œ ๊ฐ์ฒด์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ. ๋˜ํ•œ prototype์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•
const originalObj = {
  a: 1,
  b: { c: 2 },
};

const deepClone = (obj) => JSON.parse(JSON.stringify(obj));
  1. ์žฌ๊ท€ ํ•จ์ˆ˜ ์‚ฌ์šฉ
    ๊ฐ์ฒด์˜ ๊ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹. ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง
function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  const clone = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      clone[key] = deepClone(obj[key]);
    }
  }

  return clone;
}

  1. lodash์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    lodash์—์„œ ์ œ๊ณตํ•˜๋Š” cloneDeep ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ.
import _ from 'lodash';

const originalObj = {
  a: 1,
  b: { c: 2 },
};

const deepClone = _.cloneDeep(originalObj);

[TS] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ , Type๊ณผ Interface์˜ ์ฐจ์ด์ 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

TypeScript๋ž€?

Javascript์˜ ์Šˆํผ ์…‹.
์ƒ์œ„ ํ™•์žฅ์ž๋กœ Javascript ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž์‹ ์ด ์›ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ๋ฐ ํ•˜๋ฉด Javascript๋กœ ์ปดํŒŒ์ผ ๋˜์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปดํŒŒ์ผ
์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๋Š” ๊ณผ์ •.
ts ๋Š” js์™€ ๋‹ฌ๋ฆฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํŒŒ์ผ์„ ํ•œ๋ฒˆ ๋ณ€ํ™˜ ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ปดํŒŒ์ผ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

TypeScript ์žฅ์ 

  1. ์†์‰ฝ๊ฒŒ ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…

    • ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์„๋ฟ ์•„๋‹ˆ๋ผ, ์†์‰ฌ์šด ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅํ•ด ์ง„๋‹ค.
  2. ๊ฐ™์€ ์ผ์„ ๋‘ ๋ฒˆ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋†’์€ ์ƒ์‚ฐ์„ฑ์˜ ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ

    • js๋Š” ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์‚ดํŽด์•ผํ•œ๋‹ค.
    • ts๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฟ ์•„๋‹ˆ๋ผ ๊ทธ ๋ฐ์ดํ„ฐ์˜ ์ž๋ฃŒํ˜•๊นŒ์ง€ ์•Œ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ํƒ€์ž… ์ง€์ •์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํŒฉํ† ๋ง ํ›„ ์˜ˆ๊ธฐ์น˜ ์•Š๋Š” ๋™์ž‘์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  3. typescript๋Š” javascript์˜ ์Šˆํผ์…‹ ์ด๋‹ค.

    ์Šˆํผ์…‹
    ํŠน์ •ํ•œ ์–ธ์–ด์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊นŒ์ง€ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ™•์žฅ๋œ ๊ฒƒ์„ ๋งํ•œ๋‹ค

    • js๋กœ ์งœ์—ฌ์ง„ ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•˜๋Š” ์‹์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์ˆ˜์ • ์—†์ด๋„ ts์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

TypeScript vs Javascript

js ts
๋™์ ํƒ€์ž… ์–ธ์–ด ์ •์ ํƒ€์ž… ์–ธ์–ด
์ธํ”„๋ฆฌํ„ฐ ์–ธ์–ด ์ปดํŒŒ์ผ ์–ธ์–ด
๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กด์ ์ž„(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ ๋œ ํ›„ ์‹คํ–‰)
์ข€ ๋” ์œ ์—ฐํ•จ(ํƒ€์ž…์— ์ œํ•œ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค) ๋” ๋‚˜์€ ๊ตฌ์กฐ์™€ ๊ฐ„๊ฒฐํ•จ, ์ผ๊ด€์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ
.js ํ™•์žฅ์ž .ts ํ™•์žฅ์ž
์ž‘๊ณ  ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ

๋™์ ํƒ€์ž…
๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋Ÿฐํƒ€์ž„, ์ฆ‰ ์‹คํ–‰ ์‹œ๊ฐ„์— ๊ฒฐ์ •๋œ๋‹ค
๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

์ •์ ํƒ€์ž…
์ปดํŒŒํ‹ธ ๋‹จ๊ณ„์—์„œ ํƒ€์ž…์„ ์ฒดํฌ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ž‘์„ฑ์ค‘ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํƒ€์ž… ์ฒดํ‚น์ด ๊ฐ€๋Šฅํ•˜๋‹ค

์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด
์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ•œ ์ค„ ํ•œ ์ค„ ์ฝ์–ด๊ฐ€๋ฉฐ ๋ช…๋ น์„ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์–ธ์–ด ์ปดํŒŒ์ผ ์–ธ์–ด์— ๋น„ํ•ด ๋น ๋ฅด๋‹ค.

์ปดํŒŒ์ผ ์–ธ์–ด
๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•œ๋Š” ์–ธ์–ด ๋ณ€ํ™˜๊ณผ ์‹คํ–‰์ด ๋”ฐ๋กœ ์ด๋ฃจ์–ด์ง
์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์— ๋น„ํ•ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์ƒํ™ฉ์—์„œ ๋ชจ๋“  ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ์‹คํ–‰

Type๊ณผ Interface์˜ ์ฐจ์ด์ 

ํ™•์žฅ(์ƒ์†)

interface

extends ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ํ™•์žฅ

interface Person {
	name: string;
	age: number
}

interface Student extens Person{
	school:string;
}
const maru: Student  ={
	name:'maru',
	age:8,
	school:'tdc'
}

type

& ๊ธฐํ˜ธ ์‚ฌ์šฉ ํ™•์žฅ

type Person = {
	name: string,
	age:number
}
type Student = Person & {
	school: string
}

const maru:Student = {
	name:'maru'
	age:8
	school:'tdc'
}

์„ ์–ธ์  ํ™•์žฅ

interface

์„ ์–ธ์  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
๊ฐ™์€ ์ด๋ฆ„์˜ interface๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ™•์žฅ๋œ๋‹ค.

interface Person {
	name:string,
	age:number
}
interface Person {
	gender:string
}
const maru: Person = {
	name:'maru',
	age:8,
	gender: 'male'
}

type

์„ ์–ธ์  ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅ

type Person = {
	name:string,
	age: number
}
type Person = { //Error
	gender: string;
}

ํƒ€์ž… ๊ฐ์ฒด์˜ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” interface๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค.

์ž๋ฃŒํ˜•(type)

interface

๊ฐ์ฒด(Object)์˜ ํƒ€์ž…์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›์‹œ ์ž๋ฃŒํ˜•์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

interface Person {
	name:string;
	age:number;
	gender:string;
}

// ์›์‹œํƒ€์ž… ํ™•์žฅ ์—๋Ÿฌ
interface name extends string {

}

type

๊ฐ์ฒด ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ์ฒดํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ๋Š” interface๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๊ณ ,
๋‹จ์ˆœํ•œ ์›์‹œ๊ฐ’(Primivite type)์ด๋‚˜ ํŠœํ”Œ(Tuple), ์œ ๋‹ˆ์–ธ(Union)ํƒ€์ž…์„ ์„ ์–ธํ• ๋•Œ type์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

type name = string;
type Age = number;
type Person = [string, number, booleann] // tuple
type NumberString = string|number // union

// ๊ฐ์ฒด๋Š” interface
type Person = {
	name: string;
	age:number;
	gender:string
}

computed value ์‚ฌ์šฉ

interface

computed value ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ

type Subjects = 'math'|'science'|'sociology'

//Error
interface Grades {
	[key in Subjects] :string 
}

type

computed value ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ

type Subjects = 'math'|'science'|'sociology'

type Grades = {
	[key in Subjects] :string
}

type ์€ ๋ชจ๋“ ํƒ€์ž… ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ 
interface ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด type์„ ์‚ฌ์šฉ
ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

React: Hooks - useState

React

useState

useState๋ž€?

const [count, setCount] = useState(0)
  • ๊ณตํ™ˆ์˜ ์ •์˜ : ๋ Œ๋”๋ง ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ state ๋ณ€์ˆ˜ + state ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ์•กํŠธ๊ฐ€ ๋‹ค์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ฒŒ ํ•˜๋Š” setState๋กœ ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ๊ด€๋ฆฌ ํ›…
  • ์ข€ ๋” ์ถ•์•ฝํ•œ ์ •์˜ : ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” state๋ฅผ ๊ฐ€์ง€๊ณ  setState๋ฅผ ํ†ตํ•ด state์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๊ด€๋ฆฌ hook
  • setState๋Š” ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•ด ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹  -> ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Œ -> ์˜ค๋ฅ˜๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
  • setState๋ฅผ ํ†ตํ•ด state์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์•Œ์•„์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์‹  ์‰ฝ๊ฒŒ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ

state, state management

useState๊ฐ€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๊ด€๋ฆฌ ํ›…์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ƒํƒœ๋Š” ๋ฌด์—‡์ด๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ฌด์—‡์ผ๊นŒ?

state

props (short for โ€œpropertiesโ€) and state are both plain JavaScript objects. While both hold information that influences the output of render, they are different in one important way: props get passed to the component (similar to function parameters) whereas state is managed within the component (similar to variables declared within a function).

๋ฆฌ์•กํŠธ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” props์™€ state ๋‘˜ ๋‹ค ๋ Œ๋”๋ง ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ผ๊ณ  ์ •์˜ํ•จ.
์ฆ‰, ๋‘˜ ๋‹ค ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฐ์ดํ„ฐ์ž„.

props์™€ state์˜ ์ฐจ์ด์ ์€ props๋Š” ๋ถ€๋ชจ์—์„œ ์ž์‹์ปดํฌ๋„ŒํŠธ๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐ์ดํ„ฐ์ด๋ฉฐ, ๋‚ด๋ ค๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
state๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” (ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ๋ฐ์ดํ„ฐ์ž„. useState ๊ฐ™์€ ํ›…์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•จ .

์ฆ‰, state๋Š” ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ด ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ž„.
์˜ˆ๋ฅผ ๋“ค๋ฉด ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฐฏ์ˆ˜๊ฐ€ ๋ณ€ํ™”ํ•œ๋‹ค๋“ ์ง€, ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ œํ’ˆ์„ ๋‹ด์„ ๋•Œ ์ œํ’ˆ์ด ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œํ•  ๋•Œ๋Š” ์ œํ’ˆ์ด ์‚ญ์ œ๋˜๋Š” ๋“ฑ ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ด ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

state management

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๊นŒ?

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•จ

์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ state๋ฅผ ๊ณต์œ ํ•ด์•ผํ•˜๋Š” ์ผ์ด ์ƒ๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•จ.

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹ ์‚ฌ์šฉ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ. ๋˜ํ•œ ํ•˜์œ„์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ํ•ด๋‹น state๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด props๋ฅผ ๊ณ„์† ๋‚ด๋ ค์ฃผ์–ด์•ผํ•จ(props drilling ๋ฐœ์ƒ). ์ด๋Š” ํ•ด๋‹น props๊ฐ€ ์–ด๋””์„œ ์™”๋Š”์ง€ ์ถ”์ฒ™ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ฆ. ๋”ฐ๋ผ์„œ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง.

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

state management tools

recoil

  • ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ง๊ด€์ ์ด๊ณ  ๋ฆฌ๋•์Šค์— ๋น„ํ•ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์Œ
  • ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๋‹ค๋Š” ์žฅ์ 

recoil์€ atom๊ณผ selector๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•จ
๋จผ์ € atom์„ ์ •์˜ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ ์‹œ useRecoilState, useSetState ๋“ฑ์„ ์‚ฌ์šฉํ•ด ๊ธฐ์กด์˜ ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•จ.
atom ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น atom์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋จ.
recoil์˜ ๋ฐ์ดํ„ฐ ๋ฐฉํ–ฅ์€ ๋ฆฌ์•กํŠธ์ฒ˜๋Ÿผ ๋‹จ๋ฐฉํ–ฅ.

react-query

  • ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ
  • ์ง๊ด€์ ์ด๊ณ  ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์บ์‹ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ, ๋™๊ธฐํ™”๋ฅผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • react-query์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๋„ ๋‹จ๋ฑกํ–ฅ

useQuery(fetch)๋‚˜ useMutation ํ›…์„ ์‚ฌ์šฉํ•ด API ํ˜ธ์ถœ ์ •์˜๋ฅผ ํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ API ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•จ -> ํ•ด๋‹น useQuery๋‚˜ useMutation์„ ๊ตฌ๋…ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋จ.
์ด๋•Œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋Š” react query๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์บ์‹œ์— ์ €์žฅ๋จ

useState์™€ useRef์˜ ์ฐจ์ด์ 

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ useState๋Š” ์ƒํƒœ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉฐ, UI์— ๋ฐ˜์˜์ด ๋จ.
๋ฐ˜๋ฉด useRef๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ๋™์•ˆ ๊ณ„์† ์œ ์ง€๋˜๋ฉฐ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ.

์˜ˆ์‹œ
import { useRef, useState } from 'react;
import "./styles.css";

export default function App() {
  const [stateCount, setStateCount] = useState(0);
  const refCount = useRef(0);

  return (
    
    <div className="App">
      <button
        onClick={() => {
          setStateCount((prev) => prev + 1);}}> State</button>
      <button
        onClick={() => {
          refCount.current += 1;}} >Ref</button>
      <br />
      <br />
      <div>useState Count: {stateCount}</div>
      <div>useRef Count: {refCount.current}</div>
</div> 
);
}

state๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด useState์˜ stateCount ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ณ , ๋ Œ๋”๋ง๋˜์–ด ๋ณ€ํ™”๋œ ๊ฐ’์ด ํ™”๋ฉด์— ์ ์šฉ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Œ(ํ•ด๋‹น ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๊ฐ’์ด ํ™”๋ฉด์— ๋ฐ˜์˜๋จ)

ํ•˜์ง€๋งŒ ref๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ์ง€ ์•Š์Œ. useRef ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ์ง€๋งŒ useRef๋Š” current ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ. ๋”ฐ๋ผ์„œ ํ™”๋ฉด์ด ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ˜์˜์ด ๋˜๊ณ  ์žˆ์ง€ ์•Š์„ ๋ฟ์ž„.

state ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์„ ์‹œํ‚ค๋ฉด useRef์˜ ๊ฐ’๋„ ์˜ฌ๋ผ๊ฐ. state๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ, refCount.current์˜ ๊ฐ’๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ™”๋ฉด์— ๋ Œ๋”๋ง๋จ.

useRef๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ ๋™์•ˆ(์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ ์ „๊นŒ์ง€) ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ ๋ณ€๊ฒฝ(ex: useState, useReducer ๋“ฑ)์œผ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ๊ทธ ์‹œ์ ์—์„œ์˜ ์ตœ์‹  refCount.current์˜ ๊ฐ’์ด ํ™”๋ฉด์— ๋ Œ๋”๋ง๋จ(useState์™€ ๋‹ค๋ฅด๊ฒŒ current์˜ ๊ฐ’์ด ๋ณ€ํ™”ํ•  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด ๋ฆฌ๋ Œ๋”๋งx).

useState์˜ ๋ถˆ๋ณ€์„ฑ

  • setState๋Š” ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•ด ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹  -> ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Œ -> ์˜ค๋ฅ˜๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด useState๋ฅผ ํ†ตํ•ด ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ์ž„์˜๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์•Œ์•„์ฑ„์ง€ ๋ชปํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ํ˜น์€ ์ด์ „ ์ƒํƒœ์™€ ํ˜„ํƒœ ์ƒํƒœ๋ฅผ ๋ฆฌ์•กํŠธ๊ฐ€ ๋น„๊ตํ•˜์ง€ ๋ชปํ•ด ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ UI์— ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•จ.
  • ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
์˜ˆ์‹œ

const [item, setItem] = useState(['apple', 'banana', 'orange'])๋ผ๋Š” ๋ฐฐ์—ด์„ ๊ฐ€์ง„ state๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•จ ์—ฌ๊ธฐ์— 'peach'๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ item.push('peach')๋ฅผ ํ•œ๋‹ค๋ฉด ์ง์ ‘ ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋Š” item ๋ฐฐ์—ด์˜ ๋ณ€ํ™”๋ฅผ ์•Œ์ง€ ๋ชปํ•จ(๋ณ€๊ฒฝ์„ ํ•  ๋–„๋Š” setState๋ฅผ ์‚ฌ์šฉํ•ด ์ด์ „ ์ƒํƒœ์™€๋Š” ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ) ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Œ

setItem([...item, 'peach'])

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด item์˜ ์š”์†Œ๋“ค์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋ณต์‚ฌ ํ›„ 'peach'๋ผ๋Š” ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•จ. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด item๋ฐฐ์—ด์€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ item ๋ฐฐ์—ด๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜์–ด state๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ


์ •๋ฆฌ

useState๋ž€?

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” state๋ฅผ ๊ฐ€์ง€๊ณ  setState๋ฅผ ํ†ตํ•ด state์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๊ด€๋ฆฌ hook
  • setState๋Š” ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•ด ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹  -> ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Œ -> ์˜ค๋ฅ˜๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
  • setState๋ฅผ ํ†ตํ•ด state์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์•Œ์•„์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์‹  ์‰ฝ๊ฒŒ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ

์ƒํƒœ๋ž€?

์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๊ณ , useState ๊ฐ™์€ ํ›…์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ

์ƒํƒœ๊ด€๋ฆฌ๋ž€?

state๋ฅผ props๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด props drilling์ด ๋ฐœ์ƒํ•ด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง -> ์ƒํƒœ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๊ฒŒ ํ•จ

์ƒํƒœ๊ด€๋ฆฌ ํˆด

  • Redux, Recoil, Zustand ๋“ฑ

useState์™€ useRef์˜ ์ฐจ์ด์ 

  • useState : ์ƒํƒœ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉฐ, UI์— ๋ฐ˜์˜์ด ๋จ.
  • useRef : ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์• ์ฃผ๊ธฐ๋™์•ˆ ๊ณ„์† ์œ ์ง€๋˜๋ฉฐ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ.

useState์˜ ๋ถˆ๋ณ€์„ฑ

state๊ฐ€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๋“ฑ์˜ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์ธ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๏ฟฝ์–ด ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ฒŒ ํ•จ -> ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ React๋Š” ์ƒํƒœ์˜ ๋ณ€ํ™”๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ์„ ์žฌ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Œ

[network] SSR,CSR

SPA

Single Page Application
ํ•˜๋‚˜์˜ HTML ํŽ˜์ด์ง€์—์„œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™์ ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ๋ฐ”๊พธ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

MPA

Multiple Page Application
์—ฌ๋Ÿฌ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ HTML๋ฅผ ๋ฐ›์•„์™€์„œ ์ปจํ…์ธ ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

SPA๋Š” ์ฒซํŽ˜์ด์ง€๋งŒ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ
MPA๋Š” ์—ฌ๋ŸฌํŽ˜์ด์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ํŽ˜์ด์ง€๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋œ ํŒŒ์ผ์„ ๋ฐ›์•„์˜จ๋‹ค.

CSR

Client Side Rendering
SPA๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ Œ๋”๋ง ๋ฐฉ์‹
์ฒซ ๊ตฌ๋™ ์‹œ์— HTML, JS ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๊ณ , ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ js๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ Œ๋”๋ง ์ง„ํ–‰

์žฅ์ 

  • ๋™์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง : ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹๋‹ค
  • ์„œ๋ฒ„ ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ์ ๋‹ค: ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์ด ๋œํ•œ๋‹ค.

๋‹จ์ 

  • ์ฒซ ํ™”๋ฉด์„ ๋ณด๊ธฐ๊นŒ์ง€ ์˜ค๋žœ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.(FP,FCP์†๋„ ๋Š๋ฆผ) : ์ดˆ๊ธฐ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ jsํŒŒ์ผ์˜ ํฌํ‚ค๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ถ„ํ• (code splitting)์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
  • ๋‚ฎ์€ SEO ์„ฑ๋Šฅ : JS ์ค‘์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กค๋ง์ด ์–ด๋ ค์›€

SSR

Server Side Rendering
MPA๊ตฌํ˜„ํ• ๋•Œ ์‚ฌ์šฉ ์„œ๋ฒ„์ธก์—์„œ ๋ Œ๋”๋ง์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฐฉ์‹
์ƒˆ๋กœ์šดํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ๋งˆ์นœ HTML ํŒŒ์ผ์„ ๋ฐ›์•„์™€์„œ ๋ Œ๋”๋ง

์žฅ์ 

  • ๋น ๋ฅธ ํ™”๋ฉด ๋กœ๋”ฉ (FP, FCP ๋น ๋ฆ„) : HTMLํŒŒ์ผ์„ ๋จผ์ € ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๋น ๋ฅธ TTI(Time To Interactive): ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€ ๋กœ์ง ๋ฐ ๋ Œ๋”๋ง์„ ์‚ฌ์ „์— ์‹คํ–‰ํ•œ ๊ฒฝ์šฐ jsํŒŒ์ผ์„ ๋งŽ์ด ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— TTI๋˜ํ•œ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋„๋‹ˆ๋‹ค.
  • ํ–ฅ์ƒ๋œ SEO : HTML ํƒ€์ดํ‹€, ํƒœ๊ทธ ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœ๋˜๊ธฐ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.

๋‹จ์ 

  • ๋ณด์ด์ง€๋งŒ ์ž‘๋™ ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ: htmlํŒŒ์ผ๋งŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌด์— ํ™”๋ฉด์— ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋™์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ jsํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ์œ„ํ—˜: ํŽ˜์ด์ง€ ์š”์ฒญ์‹œ ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ๊ณผ ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ถ€ํ•˜๊ฐ€ ํฌ๋‹ค
  • ๋Š๋ฆฐ TTFB(Time to First Byte) : ํŽ˜์ด์ง€ ์š”์ฒญ๋งˆ๋‹ค html์„ ๋ฐ›์•„์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฒซ๋ฒˆ์งธ byte๊ฐ€ ์˜ค๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด csr๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.
  • CDN ์บ์‹ฑ์ „๋žต:-์š”์ฒญ์— ๋Œ€ํ•œ HTML ํŒŒ์ผ์„ ๋ฐ›์•„์˜ฌ ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— CDN์„ ํ™œ์šฉํ•œ ์บ์‹ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

[os] ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด

ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ ์—์„œ์˜ ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด์ 

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.

์šฉ์–ด ์ •๋ฆฌ

  • ํ”„๋กœ๊ทธ๋žจ : ํŒŒ์ผ์ด ์ €์žฅ ์žฅ์น˜์— ์ €์žฅ๋˜์–ด ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ์˜ฌ๋ผ๊ฐ€์ง€ ์žˆ์ง€ ์•Š์€ ์ •์ ์ธ ์ƒํƒœ. (window-exeํŒŒ์ผ/MaxOS .dmgํŒŒ์ผ )
  • ํ”„๋กœ์„ธ์Šค : ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ํ•ด๋‹น ํŒŒ์ผ์€ ์ปดํฌํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜๊ณ , ๋™์ ์ธ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์Šค๋ ˆ๋“œ : ํ”„๋กœ์„ธ์Šค์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐœ๋… - ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฐ์–‘์˜ ์‹คํ–‰๋‹จ์œ„๋กœ, ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค

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

์Šค๋ ˆ๋“œ

  • ๋ Œ๋”๋ง ์—”์ง„์˜ ์Šค๋ ˆ๋“œ : ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ์ค‘์š”ํ•œ ์š”์†Œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์ด๋‹ค.
    ๋ Œ๋”๋ง ์—”์ง„์€ HTML. CSS ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  DOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์ ์šฉ

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

NetWork: HTTP, HTTPS

HTTP, HTTPS

HTTP

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์˜ ํ”„๋กœํ† ์ฝœ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ํ•˜์ดํ„ฐ ํ…์ŠคํŠธ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋จ
  • HTTP๋Š” ์•”ํ˜ธํ™”๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๋™์•ˆ ์ œ 3์ž๊ฐ€ ์ •๋ณด๋ฅผ ๋„์ฒญํ•˜๊ฑฐ๋‚˜ ๋ณ€์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์Œ.

ํ•˜์ดํผ ํ…์ŠคํŠธ๋ž€?
๋ฌธ์„œ๋“ค ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ฐธ์กฐ ๋งํฌ(hyperlink)๋ฅผ ์˜๋ฏธ๏ฟฝํ•จ. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” HTML ๋ฌธ์„œ ๋‚ด์— ์žˆ๋Š” ํŒŒ๋ž€์ƒ‰ ๋ฐ‘์ค„๋กœ ๋˜์–ด์žˆ๋Š” ๋งํฌ๊ฐ€ ์—ฐ๊ฒฐ๏ฟฝ๋œ ๊ธ€์ž์ž„. ์›น ํŽ˜์ด์ง€์— ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์›นํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํ•˜์ดํผํ…์ŠคํŠธ์ž„

HTTPS

  • HTTP๋งŒ์œผ๋กœ๋Š” ์œ„์—์„œ ๋งํ–ˆ๋˜ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด HTTP ํ†ต์‹ ์— ์‹ ๋ขฐ์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ(๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ์ž‘๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ)์„ ์ถ”๊ฐ€ํ•จ
  • ์ž์‹ ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉ ๋ฐ ํ†ต์‹  ๋‚ด์šฉ์€ SSL(Secure Socket Layer)/TLS(Transport Layer Security)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•จ
  • HTTPS์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋Œ€์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ์„œ๋ฅผ ์ด์šฉํ•œ ๋น„๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ(์ฐธ์กฐ)

SSL/TLS๋ž€?

  • ์ „์†ก ๊ณ„์ธต์—์„œ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ํ•  ๋•Œ ์ œ 3์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์ฒญํ•˜๊ฑฐ๋‚˜ ๋ณ€์กฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๊ฐ„์—์„œ ์ธํ„ฐ์…‰ํŠธํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•จ. ๋”ฐ๋ผ์„œ HTTPS๋Š” HTTP์— ๋น„ํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ •์—์„œ ๋” ์•ˆ์ „ํ•จ

์ฐธ๊ณ 

[react] props ์™€ state

1. Props์™€ State์˜ ์ฐจ์ด?

Props์™€ State๋Š” ๋ชจ๋‘ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์‚ฌ์šฉ

1) props

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™ธ๋ถ€์—์„œ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ.
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ€ํ„ฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ.
props๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ด๋ฏ€๋กœ ์ง์ ‘ ์ˆ˜์ • ํ•  ์ˆ˜ ์—†๋‹ค.

2) state

์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ.
์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
state๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ, setState()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์‘๋‹ต๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•˜์—ฌ state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

3) ์™œ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ state์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๊ฐ€?

๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์ • ํ•˜์—ฌ๋„ ๋˜๋‚˜, ๋ณ€์ˆ˜๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์œผ๋‚˜ state๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉฐ ๋ฆฌ์•กํŠธ์—์„œ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค.

2. State์˜ ๋ถˆ๋ณ€์„ฑ์€ ์–ด๋–ป๊ฒŒ ์œ ์ง€ ?

๋ถˆ๋ณ€์„ฑ?

๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ์ง์ ‘์ ์ธ ๋ณ€๊ฒฝ์„ ํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์กด์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ

๊ธฐ์กด์˜ state์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์ฃผ์–ด์•ผ๋งŒ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋์Œ์„ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋œ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ด์œ ?

1) ์–•์€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€

๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ์–•์€ ๋น„๊ต(๊ฐ์ฒด์˜ ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ’๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด์ „ ์ฐธ์กฐ ๊ฐ’๊ณผ ํ˜„์žฌ ์ฐธ์กฐ๊ฐ’๋งŒ์„ ๋น„๊ตํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค. ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ด์œผ๋กœ์จ ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2)์‚ฌ์ดํŠธ ์ดํŽ™ํŠธ ๋ฐฉ์ง€

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

๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐฉ๋ฒ•

  • spread operator
  • map
  • filter
  • slice
  • reduce
    ๋“ฑ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ํ™œ์šฉํ•œ๋‹ค.

setState๋ฅผ ์ด์š”ํ•  ๋•Œ ์›์‹œํƒ€์ž… ๊ฒฝ์šฐ์—๋Š” ๊ฐ’์„ ๋ฐ”๋กœ ๋„ฃ์–ด ์ฃผ์–ด๋„ ๋˜์ง€๋งŒ ์ฐธ์กฐํƒ€์ž…์ธ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ํ›„ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

//์›์‹œํƒ€์ž…
const [number, setNumber] = useState(0) setState(3) 
// ์ฐธ์กฐํƒ€์ž… 
const [person, setPerson] = useState({ name: '', age: 30 }) setState({...person, name: 'pyo'})

3. key Props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

key๋ž€?

React๊ฐ€ ์–ด๋–ค ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ• ์ง€ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋•๊ณ , ์—˜๋ฆฌ๋จผํŠธ์— ์•ˆ์ •์ ์ธ ๊ณ ์œ ์„ฑ์„ ๋ถ€์—ฌ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ์—˜๋ฆฌ๋จผํŠธ์— ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. (์œ ์ผํ•œ ์‹๋ณ„์ž์˜ ์—ญํ• ์„ ๊ฐ€์ง„๋‹ค.)

key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

key props๋ฅผ ์ฃผ์—ˆ์„ ๋•Œ๋Š” ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ฃผ์ง€๋งŒ ์—†์„ ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์†๋„ ์ €ํ•˜, ์˜๋„์น˜ ์•Š์€ ์˜ค๋ฅ˜๋“ฑ์ด ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

key props ์˜ index

์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉ ์ค‘ ๋ฐฐ์—ด์ด ์žฌ๋ฐฐ์—ด ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ state์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” key๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐฑ์‹ ๋˜๊ณ  ์žฌ์‚ฌ์šฉ๋œ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ๋ณต์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„๋•Œ key ๋˜ํ•œ ๋ฐ”๋€”๊ฒƒ์ด๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ์—‰๋ง์ด ๋˜๊ฑฐ๋‚˜ ์˜๋„์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๋€”์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•ด๋‹น๋ฐ์ดํ„ฐ์˜ id๊ฐ’์„ key props๋กœ ์ฃผ๊ณ  ๋ Œ๋”๋ง ํ•œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์•ˆ์ •์ ์ธ id๊ฐ€ ์—†๋‹ค๋ฉด ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ํ•ญ๋™์˜ ์ธ๋ฑ์Šค๋ฅผ key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

NetWork: ๋ธŒ๋ผ์šฐ์ €์— www.naver.com์„ ์ž…๋ ฅํ•˜๋ฉด ์ผ์–ด๋‚˜๋Š” ์ผ

๋ธŒ๋ผ์šฐ์ €์— www.naver.com์„ ์ž…๋ ฅํ•˜๋ฉด ์–ด๋–ค ์ผ๋“ค์ด ์ผ์–ด๋‚ ๊นŒ?

  1. ์œ ์ €๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— url์„ ์ž…๋ ฅํ•จ

url(Universal Resource Locator)์ด๋ž€?
์„œ๋ฒ„์— ์ž์›์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅํ•˜๋Š” ์˜๋ฌธ์ฃผ์†Œ

  1. DNS(domain name system) ์กฐํšŒ
    DNS๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„๋ฉ”์ธ ์ด๋ฆ„์„ IP์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•จ
    ์šฐ์„  ๋ธŒ๋ผ์šฐ์ €๋Š” ๋กœ์ปฌ์— DNS ์บ์‹œ๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ  ์—†์œผ๋ฉด ISP(ex: SK ๋ธŒ๋กœ๋“œ๋ฐด๋“œ, KT ๋“ฑ)์˜ DNS ์„œ๋ฒ„์— ํ•ด๋‹น ๋„๋ฉ”์ธ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์š”์ฒญํ•จ
    ๊ทธ๋Ÿฌ๋ฉด DNS ์„œ๋ฒ„๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•จ

  2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ ‡๊ฒŒ ์–ป์€ IP์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด TCP ์—ฐ๊ฒฐ์„ ํ•จ.
    ์ด ๊ณผ์ •์—์„œ 3-way-handshake๊ฐ€ ์ด๋ฃจ์–ด์ง(์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹  ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ๋จ)


3-way-handshake๋ž€?
TCP ํ†ต์‹ ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •

  1. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ ‘์†์„ ์š”์ฒญํ•˜๋Š” SYN ํŒจํ‚ท ์ „์†ก
  2. ์„œ๋ฒ„๋Š” SYN ์š”์ฒญ์„ ๋ฐ›๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•œ๋‹ค๋Š” SYN_ACK-flag๊ฐ€ ์„ค์ •๋œ ํŒจํ‚ท ์ „์†ก
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ACK๋ฅผ ์ „์†ก ํ›„ ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง -> ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋จ

  1. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„ค์ •๋œ TCP ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์„œ๋ฒ„์— HTTP ์š”์ฒญ ๋ณด๋ƒ„
  2. ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ›„ ์‘๋‹ต์„ ๋ณด๋ƒ„
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต์„ ์ˆ˜์‹  ํ›„ ๋ Œ๋”๋งํ•จ(๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง)
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง

๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์ด๋ž€?

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTML, CSS, JS ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์šด ๋ฐ›์Œ โ†’ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด ๋ฆฌ์†Œ์Šค๋“ค์„ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์„ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์ด๋ผ ํ•จ

  1. DOM์„ ์ƒ์„ฑํ•จ
    ๋ธŒ๋ผ์šฐ์ €๋Š” HTML์„ ํŒŒ์‹ฑํ•ด ๋”ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•จ. HTML ์•ˆ์— ์žˆ๋Š” ํƒœ๊ทธ๋“ค์„ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋งˆ์น˜ ๋‚˜๋ฌด์ฒ˜๋Ÿผ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•จ(๊ทธ๋ž˜์„œ ๋”ํŠธ๋ฆฌ)

  2. CSSOM ์ƒ์„ฑ
    ๋ธŒ๋ผ์šฐ์ €๋Š” css ํŒŒ์ผ(ํ˜น์€ linkํƒœ๊ทธ๋‚˜ ๋‚ด๋ถ€ style ํƒœ๊ทธ)์„ ํŒŒ์‹ฑํ•ด cssom ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•จ. ๋”ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ css ์†์„ฑ์„ ๋…ธ๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋…ธ๋“œ ๊ฐ„์˜ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•จ

  3. ๋ Œ๋”ํŠธ๋ฆฌ ์ƒ์„ฑ
    ๋”ํŠธ๋ฆฌ์™€ cssom ํŠธ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•ด ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ํ˜•์„ฑํ•จ. ์ด๋•Œ ์‹ค์ œ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ์š”์†Œ๋งŒ์„ ์„ ํƒํ•ด ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ฆ

  4. ๋ ˆ์ด์•„์›ƒ(๋ฆฌํ”Œ๋กœ์šฐ)
    ๋ Œ๋”ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์ •ํ™•ํ•œ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•จ

  5. ํŽ˜์ธํŠธ(๋ฆฌํŽ˜์ธํŠธ)
    ๊ณ„์‚ฐ๋œ ๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ์‹ค์ œ๋กœ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•จ
    ์ด๋•Œ ๋ ˆ์ด์•„์›ƒ ๋‹จ๊ณ„์—์„œ ๊ณ„์‚ฐ๋œ ๋ชจ๋“  ์œ„์น˜, ํฌ๊ธฐ๋ฅผ ์‹ค์ œ ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•ด ํ™”๋ฉด์— ์ถœ๋ ฅํ•จ

  6. ํ•ฉ์„ฑ
    ํŽ˜์ธํŠธ๋‹จ๊ณ„์—์„œ ๋งŒ๋“  ๋ ˆ์ด์–ด๋“ค์„ ํ•ฉ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์ž„
    ์ด ๊ณผ์ •์—์„œ GPU๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ํ•จ
    GPU๋ž€ ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์žฅ์น˜๋กœ ์ปดํ“จํ„ฐ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•จ
    GPU๋ฅผ ์‚ฌ์šฉํ•ด CPU์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ์Œ
    transform์ด๋‚˜ opacity ๋“ฑ์˜ ์†์„ฑ์€ ๋ฐ”๋กœ ์ด ๊ณผ์ •์œผ๋กœ ๋„˜์–ด์˜ด(๋ฆฌํ”Œ๋กœ์šฐ, ๋ฆฌํŽ˜์ธํŠธ ๊ณผ์ • ์—†์ด)โ†’ ์ข€ ๋” ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ

๋ฆฌํŽ˜์ธํŠธ, ๋ฆฌํ”Œ๋กœ์šฐ๋ž€?
๊ธฐ์กด ์ƒ์„ฑํ•œ ๋ ˆ์ด์•„์›ƒ์ด ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์ด๋‚˜ ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ ๊ณผ์ •์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•จ (๋ฆฌํ”Œ๋กœ์šฐ)

๋ฆฌํ”Œ๋กœ์šฐ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๊ณ , ์‹ค์ œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ํŽ˜์ธํŒ… ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•จ(๋ฆฌํŽ˜์ธํŠธ)

๋”ฐ๋ผ์„œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฆฌํŽ˜์ธํŠธ๋„ ์ผ์–ด๋‚จ. ํ•˜์ง€๋งŒ ๋ ˆ์ด์•„์›ƒ์˜ ์˜ํ–ฅ์ด ์—†๋Š” ๋ณ€๊ฒฝ(ex: ์ƒ‰์ƒ ๋ณ€๊ฒฝ)์€ ๋ฆฌํ”Œ๋กœ์šฐ์—†์ด ๋ฆฌํŽ˜์ธํŠธ๋งŒ ์‹คํ–‰ํ•จ

[network] REST API

Rest

์›น์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ HTTPํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ
๊ตฌ์ฒด์ ์œผ๋กœ HTTP URI๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ž์›์ธ์ง€ ๋ช…์‹œํ•˜๊ณ , HTTP Method(GET,POST,PUT,PATCH,DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ ๋œ ๊ฒƒ ์ด๋‹ค.

6๊ฐ€์ง€ ์›์น™

  • Uniform interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)
    • URI๋กœ ์ง€์ •ํ•œ ์ž์›์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ๋†€์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
  • Stateless(๋ฌด์ƒํƒœ)
    • ์„ธ์…˜ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•ˆํž‰ ๋•Œ๋ฌธ์— API ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ ๋‹จ์ˆœํžˆ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์ด์ „ ์š”์ฒญ์ด ๋‹ค์Œ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ์— ์—ฐ๊ด€๋˜๋ฉด ์•ˆ๋œ๋‹ค.
    • ์„œ๋น„์Šค์˜ ์ž์œ ๊ฐ€ ๋†’์•„์ง€๊ณ  ์„œ๋ฒ„์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด ์ง„๋‹ค.
  • Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ)
    • ์›นํ‘œ์ค€ HTTPํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ํ• ์ˆ˜ ์žˆ๋‹ค.
    • HTTP๊ฐ€ ๊ฐ€์ง„ ์บ์‹ฑ ๊ธฐ๋Šฅ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Client-Server(ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ๊ตฌ์กฐ)
    • Client๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ์ปจํ…์ŠคํŠธ(์„ธ์…˜, ๋กœ๊ทธ์ธ์ •๋ณด)๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ณ  ์ฑ…์ž„์ง„๋‹ค.
    • REST ์„œ๋ฒ„๋Š” API ์ œ๊ณตํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ์„ ์ฑ…์ž„์ง„๋‹ค.
    • ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ํ™•์‹คํžˆ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.
  • Layered System(๊ณ„์ธตํ™”)
    • Client๋Š” REST API Server๋งŒ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    • REST API Server๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
      • ๋ณด์•ˆ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
      • Proxy, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„ ๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • Code-On-Demand(opional)
    • server๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด client์— ํ”„๋กœ๊ทธ๋žจ์„ ์ „๋‹ฌํ•˜๋ฉด client์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

REST API ๋ž€

API(Application Programming InterFace)๋ž€ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋˜๋‹ค๋ฅธ ํ”„๋กœ๊ธ€๋งค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ๋‹ค๋ฆฌ๋ผ๊ณ  ๋ณผ์ˆ˜ ์žˆ๋‹ค.
REST๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
์ฆ‰, HTTP์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์–ด๋–ค URI์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์— ๋„๋ฆฌ ์ง€์ผœ์ง€๋Š” ์•ฝ์†์ด๋‹ค.

REST API ์„ค๊ณ„ ๊ธฐ๋ณธ ๊ทœ์น™

  • URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผํ•œ๋‹ค.
    • ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์žก๋‹ค๋Š” ์†Œ๋ฌธ์ž
    • ์ž๋ฃŒ์— ๋”ฐ๋ผ ๋‹จ์ˆ˜๋ช…์‚ฌ, ๋ณต์ˆ˜ ๋ช…์‚ฌ ๊ตฌ๋ถ„
  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET,PUT,POST,DELETE)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
    • URI์— HTTP Method๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.
    • URI์— ํ–‰์œ„์— ๋Œ€ํ•œ ๋™์‚ฌ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋€๋‹ค.
    • ๊ฒฝ๋กœ ๋ถ€๋ถ„ ์ค‘ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์€ ์œ ์ผํ•œ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด

REST API ์„ค๊ณ„ ๊ทœ์น™

  • ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ
  • URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•˜์ดํ”ˆ (-)์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉใ…Ž๋‚˜๋‹ค.
  • ๋ฐ‘์ค„( _ )์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค
  • ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‘๋‹ต์ƒํƒœ ์ฝ”๋“œ

  • 1xx : ์ •๋ณด์‘๋‹ต
  • 2xx: ์„ฑ๊ณต์‘๋‹ต
  • 3xx:๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋ฉ”์‹œ์ง€
  • 4xx: ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ ์‘๋‹ต
  • 5xx: ์„œ๋ฒ„ ์—๋Ÿฌ ์‘๋‹ต

RESTful์ด๋ž€

RESTful์€ ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด
'REST API'๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ 'RESTful'ํ•˜๋‹ค๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.
RESTful์€ REST๋ฅผ REST๋‹ต๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, REST์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์€ RESTFul์ด๋ž€ ์šฉ์–ด๋กœ ์ง€์นญ๋œ๋‹ค.

React : React์—์„œ State์˜ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

React์—์„œ State์˜ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

state์˜ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€ ๋ฐฉ๋ฒ•

setState๋Š” ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•ด ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹  -> ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Œ -> ์˜ค๋ฅ˜๋“ค์„ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ์ž„์˜๋กœ state๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์•Œ์•„์ฑ„์ง€ ๋ชปํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ํ˜น์€ ์ด์ „ ์ƒํƒœ์™€ ํ˜„ํƒœ ์ƒํƒœ๋ฅผ ๋ฆฌ์•กํŠธ๊ฐ€ ๋น„๊ตํ•˜์ง€ ๋ชปํ•ด ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ UI์— ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•จ.
๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ

์˜ˆ์‹œ
const [item, setItem] = useState(['apple', 'banana', 'orange'])๋ผ๋Š” ๋ฐฐ์—ด์„ ๊ฐ€์ง„ state๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•จ
์—ฌ๊ธฐ์— 'peach'๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ item.push('peach')๋ฅผ ํ•œ๋‹ค๋ฉด ์ง์ ‘ ๋ณ€๊ฒฝ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋Š” item ๋ฐฐ์—ด์˜ ๋ณ€ํ™”๋ฅผ ์•Œ์ง€ ๋ชปํ•จ(๋ณ€๊ฒฝ์„ ํ•  ๋•Œ๋Š” setState๋ฅผ ์‚ฌ์šฉํ•ด ์ด์ „ ์ƒํƒœ์™€๋Š” ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ(๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋˜‘๊ฐ™์ด ์ƒ๊ฒผ๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒํ•ด์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ฆ))
๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Œ

setItem([...item, 'peach'])

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด item์˜ ์š”์†Œ๋“ค์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋ณต์‚ฌ ํ›„ 'peach'๋ผ๋Š” ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•จ. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด item๋ฐฐ์—ด์€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ item ๋ฐฐ์—ด๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜์–ด state๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ

NetWork: REST API๋ž€?

REST API

REST(Representational State Transfer)๋ž€?

  • ์›น ์ƒ์˜ ์ž์›์„ HTTP URI๋ฅผ ํ†ตํ•ด ํŠน์ •ํ•˜๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•จ
  • REST๋Š” ์›น์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ž„

REST์˜ ๊ตฌ์„ฑ์š”์†Œ

  • ์ž์›(Resource) : URI๋ฅผ ํ†ตํ•ด ์ž์›์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์›น ์ƒ์—์„œ ํ•ด๋‹น ์ž์›์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ œ๊ณต
    ex: 'https://www.example.com/products'

  • ํ–‰์œ„(Verb) : HTTP ๋ฉ”์†Œ๋“œ(GET, POST, PATCH, DELETE ๋“ฑ)

  • ํ‘œํ˜„ (Representations) :

    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ˜•ํƒœ
    • JSON, XML, TEXT, RSS ๋“ฑ์ด ์žˆ์Œ
    • ์ฃผ๋กœ JSON์ด๋‚˜ XML์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ
[
  {
    "name": "globe",
    "price": 50000,
    "color": "black"
  },
  {
    "name": "shirts",
    "price": 30000,
    "color": "red"
  }
]

์œ„ JSON ๊ฐ์ฒด๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ํ‘œํ˜„์ž„. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋Š” 'products' ์ž์›์˜ ์ƒํƒœ๋ฅผ JSON ํ˜•ํƒœ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•จ

REST์˜ ์›์น™(ํŠน์ง•)

(1) Uniform (์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค)
๋ชจ๋“  ์ž์›๊ณผ ํ–‰์œ„๊ฐ€ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งํ•จ
ex: ๋ชจ๋“  ์›น ์ž์›์€ URI๋กœ ํ‘œํ˜„๋˜๊ณ , ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP ๋ฉ”์†Œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ)๋กœ ์ผ๊ด€๋˜๊ฒŒ ํ‘œํ˜„๋จ -> ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ

(2) Stateless (๋ฌด์ƒํƒœ์„ฑ)
REST๋Š” ์ž‘์—…์„ ์œ„ํ•œ ์ƒํƒœ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๏ฟฝ์Œ.
์„ธ์…˜ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— API ์„œ๋ฒ„๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ์„ ๋‹จ์ˆœํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋จ -> ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค์˜ ์ž์œ ๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์„œ๋ฒ„์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง

(3) Cacheable (์บ์‹œ ๊ฐ€๋Šฅ)
HTTP๋ผ๋Š” ๊ธฐ์กด ์›นํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•จ. ๋”ฐ๋ผ์„œ HTTP๊ฐ€ ๊ฐ€์ง„ ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ์ ์šฉ ๊ฐ€๋Šฅํ•จ. Last-Modifiedํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•จ(์„œ๋ฒ„์—์„œ ์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์˜จ 'Last-Modified' ํƒœ๊ทธ๋‚˜ 'ETag' ํƒœ๊ทธ๋ฅผ ๋ฐ›์•„ ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๋‹ค์Œ ์š”์ฒญ ์‹œ 'If-Modified-Since' ๋˜๋Š” 'If-None-Match' ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋ƒ„)

(4) Self-descriptiveness (์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ)
REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ์Œ

(5) Client - Server ๊ตฌ์กฐ
REST ์„œ๋ฒ„๋Š” API ์ œ๊ณต, ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ์ปจํ…์ŠคํŠธ(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด)๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ํ™•์‹คํžˆ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋‚ด์šฉ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ์„œ๋กœ๊ฐ„ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค๊ฒŒ ๋จ

(6) ๊ณ„์ธตํ˜• ๊ตฌ์กฐ
REST ์„œ๋ฒ„๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Œ
์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ๋งŒ ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘๊ฐ„ ๊ณ„์ธต(๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, ์บ์‹œ ์„œ๋ฒ„ ๋“ฑ)์„ ๊ฑฐ์ณ์„œ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž„.
ex: ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋จผ์ € ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ๋„์ฐฉ -> ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•˜์—ฌ ์š”์ฒญ์„ ์ „๋‹ฌ

์ด๋Ÿฐ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋Š” ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์คŒ

REST API

REST์˜ ์›์น™์„ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธํ•จ

REST API์˜ ์„ค๊ณ„ ๊ทœ์น™

  1. URI๋Š” ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ, ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
http://www.example.com/Member/delete/1 (x)
http://www.example.com/member/1 (O)

URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— delete์™€ ๊ฐ™์€ ํ–‰์œ„์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ ๋จ
๊ทธ๋ฆฌ๊ณ  ๋Œ€์†Œ๋ฌธ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— URI์— ๋Œ€๋ฌธ์ž๋Š” ๊ฐ€๊ธ‰์  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ

  1. ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ
http://www.example.com/run/ (x)
http://www.example.com/run (O)
  1. ์–ธ๋”๋ฐ”(_) ๋Œ€์‹  ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉ
http://www.example.com/run_member (x)
http://www.example.com/run-member (O)
  1. URI์— ํŒŒ์ผ ํ™•์žฅ์ž ํฌํ•จํ•˜์ง€ ์•Š์Œ
http://www.example.com/photo.jpg (x)
http://www.example.com/photo (O)
  1. ํ–‰์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ
`DELETE` http://www.example.com/delete/post (x)
`DELETE` http://www.example.com/post/:id (O)

ํ–‰์œ„์— ๋Œ€ํ•œ ์ •์˜๋Š” HTTP METHOD๋ฅผ ํ†ตํ•ด ํ•˜๊ธฐ!

HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ

์ž˜ ์„ค๊ณ„๋œ REST API๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ž˜ ์ฃผ๋Š” ๊ฒƒ๊นŒ์ง€ ํฌํ•จ๋˜์–ด์•ผ ํ•จ

์ƒํƒœ์ฝ”๋“œ ์„ค๋ช…
200 ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•จ
201 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์–ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋จ(POST)
202 ์š”์ฒญ์€ ์ ‘์ˆ˜ํ–ˆ์ง€๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ.
์‘๋‹ต ํ—ค๋”์˜ Location, Retry-After๋ฅผ ์ฐธ๊ณ ํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์‹œ ์š”์ฒญ ๋ณด๋‚ด์•ผํ•จ
301 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ URI๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ
303 ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์š”์ฒญ
400 ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ถ€์ ์ ˆํ•  ๊ฒฝ์šฐ
401 ๏ฟฝ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์—‘์„ธ์Šค ๊ถŒํ•œ ์—†์Œ
403 ์œ ์ € ์ธ์ฆ ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ์‘๋‹ตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฆฌ์Šค์†Œ๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ–ˆ์„ ๋•Œ
404 ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
405 ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ–ˆ์„ ๊ฒฝ์šฐ
500 ์„œ๋ฒ„์—๋Ÿฌ
501 ์š”์ฒญํ•œ URI์˜ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ์„œ๋ฒ„๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Œ
502 ๊ฒŒ์ดํŠธ์›จ์ด ํ˜น์€ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ๊ทธ ๋’ท๋‹จ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ž˜๋ชป๋œ ์‘๋‹ต์„ ๋ฐ›์•˜์Œ
503 ํ˜„์žฌ ์„œ๋ฒ„์—์„œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Œ
๋ณดํ†ต ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜๋‚˜ ์„œ๋น„์Šค ์ ๊ฒ€ ๋“ฑ์˜ ์ผ์‹œ์ ์ธ ์ƒํ™ฉ

RESTful API์ด๋ž€?

REST์˜ ์„ค๊ณ„ ๊ทœ์น™์„ ์ž˜ ์ง€์ผœ์„œ ์„ค๊ณ„๋œ API๋ฅผ RESTfulํ•œ API๋ผ๊ณ  ํ•จ

์˜ˆ๋ฅผ ๋“ค๋ฉด ์–ด๋–ค ์‚ฌ๋žŒ์ด /api/post๋ผ๋Š” URI์— ๋Œ€ํ•œ CRUD์— ๊ด€ํ•œ ํ–‰์œ„๋ฅผ ๋ชจ๋‘ POST๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๊ณ ํ•˜๋ฉด REST๋ฅผ ์‚ฌ์šฉํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์„ค๊ณ„ ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ง€ํ‚ค์ง€ ์•Š์Œ(์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค ์›์น™์— ์–ด๊ธ‹๋‚จ) -> REST API๋ฅผ ์‚ฌ์šฉํ•˜๊ธด ํ–ˆ์ง€๋งŒ RESTfulํ•˜์ง€ ๋ชปํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ

[React] Redux, flux pattern

๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉ ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง๋“ค ์„ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ์„œ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋„ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋•์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€

  1. ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฐ๊ฐ€?
  2. ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
  3. ๋ฆฌ๋•์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•œ๊ฐ€?

์•ก์…˜

  • ์•ฑ์—์„œ ์Šคํ† ์–ด์— ์šด๋ฐ˜ํ•  ๋ฐ์ดํ„ฐ
  • ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด ํ˜•ํƒœ ์—ฌ์•ผํ•œ๋‹ค.
  • type ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ๊ฐ’์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž์œ ๋กญ๊ฒŒ ๋„ฃ์–ด์ค„ ์ˆ˜ ์ด๋”ฐ.
  • dispatch์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
{
	type: 'CHANGE_INPUT', // ํ•„์ˆ˜
	text : '๋ธ”๋ผ๋ธ”๋ผ',
	data :{
		id:0,
		text:"๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๊ธฐ"
	}
}

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜(Action Creator)

  • ์•ก์…˜์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜
  • ์ปดํฌ๋„ŒํŠธ์—์„œ ์‰ฝ๊ฒŒ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ exportํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ
export function addTodo(data){
	return {
		type:"ADD_TODO".
		data
	}
}

๋ฆฌ๋“€์„œ

  • ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜
  • ๊ธฐ์กด์ƒํƒœ๋ฅผ ์ „๋‹ฌ ๋ฐ›์€ action์„ ์ฐธ๊ณ ํ•ด์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function reducer(state, action) {
  // ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง
  return alteredState;
}

์Šคํ† ์–ด

  • ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹น ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๊ตฌ์„ฑ: ํ˜„์žฌ์˜ ์•ฑ ์ƒํƒœ / ๋ฆฌ๋“€์„œ/ ๋ช‡๊ฐ€์ง€ ๋‚ด์žฅ ํ•จ์ˆ˜
  • ์Šคํ† ์–ด๊ฐ€ ํ•˜๋Š”์ผ
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ €์žฅ
    • getState()์„ ํ†ตํ•ด ์ƒํƒœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • dispatch์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    • subscribe(listner)๋ฅผ ํ†ตํ•ด ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋ก

๋””์ŠคํŒจ์น˜(dispatch)

  • ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜
  • ์•ก์…˜์„ ๋ฐœ์ƒ
  • ์•ก์…˜์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ

๊ตฌ๋…

  • ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜
  • ํ•จ์ˆ˜ํ˜•ํƒœ์˜ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค
  • subscribeํ•จ์ˆ˜์— ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋ฉด, ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜ ๋˜์—ˆ์„ ๋•Œ ๋งˆ๋‹ค ์ „๋‹ฌํ•ด์ค€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๋ฆฌ๋•์Šค์˜ 3๊ฐ€์ง€ ๊ทœ์น™

  1. ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์•ˆ์—” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค.
  2. ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.
  3. ๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.

Flux ํŒจํ„ด

client-side ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

MVC(Model, View, Controller)

image

  • Model : ๋ฐ์ดํ„ฐ ์ €์žฅ
  • Controller : Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ(CRUD)
  • View: Model์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด View๋กœ ์ „๋‹ฌ๋˜์–ด ์‚ฌ์šฉ์ž์— ๋ณด์—ฌ์ง„๋‹ค.
    View๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Model์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅผ ์ˆ˜ ์žˆ๋‹ค

View๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋œ View๊ฐ€ ๋˜๋‹ค๋ฅธ Model์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ๋ณต์žกํ•œ ๋ฐ์ดํŠธ ํ๋ฆ„์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋งŽ์€ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋ฉด Model์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ด๋ฒคํŠธ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋กœ ํผ์ €๋‚˜๊ฐˆ๋•Œ ์ด๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค์–ด์ง„๋‹ค.

Flux

MVCํŒจํ„ด์˜ ๋ณต์žก์„ฑ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ๋ฅด๋„๋ก Flux ํŒจํ„ด์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.
image
Flux ํŒจํ„ด์€ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์œ ์ง€ํ•œ๋Š” ์•„ํ‚คํ…์ฒ˜ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Action์„ ๋งŒ๋“ค๊ณ , Action์„ Dispatcher์— ์ „๋‹ฌํ•˜์—ฌ Store์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค View์— ๋ฐ˜์˜ํ•˜๊ฒŒ ๋œ๋‹ค.
๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์„ ์‚ฌ์šฉ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ๊ณผ ์˜ˆ์ธก๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉฐ ๋ณตํ•ฉ์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

action

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ์–ด๋‚˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
  • Action creator ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ ๋ฐœ์ƒํ•œ action์˜ type๊ณผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ(playload)๋ฅผ ๋ฌถ์–ด Dispatcher์— ์ „๋‹ฌํ•œ๋‹ค.

Dispatcher

  • Action์„ ๋ฐ›์•„์„œ Store์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ
  • Store์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์˜ค์ง Dispatcher๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

Store

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ์™€ ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • Store์˜ state๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ View์— ์ „๋‹ฌํ•œ๋‹ค.

View

  • Flux์˜ view๋Š” MVC ์˜ View์™€๋Š” ๋‹ฌ๋ฆฌ Store์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•œํŽธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ View๋กœ ์ „๋‹ฌ ํ•˜๊ธฐ๋„ ํ•˜๋Š” ์ผ์ข…์˜ View-controller๋กœ ๋ณด์•„์•ผ ํ•œ๋‹ค.
  • ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ์ด๋‹ค.

์•„ํ‚คํ…์ฒ˜์™€ ๋””์ž์ธํŒจํ„ด

MVC๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ธ๊ฐ€์ง€ ์—ญํ• (Model, view, Controller)๋กœ ๋‚˜๋ˆˆ ์•„ํ‚คํ…์ฒ˜ ๋””์ž์ธํŒจํ„ด์ด๊ณ 
Flux๋Š” ๋‹จ๋ฐ˜ํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๋””์ž์ธ (MVC)
์ „์ฒด ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ์™€ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๊ณ„ ํ•˜๋Š”๊ฒƒ

๋””์ž์ธํŒจํ„ด (Singleton, Observer)
์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์‹œ ํŠน์ • ์ƒํ™ฉ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ„ด์„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”์ƒํ™”ํ•œ๊ฒƒ.

[js]๋ฒ„๋ธ”๋ง,์บก์ฒ˜๋ง, ์ด๋ฒคํŠธ ์œ„์ž„

์ด๋ฒคํŠธ ํ๋ฆ„

HTML ๋ฌธ์„œ์˜ ๊ฐ ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ ํƒœ๊ทธ ์•ˆ์— ํƒœ๊ทธ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๊ณ„์ธต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ณ„์ธต์  ๊ตฌ์กฐ ํŠน์ง• ๋•Œ๋ฌธ์— ์š”์†Œ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์—ฐ์‡„์  ์ด๋ฒคํŠธ ํ๋ฆ„์ด ์ผ์–ด๋‚œ๋‹ค.
์ „ํŒŒ ๋ฐฉํ–‰์— ๋”ฐ๋ผ ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

## ์ด๋ฒคํŠธ ์ „ํŒŒ ํ๋ฆ„ 3๊ฐ€์ง€ 1. ์บก์ฒ˜๋ง ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„ 2. ํƒ€ํ‚ท ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์‹ค์ œ ํƒ€๊นƒ ์š”์†Œ์— ์ „๋‹ฌ๋˜๋Š” ๋‹จ๊ณ„ 3. ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ ๋˜๋Š” ๋‹จ๊ณ„

๋ฒ„๋ธ”๋ง

์ž์‹ ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ”๊นฅ ๋ถ€๋ชจ ์š”์†Œ๋กœ ์ „ํŒŒ

<div id="ancestor">
	<div id="parent">
		<div id="child"></div>
	</div>
</div>
<script>
	ancestor.addEventListener("click", (e) => {
	  console.log('ancestor clicked');
	})
	parent.addEventListener("click", (e) => {
	  console.log('parent clicked');
	})
	child.addEventListener("click", (e) => {
	  console.log('child clicked');
	})
</script>

แ„‡แ…ฅแ„‡แ…ณแ†ฏแ„…แ…ตแ†ผ

์บก์ณ๋ง

์ž์‹์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ถ€๋ชจ์š”์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์•ˆ์ชฝ ์ž์‹ ์š”์†Œ๊นŒ์ง€ ๋„๋‹ฌ

<div id="ancestor">
    <div id="parent">
   		<div id="child"></div>
    </div>
</div>

<script>
	ancestor.addEventListener("click", (e) => {
	  console.log('ancestor clicked');
	}, true)
	parent.addEventListener("click", (e) => {
	  console.log('parent clicked');
	}, true)
	child.addEventListener("click", (e) => {
	  console.log('child clicked');
	}, {capture: true})
</script>

แ„แ…ขแ†ธแ„Žแ…ฅแ„…แ…ตแ†ผ

์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์ง€

๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณค ๋ฒ„๋ธ”๋ง, ์บก์ฒ˜๋ง์„ ๋ง‰๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.

e.stopPropagation()

๋ฒ„๋ธ”๋ง, ์บก์ฒ˜๋ง ์„ค์ •์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

ancestor.addEventListener("click", (e) => {
  e.stopPropagation() // ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์ง€
  print('ancestor')
})
parent.addEventListener("click", (e) => {
  e.stopPropagation() // ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์ง€
  print('parent')
})
child.addEventListener("click", (e) => {
  e.stopPropagation() // ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์ง€
  print('child')
})

e.stopImmediatePropagagation()

์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์š”์†Œ์— ๋ฐœ์ƒํ•œ ๋™์ผํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰๊นŒ์ง€ ๋ง‰๋Š”๋‹ค.

child.addEventListener("click", (e) => {
    
    if(์กฐ๊ฑด)
    	e.stopImmediatePropagation()
        
    print('child')
})
child.addEventListener("click", (e) => {
    print('child 2')
})

e.target

์ง์ ‘ ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ํ†ตํ•ด ์ผ์ผํžˆ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

document.body.addEventListener('click', (e) => {
    if (e.target.id === "ancestor") {
        print('ancestor')
    }
    if (e.target.id === "parent") {
        print('parent')
    }
    if (e.target.id === "child") {
        print('child')
    }
    
});

e.target vs this(e.currentTarget)

  • e.target ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ์œ„์ž„๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ์ž์‹์˜ ์œ„์น˜, ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์ž์‹์š”์†Œ ๋ฐ˜ํ™˜
  • e.currentTarget ์ด๋ฒคํŠธ๊ฐ€ ๋ถ€์ฐฉ๋œ ๋ถ€๋ชจ์˜ ์œ„์น˜ ๋ฐ˜ํ™˜

์ด๋ฒคํŠธ ์œ„์ž„

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

<ul id="menu">
  <li><button id="file">ํŒŒ์ผ</button></li>
  <li><button id="edit">ํŽธ์ง‘</button></li>
  <li><button id="view">๋ณด๊ธฐ</button></li>
</ul>
<script>
document.getElementById('menu').addEventListener('click',function(e){
	var target = e.target
	if(target.id === 'file'){
	
	}else if(target.id === 'edit'){
	
	}else if(target.id === 'view'){
	
	}
})
</sctipt>

์ด๋ฒคํŠธ ์œ„์ž„์˜ ์žฅ์ 

  1. ๋™์ ์ธ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜์›”ํ•˜๋‹ค
  2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค
  3. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ ๋‹ค.
  4. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ๋„ ์ค„์–ด๋“ ๋‹ค.

JavaScript: ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋น„๋™๊ธฐ

์ฝœ๋ฐฑํ•จ์ˆ˜, ๋น„๋™๊ธฐ

์ฝœ๋ฐฑํ•จ์ˆ˜

const example = (cb) => {
  setTimeout(() => {
    console.log("๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์™„๋ฃŒ");
  }, 2000);
};

console.log("๋น„๋™๊ธฐํ•จ์ˆ˜ ํ˜ธ์ถœ");
example(() => {
  console.log("์ฝœ๋ฐฑํ•จ์ˆ˜ ์‹คํ–‰");
});
console.log("๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ ์ฝ”๋“œ");

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

์ฝœ๋ฐฑํ—ฌ์ด๋ž€?

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

์ด๋ ‡๊ฒŒ ์ฝœ๋ฐฑํ—ฌ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ์— ์–ด๋ ค์›Œ์ง
๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ์ ์ธ ๊ฒƒ์„ ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•จ
์ด๋ฅผ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด Promise, Generator(ES6), async & await(ES7)์ž„

๋น„๋™๊ธฐ๋ž€?

  • ๋™๊ธฐ
    ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

  • ๋น„๋™๊ธฐ
    ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ ์™„๋ฃŒ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฆ‰์‹œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹
    ex: addEventListener, setTimeout ๋“ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„ ๊ณผ์ •

์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•ด๋ณด์ž
์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Œ

Promise

๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋ฉฐ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ธํ•œ ์ฝœ๋ฐฑํ—ฌ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๊ฐœ๋…
Promise๋Š” pending, fulfilled, rejected์˜ ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ , .then()๊ณผ .catch() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต, ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

์˜ˆ์‹œ
var addCoffee = function (name) {
	return function (prevName) {
		return new Promise(function (resolve) {
			setTimeout(function () {
				var newName = prevName ? (prevName + ', ' + name) : name;
				console.log(newName);
				resolve(newName);
			}, 500);
		});
	};
};

addCoffee('์—์Šคํ”„๋ ˆ์†Œ')()
	.then(addCoffee('์•„๋ฉ”๋ฆฌ์นด๋…ธ'))
	.then(addCoffee('์นดํŽ˜๋ชจ์นด'))
	.then(addCoffee('์นดํŽ˜๋ผ๋–ผ'));
  • addCoffee๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, addCoffee ํ•จ์ˆ˜๋Š” prevName์„ ์ธ์ž๋กœ ๋ฐ›์•„, prevName์ด ์žˆ๋‹ค๋ฉด prevName๊ณผ ์ธ์ž๋กœ ๋“ค์–ด์˜จ name์„ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๊ณ , prevName์ด ์—†๋‹ค๋ฉด name์„ ๋ฆฌํ„ดํ•จ

  • addCoffee๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” Promise๋ฅผ ๋ฆฌํ„ดํ•จ
    ์ด Promise๋Š” 0.5์ดˆ ๋’ค์— resolve๋˜๊ณ , resolve๋  ๋•Œ newName์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ Promise์˜ ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋จ

  • addCoffee ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ Promise๋Š” .then() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ then ์ฒด์ด๋‹์ด ๋จ
    addCoffee('์—์Šคํ”„๋ ˆ์†Œ')()๋ฅผ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ Promise๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด Promise๊ฐ€ resolve๋˜๋ฉด .then(addCoffee('์•„๋ฉ”๋ฆฌ์นด๋…ธ'))๊ฐ€ ์‹คํ–‰๋จ
    ์—ฌ๊ธฐ์„œ addCoffee('์•„๋ฉ”๋ฆฌ์นด๋…ธ')๋Š” ๋‘ ๋ฒˆ์งธ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•จ
    ์ฆ‰, ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด

์—์Šคํ”„๋ ˆ์†Œ
์—์Šคํ”„๋ ˆ์†Œ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ
์—์Šคํ”„๋ ˆ์†Œ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ, ์นดํŽ˜๋ชจ์นด
์—์Šคํ”„๋ ˆ์†Œ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ, ์นดํŽ˜๋ชจ์นด, ์นดํŽ˜๋ผ๋–ผ

์ด๋ ‡๊ฒŒ ๋ฌธ์ž์—ด์ด ๋‚˜์˜ค๊ณ , ์ด ๊ณผ์ •์ด ๊ณ„์† ๋ฐ˜๋ณต๋˜์–ด ๋งˆ์ง€๋ง‰์—๋Š” '์—์Šคํ”„๋ ˆ์†Œ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ, ์นดํŽ˜๋ชจ์นด, ์นดํŽ˜๋ผ๋–ผ'๋ผ๋Š” ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์ด ๋ฆฌํ„ด๋จ

async, await

ES7์— ์ƒˆ๋กœ ๋„์ž…๋œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์œผ๋กœ async๋Š” ํ•จ์ˆ˜ ์•ž์— ์œ„์น˜ํ•˜๋ฉฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•จ
await๋Š” async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Promise์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
์ด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ๋„ ๋™๊ธฐ์ ์ธ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

์˜ˆ์‹œ
var addCoffee = function (name) {
	return new Promise(function (resolve) {
		setTimeout(function(){
			resolve(name);
		}, 500);
	});
};
var coffeeMaker = async function () {
	var coffeeList = '';
	var _addCoffee = async function (name) {
		coffeeList += (coffeeList ? ', ' : '') + await addCoffee(name);
	};
	await _addCoffee('์—์Šคํ”„๋ ˆ์†Œ');
	console.log(coffeeList);
	await _addCoffee('์•„๋ฉ”๋ฆฌ์นด๋…ธ');
	console.log(coffeeList);
	await _addCoffee('์นดํŽ˜๋ชจ์นด');
	console.log(coffeeList);
	await _addCoffee('์นดํŽ˜๋ผ๋–ผ');
	console.log(coffeeList);
};
coffeeMaker();

์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๋กœ๋”ฉ ์ตœ์ ํ™” ์™€ ๋ Œ๋œ์ด ์ตœ์ ํ™”๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•œ๋‹ค.

๋ Œ๋”๋ง ์ตœ์ ํ™”

์›น ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ๋ชฉํ‘œ๋Š” ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด์„œ, ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ

1. CSS ์ตœ์ ํ™”

  1. ๋ฆฌํ”Œ๋กœ์šฐ, ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ๊ณ ๋ คํ•œ ์Šคํƒ€์ผ ์ž‘์„ฑ

๋ฆฌํ”Œ๋กœ์šฐ
๋ ˆ์ด์•„์›ƒ์˜ ๋„“์ด, ๋†’์ด, ์œ„์น˜ ๋“ฑ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” CSS์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ 'Layout'๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ทธ๋ ค์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ๋ฆฌํ”Œ๋กœ์šฐ ๋ผ๊ณ  ํ•œ๋‹ค

position / width / height / margin / padding / display / top / left / right / bottom / 
box-sizing / border-color / text-align / border / border-width / 
font-family / float / font-size / font-weight / line-height / vertical-align / 
white-space / word-wrap / text-overflow / text-shadow ...

๋ฆฌํŽ˜์ธํŠธ
๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํŽ˜์ธํŠธ ์ž‘์—…๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ๋ฆฌํŽ˜์ธํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

color / border-style / visibility / background / background-color / 
background-image / background-position / background-repeat / background-size / 
text-decoration / outline / outline-style / outline-color / outline-width / 
border-radius / box-shadow ...

๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์†์„ฑ

opacity / transform / cursor / z-index ...

๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ „์ฒด ํ”ฝ์…€์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํŽ˜์ธํŠธ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๋ฉด์—์„œ ์ข‹๋‹ค.

  1. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” CSS ์ œ๊ฑฐ
    lighthouse ์—์„œ ํ™•์ธํ›„ ์ œ๊ฑฐํ•œ๋‹ค.

  1. ๊ฐ„๊ฒฐํ•œ ์Šคํƒ€์ผ ์ž‘์„ฑ
    ๋ณต์žกํ•œ ์…€๋ ‰ํ„ฐ๋Š” ์ง€์–‘ํ•œ๋‹ค. ๋ ˆ์ด์•„์›ƒ์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ์‹œ๊ฐ„ ์†Œ์š”๊ฐ€ ๋œ๋‹ค.

2. HTML์ตœ์ ํ™”

  1. ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ค‘๋ณต ๋ฐœ์ƒ
    • ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด์„œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒ
    • ์Šคํƒ€์ผ ์‹œํŠธ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์— ๋งž๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์—๋„ ์ ํ•ฉ
  2. ๋ณต์žกํ•œ DOM ์ง€์–‘
    ์ž์‹์š”์†Œ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก DOMํŠธ๋ฆฌ๊ฐ€ ์ปค์ง€๋ฉฐ ๊ณ„์‚ฐํ•ด์•ผ๋Š” ๊ฒƒ๋“ค์ด ๋งŽ์•„์ง„๋‹ค. (๋ถˆํ•„์š”ํ•œ div wrapper)

3. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”

  1. css ํ†ตํ•ด ๊ตฌํ˜„ ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๋ฉด์—์„œ ์ข‹๋‹ค
  2. transform์€ ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ ๋ชจ๋‘ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ํ•ฉ์„ฑ๋งŒ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์†์„ฑ์ด๋ฉฐ ์‚ฌ์šฉ์‹œ ๋ Œ๋”๋ง ์†๋„๋ฅผ ํ–ฅ์ƒน ์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค.
  3. position์„ค์ • ์‹œ absolute๋‚˜ fixed๋กœ ์„ค์ •ํ•˜๋ฉด ์ฃผ๋ณ€ ์š”์†Œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

4. JS ์ตœ์ ํ™”

๊ฐ•์ œ ๋™๊ธฐ ๋ ˆ์ด์•„์›ƒ ํ”ผํ•˜๊ธฐ/๋ ˆ์ด์•„์›ƒ ์Šค๋ ˆ์‹ฑ(thrashing) ํ”ผํ•˜๊ธฐ

  • ๋ ˆ์ด์•„์›ƒ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์š”์†Œ์˜ ์œ„์น˜๋‚˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝ ํ›„ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด ๊ฐ•์ œ๋กœ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. (๊ฐ•์ œ๋™๊ธฐ ๋ ˆ์ด์•„์›ƒ์ด๋ผ ํ•œ๋‹ค.)
  • ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๊ฒƒ์„ ๋ ˆ์ด์•„์›ƒ ์Šค๋ ˆ์‹ฑ์ด๋‹ค.

๋กœ๋”ฉ ์ตœ์ ํ™”

1. ๋ Œ๋” ๋ธ”๋กœํ‚น ์ตœ์ ํ™”

  1. css๋Š” head, js๋Š” body ํ•˜๋‹จ์—์„œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
    • ๋น ๋ฅด๊ฒŒ ๋กœ๋“œ ๋˜๋ฉด ์‹œ๊ฐ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๊ทธ๋ ค์ง„๋‹ค.
    • script๋Š” htmlํŒŒ์‹ฑ์„ ๋ฉˆ์ถ”๊ณ  ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค. ๋ชจ๋“  ๊ตฌ์กฐ๋“ค์ด ๋๋‚˜๊ณ  js ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.
  2. media ์†์„ฑ ์‚ฌ์šฉ
    • ์กฐ๊ฑด๋ณ„๋กœ css ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    • media ์†์„ฑ์ด ์—†๋Š” ์Šคํƒ€์ผ์‹œํฌ๋Š” ํ•ด๋‹น ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด์„ํ•˜๋Š” ๋™์•ˆ ํ™”๋ฉด์— ์Šคํƒ€์ผ์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š”๋‹ค.
  3. async/ defer
    • async : ๋‹ค์šด๋กœ๋“œ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰
    • defer : ์›นํ—ค์ด์ง€๊ฐ€ ๋ชจ๋‘ ๊ทธ๋ ค์ง€๊ณ  DOM์ด ๋“ค์–ด์™”์„๋•Œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
<!-- ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ & ์ฆ‰์‹œ์‹คํ–‰ -->
<script async src="test.js"></script>

<!-- ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ & ์ง€์—ฐ์‹คํ–‰ -->
<script defer src="test.js"></script>
<script> - ๋ฐ˜๋“œ์‹œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ• ๋•Œ
<script async> - ๋นจ๋ฆฌ ์‹คํ–‰๋˜์–ด์•ผ ํ• ๋•Œ
<script defer> - ๋งˆ์ง€๋ง‰์— ํŒŒ์‹ฑํ•ด๋„ ์ƒ๊ด€์—†์„๋•Œ

2. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

  1. ํ™˜๊ฒฝ์— ๋งž๋Š” ์ด๋ฏธ์ง€
  • webp
  • avif : ํฌ๋กฌ/์‚ผ์„ฑ์ง€์› ์ €์šฉ๋Ÿ‰์ด๋ฉด์„œ ๊ณ ํ’ˆ์งˆ
  • media ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์ฆˆ ๋งž๋Š” ์ด๋ฏธ์ง€ ์ œ๊ณต
<source srcset="mob.webp" media="(max-width: 760px)">
  1. img ์ง€์—ฐ ๋กœ๋”ฉ(loading)
    • ํ™”๋ฉด ์ง€์—ฐ/๋ณ‘๋ ฌ ๋กœ๋”ฉ
    • auto: ๋””ํดํŠธ
    • lazy: ํ™”๋ฉด์ƒ ๋ณด์ด๋Š” ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅ
    • eager : ์œ„์น˜ ์ƒ๊ด€์—†์ด ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋˜์ž๋งˆ์ž ์ด๋ฏธ์ง€ ๋กœ๋“œ
<img src="item.jpg" loading="lazy" alt>
  1. ์Šคํ”„๋ผ์ดํŠธ ์ด๋ฏธ์ง€
    • ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฐœ์ˆ˜ ์ž์ฒด๋ฅผ ์ค„์ด๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ใ…‡ ใ…›์ฒญ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

3. ์›นํŒฉ(webpack)์‚ฌ์šฉ

๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ css์™€ jsํŒŒ์ผ์„ ๋ฒˆ๋“ค๋ง(ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ฌถ๋Š”๋‹ค.)ํ•ด ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

4. Gzip ์‚ฌ์šฉ

  • Gzip ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฆฌ์†Œ์Šค ์••์ถ•
  • ์ด๋ฏธ์ง€๋‚˜ pdf๋Š” ์ด๋ฏธ ์••์ถ•๋œ ํŒŒ์ผ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

5. js ์••์ถ•

UglifyJS ์‚ฌ์šฉํ•˜์—ฌ js ํŒŒ์ผ์„ ์••์ถ•ํ•œ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์ด๋‚˜ ์ค„๋ฐ”๊ฟˆ์„ ์ œ๊ฑฐ -> ํŒŒ์ผ์šฉ๋Ÿ‰ ๊ฐ์†Œ

6. CDN

์œ ์ €์—๊ฒŒ ๋งŽ์€ ์ฝ˜ํŠผ์ธ ๋ฅผ ์†์‹ค์—†์ด ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์„œ๋น„์Šค

  • ๋Œ€์šฉ๋Ÿ‰ ์ฝ˜ํ…์ธ  ๋‹ค์šด ๋˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ์— ์‚ฌ์šฉ
  • ์‚ฌ์šฉํ•œ ๋งŒํผ ๋น„์šฉ ์ง€๋ถˆ

7. ์บ์‹ฑ

html,css,js,image ์ฒซ ์š”์ฒญ์‹œ ๋‚ด๋ ค ๋ฐ›์€ ๋’ค ํŠน์ • ์œ„์น˜์— ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๊ณ  ์ดํ›„ ๋™์ผํ•œ URI์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด ์™”์„ ๋•Œ ์ด์ „์— ์ €์žฅํ•ด๋‘” ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋”๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•  ํŒŒ์ผ ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๋ฏ€๋กœ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ ๋‹ค.

React: Redux, Flux Pattern

Redux, Flux Pattern

Redux๋ž€?

๋ฆฌ๋•์Šค๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž„

๋ฆฌ๋•์Šค๋Š” ์™œ ์ƒ๊ฒจ๋‚ฌ์„๊นŒ?

๋ฆฌ๋•์Šค๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „ ํ”„๋ก ํŠธ์—”๋“œ์ชฝ์—์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ MVC ํŒจํ„ด์ด์—ˆ์Œ
MVC ํŒจํ„ด์€ Flux Pattern๊ณผ ๋‹ฌ๋ฆฌ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
์ฆ‰, ๋ชจ๋ธ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ทฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ , ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ ‰์…˜์„ ํ†ตํ•ด ๋ทฐ์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ๋ชจ๋ธ๋„ ๋ณ€๊ฒฝ๋จ
์ด๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ์ปค์ง€๋ฉด ๋ฌธ์ œ๊ฐ€ ๋จ -> ์™œ๋ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง(๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ : ํŽ˜๋ถ - ์•Œ๋žŒ ์ •๋ณด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์•ˆ ๋˜์–ด ์•Œ๋žŒ ํ‘œ์‹œ ๊ณ„์† ์œ ์ง€)

MVC Pattern
  • Model : ๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•จ
    ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด, ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ์ •๋ณด๋“ค์˜ ๊ฐ€๊ณต์„ ํ•˜๋Š” ๋ถ€๋ถ„์ž„

  • View : ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•จ
    ์˜ˆ๋ฅผ ๋“ค๋ฉด input, ์ฒดํฌ๋ฐ•์Šค ํ•ญ๋ชฉ ๋“ฑ์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ ๋“ฑ์ด ์žˆ์Œ
    ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•จ

  • Controller : ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.
    Model(๋ฐ์ดํ„ฐ), View(UI)๋ฅผ ์ž‡๋Š” ์—ญํ• ์„ ํ•จ
    ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ž„

๋•Œ๋ฌธ์— 2014๋…„ ํŽ˜์ด์Šค๋ถ์—์„œ ์ด์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ Flux๋ผ๋Š” ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๊ฐœ๋ฐœํ•จ

Flux Pattern์ด๋ž€?

MVC ํŒจํ„ด์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด
MVC ํŒจํ„ด๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
๋˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์šฉ์ดํ•˜๊ณ  ํ๋ฆ„์ด ์˜ˆ์ธก๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Œ

Flux Pattern ๋™์ž‘ ์›๋ฆฌ

์—ญํ• 

Action
๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ํ–‰์œ„
Action creator ํ•จ์ˆ˜๋Š” Action์˜ type๊ณผ payload(๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ)๋ฅผ ๋ฆฌํ„ดํ•จ

Dispatcher
๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•จ
Store์˜ ์กฐ์ž‘์€ Dispatcher๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•จ

Store
๋ฐ์ดํ„ฐ(์ƒํƒœ) ์ €์žฅ์†Œ์ž„(MVC ํŒจํ„ด์˜ Model ๊ฐ™์€ ์—ญํ• )
์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
View์—๊ฒŒ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ์•Œ๋ ค์คŒ

View
๋ฐ์ดํ„ฐ(์ƒํƒœ)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ™”๋ฉด์„ ๋ฆฌ๋ Œ๋”๋งํ•จ

๋™์ž‘ ๋ฐฉ์‹
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•จ
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๊ธฐ๋ฐ˜ํ•œ Action์„ Dispacher์— ์ „๋‹ฌ
  • Dispatcher๋Š” Store์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•ด ๋ณ€๊ฒฝํ•จ
  • ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ View์— ๋ฐ˜์˜ํ•จ

2018๋…„, Dan Abramov์— ์˜ํ•ด React + flux ๊ตฌ์กฐ์— Reducer๋ฅผ ๊ฒฐํ•ฉํ•œ Redux๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋จ

์™œ Flux pattern์ด ๋‚˜์™”์Œ์—๋„ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?
  • Flux๋Š” Store๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฆฌ๋•์Šค๋Š” ํ•˜๋‚˜์˜ Store๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฆฌ๋•์Šค์˜ Store ์•ˆ์—๋Š” Reducer๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์–ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฆฌ๋•์Šค๋Š” ๋‹ค์–‘ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌ๋•์Šค๋Š” Flux์— ๋น„ํ•ด ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•จ

Redux์˜ ์ƒํƒœ๊ด€๋ฆฌ ์ˆœ์„œ

- ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ -> ๋ณ€๊ฒฝ๋  ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด Action ๊ฐ์ฒด ์ƒ์„ฑ
- Dispatch ํ•จ์ˆ˜๋Š” Action ๊ฐ์ฒด๋ฅผ Reducer ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•จ
- Reducer ํ•จ์ˆ˜๋Š” Action ๊ฐ์ฒด์˜ ๊ฐ’์„ ํ™•์ธํ•ด ์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ Store์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•จ
- ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด React๋Š” ๋ฆฌ๋ Œ๋”๋ง์„ ํ•จ

  • Store: state๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ์ €์žฅ์†Œ

  • Reducer : Dispatch์—์„œ ์ „๋‹ฌ๋ฐ›์€ Action ๊ฐ์ฒด์˜ type ๊ฐ’์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ•จ์ˆ˜

  • Action :

    • ์–ด๋–ค ์•ก์…˜์„ ์ทจํ•  ๊ฒƒ์ธ์ง€ ์ •์˜ํ•ด ๋†“์€ type์ด ํ•„์ˆ˜๋กœ ์ง€์ •๋œ ๊ฐ์ฒด
    • ๋ณดํ†ต Action ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜ Action Creator๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ
  • Dispatch : Action ๊ฐ์ฒด๋ฅผ Reducer๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

์ฐธ๊ณ 

NetWork: cookie, session, web storage

cookie, web storage, session

์ฟ ํ‚ค, ์›น์Šคํ† ๋ฆฌ์ง€(๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€), ์„ธ์…˜

์ฟ ํ‚ค์™€ ์›น์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์ƒ๊ธด ์ด์œ 

HTTP ํ”„๋กœํ† ์ฝœ์€ ๋ฌด์ƒํƒœ(stateless)๋ผ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง
๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ๋งŒ์œผ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์Œ
๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—… ๋“ฑ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ๊น€

๋ฌด์ƒํƒœ
์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ์‚ฌ์ดํด์ด ๋๋‚˜๊ณ  ๋‚˜๋ฉด ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ ธ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ํŠน์„ฑ

Cookie

  • ์ฟ ํ‚ค ํ•˜๋‚˜๋‹น ์ตœ๋Œ€ 4KB๊นŒ์ง€ ์‚ฌ์šฉ๊ฐ€๋Šฅ. ์‚ฌ์ดํŠธ ํ•˜๋‚˜ ๋‹น ์•ฝ 20์—ฌ๊ฐœ๋ฅผ ํ—ˆ์šฉํ•จ(๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฆ„).
  • ์ฟ ํ‚ค ์ƒ์„ฑ ๋‹จ์œ„๋Š” ๋ธŒ๋ผ์šฐ์ €(๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ์ƒ์„ฑ๋œ ์ฟ ํ‚ค๋Š” ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ)
  • ๋ฌธ์ž์—ด๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ
  • ์„œ๋ฒ„๊ฐ€ response header์— set-cookie ์— ๋‚ด์šฉ์„ ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์•ˆ์— ์ €์žฅํ•จ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋”ฐ๋กœ ์š”์ฒญํ•˜์ง€ ์•Š์•„๋„ ๋งค ์š”์ฒญ์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ request header์— ์ฟ ํ‚ค๋ฅผ ๋„ฃ์–ด ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•จ
  • expires(์œ ํšจ์ผ์ž)๋‚˜ max-age(๋งŒ๋ฃŒ ๊ธฐ๊ฐ„) ์˜ต์…˜์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํž ๋•Œ ์ฟ ํ‚ค๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ(์„ธ์…˜์ฟ ํ‚ค)
  • expires(์œ ํšจ์ผ์ž)๋‚˜ max-age(๋งŒ๋ฃŒ ๊ธฐ๊ฐ„) ์˜ต์…˜์ด ์ง€์ •๋˜์–ด์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•ด๋„ ์ฟ ํ‚ค๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์Œ
  • secure : ์ด ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด HTTPS๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋จ
  • samesite : ์š”์ฒญ์ด ์™ธ๋ถ€ ์‚ฌ์ดํŠธ์—์„œ ์ผ์–ด๋‚  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„์คŒ. csrf ๊ณต๊ฒฉ์„ ๋ง‰๋Š”๋ฐ ์œ ์šฉํ•จ
  • httpOnly : ์ด ์˜ต์…˜์„ ์„ค์ •ํ•œ ์ฟ ํ‚ค๋Š” document.cookie๋กœ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋จ -> ํฌ๋กœ์Šค์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(xss) ๊ณต๊ฒฉ ๋ฐฉ์ง€
  • ์‚ฌ์šฉ๋ชฉ์  : ์„ธ์…˜๊ด€๋ฆฌ(์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผํ•  ๋กœ๊ทธ์ธ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๊ฒŒ์ž„ ์ ์ˆ˜ ๋“ฑ์˜ ๊ด€๋ฆฌ), ๊ฐœ์ธํ™”(์‚ฌ์šฉ์ž ํ…Œ๋งˆ, ์„ ํ˜ธ ๋“ฑ), ํŠธ๋ž˜ํ‚น
  • ์‚ฌ์šฉ ์˜ˆ์‹œ : ์•„์ด๋”” ์ €์žฅ, ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€, ์ผ์ฃผ์ธ๊ฐ„ ๋‹ค์‹œ๋ณด์ง€ ์•Š๊ธฐ์ฐฝ, ์ตœ๊ทผ ๊ฒ€์ƒ‰ ์ƒํ’ˆ๊ด‘๊ณ ์—์„œ ์ถ”์ฒœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ

Web Storage(local storage, session storage)

web storage๊ฐ€ ์ƒ๊ธด ์ด์œ 

HTML5๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ถ”๊ฐ€๋œ ์ €์žฅ์†Œ
๊ธฐ์กด์— ์‚ฌ์šฉ๋˜๋˜ ์ฟ ํ‚ค๋Š” ์šฉ๋Ÿ‰์ œํ•œ์ด ์žˆ์–ด ๋งŽ์€ ์–‘์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ œํ•œ์ ์ด์—ˆ์Œ
๋˜ํ•œ ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์˜ ๋ชจ๋“  ์š”์ฒญ์—์„œ HTTP ํ—ค๋”์— ํฌํ•จ๋˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์คŒ
์ด๋Ÿฌํ•œ ์ฟ ํ‚ค์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜์—ฌ ๋‚˜์˜จ ๊ฒŒ ์›น์Šคํ† ๋ฆฌ์ง€์ž„

  • Local Storage

    • ๋ธŒ๋ผ์šฐ์ €๋‚˜ os๋ฅผ ์ข…๋ฃŒํ•ด๋„ ๊ณ„์† ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด ์žˆ์Œ
    • ์˜ค๋ฆฌ์ง„์ด ๊ฐ™์€ ๊ฒฝ์šฐ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  ํƒญ๊ณผ ์ฐฝ์—์„œ ๊ณต์œ ๋จ
    • ์‚ฌ์šฉ ์˜ˆ์‹œ : ์ง€์†์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ(์ž๋™ ๋กœ๊ทธ์ธ)
  • Session Storage

    • ํ˜„์žฌ ๋–  ์žˆ๋Š” ํƒญ ๋‚ด์—์„œ๋งŒ ์œ ์ง€๋จ(๊ฐ ํƒญ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€๋จ)
    • ์˜ˆ์™ธ : ํ•œ ํƒญ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ iframe์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      ex: ํ•œ ํƒญ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‡ผํ•‘ ์‚ฌ์ดํŠธ๋ฅผ iframe์œผ๋กœ ์—ด์—ˆ์Œ -> ๋ชจ๋“  iframe์€ ๋™์ผํ•œ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ๊ณต์œ ํ•จ -> ์™œ๋ƒ๋ฉด ๊ฐ™์€ ํƒญ๋‚ด์— ์žˆ๋Š” iframe๋“ค์€ ๋™์ผํ•œ ์˜ค๋ฆฌ์ง„์—์„œ ์™”๋‹ค๊ณ  ๋ณด๊ธฐ ๋•Œ๋ฌธ์ž„
    • ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์ง€๋งŒ ์œˆ๋„์šฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํƒญ์„ ๋‹ซ์„ ๊ฒฝ์šฐ ์ œ๊ฑฐ๋จ
    • ์‚ฌ์šฉ ์˜ˆ์‹œ : ์ผ์‹œ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ(์ผํšŒ์„ฑ ๋กœ๊ทธ์ธ ์ •๋ณด, ์ž…๋ ฅํผ ์ €์žฅ ๋“ฑ)

๋ธŒ๋ผ์šฐ์ €์—์„œ ํƒญ ์ด๋™ ํ˜น์€ ํƒญ ์ข…๋ฃŒ ์‹œ์—๋Š” ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ผ์น˜๋‚˜์š”?

ํƒญ ์ด๋™ ์‹œ : ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€๋Š” ๋™์ผํ•œ ํƒญ ๋‚ด์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ
ํƒญ ์ข…๋ฃŒ ์‹œ : ๋ธŒ๋ผ์šฐ์ €์—์„œ ํƒญ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํƒญ์— ์—ฐ๊ฒฐ๋œ ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œ๋จ
๋”ฐ๋ผ์„œ ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€์—๋Š” ์ผ์‹œ์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•จ

Session

์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•œ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋๋‚ด๋Š” ์‹œ์ ๊นŒ์ง€ ๊ฐ™์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์ผ๋ จ์˜ ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๊ณ  ๊ทธ ์ƒํƒœ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ 

์ฆ‰, ํด๋ผ์ด์–ธํŠธ ๋ณ„๋กœ ๊ฐ๊ฐ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ž„

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํด๋ผ์ด์–ธํŠธ ๋ณ„๋กœ ์„ธ์…˜ID๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์„ธ์…˜์„ ์œ ์ง€ํ•จ
  • ์ ‘์† ์‹œ๊ฐ„์— ์ œํ•œ์„ ๋‘์–ด ์ผ์ • ์‹œ๊ฐ„ ์‘๋‹ต์ด ์—†๋‹ค๋ฉด ์ •๋ณด๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ฒŒ ์„ค์ •๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋จ -> ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
  • ์ฟ ํ‚ค์— ๋น„ํ•ด ๋ณด์•ˆ์ ์ธ ๋ฉด์—์„œ ์ข€๋” ๋‚˜์Œ(์ฟ ํ‚ค๋Š” ์ค‘๊ฐ„์— ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ)
  • ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ๋งŒ๋ฃŒ๊ธฐํ•œ์— ์ƒ๊ด€์—†์ด ์ข…๋ฃŒ๋จ
์„ธ์…˜ ๋™์ž‘๋ฐฉ์‹

(ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์š”์ฒญํ•œ๋‹ค๊ณ  ๊ฐ€์ •)
์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ์„ธ์…˜ ์ƒ์„ฑํ•จ
๊ทธ ํ›„ ์„ธ์…˜ID๋ฅผ ๋‹ด์€ ์ฟ ํ‚ค ์ƒ์„ฑ -> HTTP ํ—ค๋”์— Set-Cookie ์˜ต์…˜์„ ํ†ตํ•ด ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ณด๋ƒ„
-> ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•จ

(ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ ํ›„ ๋งˆ์ดํŽ˜์ด์ง€๋กœ ์ด๋™ํ•จ๏ฟฝ)
ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋ฅผ ๊บผ๋‚ด HTTP ์š”์ฒญ์— ์ฟ ํ‚ค๋ฅผ ๋‹ด์•„ ์ „์†กํ•จ -> ์„œ๋ฒ„๋Š” HTTP ์š”์ฒญ์— ๊ฐ™์ด ๋‹ด๊ฒจ์˜จ ์ฟ ํ‚ค๋ฅผ ์ฝ์–ด ์ฟ ํ‚ค ์•ˆ์˜ ์„ธ์…˜ ID๋ฅผ ํ™•์ธํ•ด ์„ธ์…˜ ์ •๋ณด ์กฐํšŒ -> ์„ธ์…˜ ์ •๋ณด์— ์žˆ๋Š” ์‚ฌ์šฉ์ž id ๋“ฑ์˜ ์‹๋ณ„ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•จ -> ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ„

[React] React.memo, useCallback, useMemo

useCallback, useMemo, React.memo

React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•œ ๋’ค ์ด์ „ ๋ Œ๋”๋œ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜์—ฌ Dom ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
์žฌ๋ Œ๋”๊ฐ€ ํ•„์š”์—†๋Š” ์ปดํฌ๋„ŒํŠธ ์˜ ๋ Œ๋”๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ์˜ ์†๋„๋ฅผ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค. (=์ตœ์ ํ™”)

์ตœ์ ํ™” ํ•˜๋Š” ์ด์œ 

์“ธ๋ฐ์—†๋Š” ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค.
์“ธ๋ชจ์—†๋Š” ๋ Œ๋”๋ง์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

  • ๋ฆฌ์•กํŠธ ์ตœ์ ํ™” = ๋ Œ๋”๋ง์„ ์ตœ์ ํ™” ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ Œ๋”๋ง ์ด๋ž€?

  1. props๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ
  2. state๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ
  3. forceUpdate()๋ฅผ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ
  4. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜์—ˆ์„๋•Œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋œ๋‹ค.

์ตœ์ ํ™” ๋ฐฉ๋ฒ•

React.memo, useCallback, useMemo๋Š” memoization ๊ฐœ๋…์„ ํ™œ์šฉํ•œ๋‹ค.

memoization : ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒƒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ๋’€๋‹ค๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์“ด๋‹ค.

React.memo

์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ธฐ์–ตํ•œ๋‹ค.
๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ ์ด๋‹ค. (Highter Order Component)

๊ณ ์ฐจ์ปดํฌ๋„ŒํŠธ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ›์•„ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

React.memo๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ›์•„ ์ž์‹ ์˜ props๊ฐ€ ๋ฐ”๋€”๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ props๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋ฉด React.memo๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ Œ๋”๋ง ๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

const MyComponent = React.memo(function MyComponent(props) {
  /* props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง */
})



function MyComponent(props) {
  /* props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง */
}
function areEqual(prevProps, nextProps) {
  /*
  nextProps๊ฐ€ prevProps์™€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜
  */
}
export default React.memo(MyComponent, areEqual);

์ž์‹ ์ปดํฌ๋„ŒํŠธ์— React.memo๋ฅผ ์ ์šฉํ•ด ์ตœ์ ํ™” ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ state๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ž์‹์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋ ๋•Œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ์ฒด(ํ•จ์ˆ˜๋„ ๊ฐ์ฒด)๋Š” ์žฌ์ƒ์„ฑ๋œ๋‹ค.
๊ฐ์ฒด๋Š” ์ฐธ์กฐํ˜• ํƒ€์ž…์ด๋ฏ€๋กœ ์ฃผ์†Œ๊ฐ’์„ ํ†ตํ•ด ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ๋œ๋‹ค.

useCallback

ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
useCallback์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const memoizedCallback = useCallback(()=>{
	doSomething(a,b)
},[a,b])
const memoizedCallback = useCallback(fn, deps)

deps(์˜์กด์„ฑ๋ฐฐ์—ด)์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ์žฌ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†์„ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋ฏ€๋กœ ๋นˆ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

useMemo

๊ฐ’์„ ๊ธฐ์–ตํ•œ๋‹ค.
Component๋Š” state๊ฐ€ ๋ณ€ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ํ•œ๋‹ค. ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— useMemo๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

React: SSR, CSR, SSG

SSR, CSR, SSG

SSR, CSR, SSG, ๋ชจ๋‘ ๋‹ค ์›นํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹๋“ค์ž„
ํฌ๊ฒŒ CSR(Client Side Rendering)๊ณผ SSR(Server Side Rendering)์œผ๋กœ ๋‚˜๋‰จ. ์ด์™ธ์—๋„ SSG์™€ ISR๋ผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ
์ด๊ฑธ ์–˜๊ธฐํ•˜๊ธฐ ์ „์— ์—ฐ๊ด€๋˜๋Š” ๊ฐœ๋…์œผ๋กœ SPA์™€ MPA์— ์•Œ์•„์•ผ ํ•จ

SPA, MPA

SPA(single page application)

  • ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค(HTML, CSS, Javascript ๋“ฑ)์„ ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œ ํ•จ. ๊ทธ ํ›„ ์ƒˆ๋กœ์šด ์š”์ฒญ์ด ์žˆ์„ ๋•Œ ์„œ๋ฒ„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•ด ๋ฐ›์•„์„œ ํŽ˜์ด์ง€๋ฅผ ๊ฐฑ์‹ ํ•จ
  • ๊ฒฐ๊ตญ SPA๋ฅผ CSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋งํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ(ํ•˜์ง€๋งŒ SPA๊ฐ€ ์ „๋ถ€ CSR ๋ฐฉ์‹์€ ์•„๋‹˜)
// ์˜ˆ์‹œ
<html>
<head>
  <title>Single Page Application</title>
  <link rel="stylesheet" href="app.css" type="text/css">
</head>
<body>
  <div id="app"></div>
  <script src="app.js"></script>
</body>
</html>

์žฅ์ 

  • ์ตœ์ดˆ ๋ Œ๋”๋ง๏ฟฝ์„ ์ œ์™ธํ•˜๊ณ  ์ดํ›„ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊นœ๋นก ๊ฑฐ๋ฆผ ์—†์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ๋กœ๋”ฉ
  • ์„œ๋ฒ„์˜ ํ…œํ”Œ๋ฆฟ ์—ฐ์‚ฐ์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„์‚ฐ ๊ฐ€๋Šฅ
  • ์ปดํฌ๋„ŒํŠธ๋ณ„ ๊ฐœ๋ฐœ ์šฉ์ด

๋‹จ์ 

  • ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„ ๋Š๋ฆผ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ฒˆ๋“ค๋งํ•ด์„œ ํ•œ ๋ฒˆ์— ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆผ -> ํฐ ๊ทœ๋ชจ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ(code splitting) ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•จ
  • SEO์— ๋ถˆ๋ฆฌํ•จ -> ์™œ๋ƒ๋ฉด ๊ฒ€์ƒ‰์—”์ง„์ด ์ƒ‰์ธ์„ ํ•  ๋งŒํ•œ ์ปจํ…์ธ ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด HTML ๋ฌธ์„œ์— ์—†๊ธฐ ๋•Œ๋ฌธ

MPA(multiple page application)

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ์ด๋ฃจ์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
  • MPA๋Š” SSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋งํ•จ
    ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ๋ฏธ๋ฆฌ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์„œ๋ฒ„์—์„œ ๋ณด๋ƒ„

์žฅ์ 

  • SEO์— ์œ ๋ฆฌ
    ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ HTML ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „์†ก๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ž„. ๊ฒ€์ƒ‰์—”์ง„์ด ํŽ˜์ด์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์ ํ•ฉํ•จ

  • ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„๊ฐ€ ๋น ๋ฆ„
    ์„œ๋ฒ„์—์„œ ์ด๋ฏธ ๋ Œ๋”๋งํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž„. ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€ ํด๋ฆญ ์›นํŽ˜์ด์ง€์™€์˜ ์ธํ„ฐ๋ ‰์…˜์€ ๋˜์ง€ ์•Š์Œ

๋‹จ์ 

  • ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๏ฟฝ๋ฆฌ๋ Œ๋”๋งํ•จ -> ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ๊นœ๋นก์ž„์ด ๋ฐœ์ƒ -> CSR์— ๋น„ํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜X
  • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๋ถˆํ•„์š”ํ•œ ํ…œํ”Œ๋ฆฟ๋„ ์ค‘๋ณตํ•ด์„œ ๋กœ๋”ฉ
  • ์„œ๋ฒ„ ๋ Œ๋”๋ง์— ๋”ฐ๋ฅธ ๋ถ€ํ•˜

CSR(Client Side Rendering)

React, Vue, Angular ๋“ฑ์ด CSR์„ ์‚ฌ์šฉํ•จ

  • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ์›นํŽ˜์ด์ง€ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋งํ•จ
  • ๋ชจ๋“  ๋กœ์ง, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ํ…œํ”Œ๋ฆฟ, ๋ผ์šฐํŒ…์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌ๋จ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ์˜ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ถ„ํ•  (code splitting)์„ ๊ณ ๋ คํ•ด์•ผํ•จ

๋™์ž‘ ๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์ดํŠธ ์ ‘์† -> ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•จ
  2. ์„œ๋ฒ„์—์„œ๋Š” ๋นˆ HTML ๋ฌธ์„œ(index.html)๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋ƒ„
    (์ด ๋•Œ ์•„๋ฌด ๋‚ด์šฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋Š” ์ดˆ๊ธฐ์— ๋นˆ ํ™”๋ฉด๋งŒ ๋ณด์ผ ๊ฒƒ์ž„)
  3. index.html์— ๋งํฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์š”์ฒญํ•œ ํ›„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ์‹คํ–‰ํ•จ.
  4. ๋ฐ›์•„์˜จ ๊ฒƒ๋“ค์„ ํ•ฉ์ณ ๋™์  HTML์„ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉ์ž๋“ค์ด ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ธํ„ฐ๋ ‰์…˜๋„ ๊ฐ€๋Šฅํ•จ. TTV(time to view)์™€ TTI(time to interact)๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚จ

์žฅ์ 

  • ํ›„์† ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋” ๋น ๋ฆ„
    ์ด๋ฏธ ๋ชจ๋“  ํŒŒ์ผ์„ ์‚ฌ์ „์— ๋กœ๋“œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— csr์˜ ๋กœ๋“œ์‹œ๊ฐ„์ด ์ค„์–ด๋“ฆ

  • ํŽ˜์ด์ง€ ์ด๋™์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์งง์Œ
    ํŽ˜์ด์ง€ ์ตœ์ดˆ ์ ‘๊ทผ ์‹œ์— ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ์ •์  ๋ฆฌ์†Œ์Šค์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ์‹œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€๋กœ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ๋˜๋ฏ€๋กœ ํŽ˜์ด์ง€ ์ด๋™์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์งง์Œ

๋‹จ์ 

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

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋–„๊นŒ์ง€ ๋นˆ ํ™”๋ฉด(ํ˜น์€ ๋กœ๋”ฉ) ํ‘œ์ถœ
    CSR ๋ฐฉ์‹์€ ๋ฒˆ๋“ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„ API์‘๋‹ต์„ ๋ฐ›์•„์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ๋นˆ ํ™”๋ฉด(ํ˜น์€ ๋ณ„๋„๋กœ ์„ค์ •ํ•œ ๋กœ๋”ฉํ™”๋ฉด ๋“ฑ)์ด ํ‘œ์ถœ๋จ
    API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ํ›„, ํ™”๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๋ฉด ํ™”๋ฉด์—์„œ ์ธํ„ฐ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•จ

  • SEO ๋น„์นœํ™”์ 
    ๊ฒ€์ƒ‰ ์—”์ง„์ด ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ฒ˜์Œ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋นˆ ํŽ˜์ด์ง€(index.html์ด ๋น„์–ด์žˆ์Œ)์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํŽ˜์ด์ง€์ธ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ

SSR(Server Side Rendering)

Next,js, PHP, ASP๋“ฑ์ด SSR์„ ์‚ฌ์šฉํ•จ

๋™์ž‘ ๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์ดํŠธ์— ์ ‘์† -> ํŠน์ • ํŽ˜์ด์ง€ ์š”์ฒญ
  2. ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ด๋ฏธ ๋ Œ๋”๋ง๋œ HTML ํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•จ
  3. ํด๋ผ์ด์–ธํŠธ๋Š” HTMLํŒŒ์ผ์„ ๋ฐ›์•„์˜ด. ์ด๋ฏธ ๋ Œ๋”๋ง๋œ ํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ(TTV) ์•„์ง ํด๋ฆญ ๋“ฑ์˜ ์ธํ„ฐ๋ ‰์…˜์€ ํ•  ์ˆ˜ ์—†์Œ(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์˜ค์ง€ ์•Š์•„์„œ)
  4. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์™€ ์‹คํ–‰ํ•จ
  5. ํŽ˜์ด์ง€ ์ธํ„ฐ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•ด์ง(TTI)
    -> TTV์™€ TTI ์‚ฌ์ด์˜ ๊ณต๋ฐฑ์ด ์žˆ์Œ

์žฅ์ 

  1. ์ตœ์ดˆ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ์งง์Œ
    ์š”์ฒญํ•œ ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๋‹ค์šด๋กœ๋“œํ•ด ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ด ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์งง์Œ

  2. SEO์— ์œ ๋ฆฌํ•จ
    ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์™„์„ฑ๋œ HTML ๋ฌธ์„œ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Œ -> ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”์— ์œ ๋ฆฌํ•จ

๋‹จ์ 

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ธํ„ฐ๋ ‰์…˜ ๋ถˆ๊ฐ€๋Šฅํ•จ
    SSR๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋นจ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€๋Š” ํด๋ฆญ ๋“ฑ์˜ ์ธํ„ฐ๋ ‰์…˜์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
    ๋งŒ์•ฝ ์ธํ„ฐ๋ ‰์…˜ ๊ฐ€๋Šฅ ์‹œ์  ์ด์ „์— ๋ฒ„ํŠผ ํด๋ฆญ ๋“ฑ์˜ ์ž‘์—…์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์ธํ„ฐ๋ ‰์…˜ ๊ฐ€๋Šฅ ์‹œ์ ๊นŒ์ง€ ํ•ด๋‹น ๋™์ž‘์˜ ์ˆ˜ํ–‰์€ ๋ณด๋ฅ˜๋จ

  2. ๊นœ๋นก์ž„ ์ด์Šˆ
    ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ „์ฒด ์›นํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊นœ๋นก์ž„ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•จ -> ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ข‹์ง€ ์•Š์Œ

  3. ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜
    ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ธํ„ฐ๋ ‰์…˜์ด ๋งŽ์ด ์ผ์–ด๋‚˜๊ณ  ์ด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•ด ๋ฐ›์•„์™€์„œ HTML์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ

SSG(Static Site Generation)

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

ISR(Incremental Static Regeneration)

  • ์ด๋ฏธ ์ƒ์„ฑ๋œ ์›น์— ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • SSG๋Š” ๋นŒ๋“œ ์‹œ์— ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค์‹œ ๋นŒ๋“œ๋ฅผ ํ•ด์•ผํ•˜์ง€๋งŒ ISR์€ ๋นŒ๋“œํ•œ ์ดํ›„์—๋„ ์ •์ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜์žˆ์Œ
  • ex: Next.js 13 ๋ฒ„์ „ ์ดํ•˜ : getStaticProps , getServersideProps, 13 ์ด์ƒ ๋ฒ„์ „ : fetch์™€ cache ์‚ฌ์šฉ
fetch์™€ cache ์˜ˆ์‹œ
const res = await fetch(
    `https://api.themoviedb.org/3/${
      genre === 'fetchTopRated' ? 'movie/top_rated' : 'trending/all/week'
    }?api_key=${API_KEY}&language=en-US&page=1`,
    { next: { revalidate: 10000 } },
  );
  
  const data = await res.json();
  const results = data.results;

Web : ์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ž€?

์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์ดํŠธ์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์ž์› ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•จ
์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ UX(์‚ฌ์šฉ์ž ๊ฒฝํ—˜)์„ ๊ฐœ์„ ํ•˜๊ณ  SEO์—๋„ ์˜ํ–ฅ์„ ์คŒ

์‹ค์ œ๋กœ ๊ตฌ๊ธ€์—์„œ ํ–ˆ๋˜ ์œ ์ € ์ดํƒˆ๋ฅ ์— ๊ด€ํ•œ ์กฐ์‚ฌ๋ฅผ ๋ณด๋ฉด ๋กœ๋”ฉ ์‹œ๊ฐ„์ด 3์ดˆ ์ด์ƒ์ด๋ฉด ์›น ์„œ๋น„์Šค์˜ 33ํผ์„ผํŠธ๋‚˜ ์ดํƒˆ๋ฅ ์ด ์ฆ๊ฐ€ํ•จ

์ด๋Ÿฐ ์„œ๋น„์Šค์  ๊ด€์ ๊นŒ์ง€ ๊ณ ๋ คํ•ด ์›น ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•จ

Google์˜ Core Web Vital

๊ทธ๋Ÿฌ๋ฉด ์›น์‚ฌ์ดํŠธ์˜ ์„ฑ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
์ด์— ๊ด€ํ•œ ์ธก์ • ์ง€ํ‘œ๋กœ ๊ตฌ๊ธ€์˜ core web vitals๋ฅผ ์‚ฌ์šฉํ•จ

  1. LCP(์ตœ์ดˆ ์ฝ˜ํ…์ธ  ๋ Œ๋”๋ง ์‹œ๊ฐ„, Largest Contentful Paint)

  • LCP๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋œปํ•จ
  • ์ž์„ธํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ์š”์ฒญํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๊ฐ€์žฅ ํฐ ์‹œ๊ฐ ์ฝ˜ํ…์ธ  ์š”์†Œ(ex: ์ด๋ฏธ์ง€, ๋น„๋””์˜ค, ํฐ ๋ธ”๋ก ์ˆ˜์ค€์˜ ํ…์ŠคํŠธ ๋“ฑ)๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋งํ•จ
  • ์ด ์ธก์ •ํ•ญ๋ชฉ์€ ๋ฐฉ๋ฌธ์ž๊ฐ€ URL์ด ์‹ค์ œ๋กœ ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ์†๋„๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ์ค‘์š”ํ•จ
  • ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€ ์ฒซ 2.5์ดˆ ์•ˆ์— LCP๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ์ด์ƒ์ ์ž„
  1. CLS(๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ ํšŸ์ˆ˜, Cumulative Layout Shift)

  • ์›นํŽ˜์ด์ง€์˜ ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ์„ ์ธก์ •ํ•จ
  • ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ๋ฐฉ๋ฌธํ•œ ํ›„ ์ƒ์ฃผํ•œ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์ธก์ •ํ•˜๊ณ , ํ•ด๋‹น ์‹œ๊ฐ„ ๋™์•ˆ ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฐ ๊ฐœ๋ณ„์ ์ธ ๋ ˆ์ด์•„์›ƒ ์š”์†Œ๋“ค์˜ ๋ณ€ํ™”๊ฐ€ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ธก์ •ํ•จ
  • ์ˆซ์ž๊ฐ€ ํด์ˆ˜๋ก ๋ ˆ์ด์•„์›ƒ์ด ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„
  • ํŒ์—…๊ณผ ๊ฐ™์ด ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๋Š” ์š”์†Œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ํ‘œ์‹œ๋˜๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์žˆ๊ณ , ํŒ์—… ๋“ฑ์ด ๋งŽ์€ ๋‰ด์Šค ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ CLS๊ฐ’์ด ๋†’๊ฒŒ ํ‰๊ฐ€๋จ
  • CLS ์ ์ˆ˜๊ฐ€ 0.1 ๋ฏธ๋งŒ์ด ๋˜์–ด์•ผ ์ข‹์€ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ
  1. FID(์ฒซ ์ž…๋ ฅ ์ง€์—ฐ, First Input Delay) -> INP(ํŽ˜์ธํŠธ์— ๋Œ€ํ•œ ์ƒํ˜ธ์ž‘์šฉ, interaction to next paint)

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ Œ๋”๋ง์ด ๋ชจ๋‘ ๋๋‚œ ์›น์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์™€ ์ฒ˜์Œ ์ƒํ˜ธ์ž‘์šฉํ–ˆ์„ ๋•Œ๋ถ€ํ„ฐ(์–ด๋–ค ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋Š” ๋“ฑ) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์— ๋ฐ˜์‘ํ•  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ๋งํ•จ
  • ex: ๋„ค์ด๋ฒ„์— ์ ‘๊ทผ -> ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋ˆ„๋ฆ„ -> ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋ชจ๋‘ ๋กœ๋”ฉ๋  ๋•Œ๊นŒ์ง€ ๊ฒฝ๊ณผํ•˜๋Š” ์‹œ๊ฐ„ ์ธก์ •
  • ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋Š” ํŽ˜์ด์ง€์—์„œ ์ค‘์š”ํ•จ
  • FID๊ฐ€ 100ms ๋ฏธ๋งŒ์ด ๋˜์–ด์•ผ ์ด์ƒ์ ์ž„

๊ทธ๋Ÿฐ๋ฐ!!! ๊ตฌ๊ธ€์—์„œ 2023๋…„ 5์›” 10์ผ ์—…๋ฐ์ดํŠธ ํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ฅด๋ฉด 2024๋…„ 3์›”๋ถ€ํ„ฐ FID๊ฐ€ INP๋กœ ๋Œ€์ฒด ๋œ๋‹ค๊ณ  ํ•จ

์ด์œ  : ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ์˜ ์‹œ๊ฐ„๋ณด๋‹ค ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ์‚ฌ์šฉ์ž๋“ค์˜ ์ด์šฉ ์‹œ๊ฐ„ ์ค‘ 90%๊ฐ€ ์‚ฌ์šฉ๋จ. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์›น๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์‹œ์ž‘ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๋‹ค์Œ ํ”„๋ ˆ์ž„์ด ๊ทธ๋ ค์งˆ ๋–„๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์งง๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์ง. ์ฐธ๊ณ 

FID๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์™€ ์ฒ˜์Œ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ์˜ ์‹œ๊ฐ„๋งŒ ์ธก์ •ํ•จ. ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์ƒํ˜ธ์ž‘์šฉํ•œ ์‹œ๊ฐ„๋งŒ ๊ฐ€์ง€๊ณ ๋Š” ํŽ˜์ด์ง€ ์ „์ฒด์˜ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๋Œ€ํ‘œํ•  ์ˆ˜ ์—†์Œ.
๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์„ ๊ณ ๋ คํ•ด ํŽ˜์ด์ง€ ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๋Š๋ฆฐ ์ƒํ˜ธ์ž‘์šฉ๊ณผ, ์ƒํ˜ธ์ž‘์šฉ ์‹œ์ ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ฑฐ์ณ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์Œ ํ”„๋ ˆ์ž„์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€์˜ ์ „์ฒด ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” INP๋กœ ๋Œ€์ฒด๋˜๊ฒŒ ๋˜์—ˆ์Œ

INP(ํŽ˜์ธํŠธ์— ๋Œ€ํ•œ ์ƒํ˜ธ์ž‘์šฉ, interaction to next paint)

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

  • INP๊ฐ€ 200ms ๋ฏธ๋งŒ : ํŽ˜์ด์ง€ ์‘๋‹ต์„ฑ์ด ์ข‹์Œ
  • INP๊ฐ€ 200ms ์ดˆ๊ณผ ~ 500ms ๋ฏธ๋งŒ ๋˜๋Š” 500ms : ํŽ˜์ด์ง€ ์‘๋‹ต์„ฑ์ด ๊ฐœ์„ ๋˜์–ด์•ผ ํ•จ
  • INP๊ฐ€ 500ms ์ดˆ๊ณผ : ํŽ˜์ด์ง€ ์‘๋‹ต์„ฑ์ด ์ข‹์ง€ ์•Š์Œ

์ธก์ • ์ง€ํ‘œ๋ฅผ ํ† ๋Œ€๋กœ ์›น ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

  1. LCP
  1. LCP ๋ฆฌ์†Œ์Šค๊ฐ€ HTML์—์„œ ๋นจ๋ฆฌ ์ฐพ์•„์ ธ์•ผ ํ•จ
    ex: background-image๋ฅผ css์— ๋„ฃ์œผ๋ฉด css๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €๋Š” LCP ๋ฆฌ์†Œ์Šค(ex: ์ด๋ฏธ์ง€ ๋“ฑ)๋ฅผ ๋ชจ๋ฅด๊ฒŒ ๋จ -> HTML์˜ img ํƒœ๊ทธ ๋“ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์„œ ๋นจ๋ฆฌ LCP ๋ฆฌ์†Œ์Šค๊ฐ€ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ

  2. HTML์—์„œ LCP ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์•˜์œผ๋ฉด ์šฐ์„ ํ•ด์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ

  3. (๋ˆ์ด ๋งŽ์ด ๋“ค์ง€๋งŒ ํ™•์‹คํ•˜๊ฒŒ ๊ฐœ์„ ๋˜๋Š” ๋ฐฉ๋ฒ•) CDN ์‚ฌ์šฉ

์œ„์˜ ๊ฒƒ๋“ค์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

  • ์š”์†Œ์— src๋‚˜ srcset ์†์„ฑ์„ ์‚ฌ์šฉํ•ด HTML๋งŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋„ HTML์— ์žˆ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ์ดํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ํ™”๋ฉด ๋ Œ๋”๋ง์— ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ๋จ
  • SSR์„ ์‚ฌ์šฉํ•ด์„œ CSR์—์„œ์˜ ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ
    ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ํ™”๋ฉด์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ HTML ์ž‘์—…ํ•ด์„œ ๋ณด๋‚ด๋ฉด LCP์— ๋„์›€์ด ๋จ
  • ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ๋งŒ์•ฝ ์ด ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋ ค์•ผํ•˜๋Š” ์˜์—ญ์ด LCP๋ผ๋ฉด HTML ๋ถ€๋ถ„์— <Link rel="preload"> ์™€ ๊ฐ™์ด rel=preload๋ผ๋Š” ์†์„ฑ์„ ์ง€์ •ํ•ด์„œ ๋นจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Œ
  • LCP ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ๋  ํƒœ๊ทธ์— fetchpriority='high' ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ”๋กœ ๋ณด์—ฌ์•ผํ•  ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ(ex: ์Šคํฌ๋กคํ•ด์•ผ ๋ณด์ด๋Š” ์•„๋ž˜์ชฝ์— ์œ„์น˜ํ•œ ์ด๋ฏธ์ง€๋“ค)์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹น์žฅ ๋‹ค์šด๋กœ๋“œํ•ด์•ผํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ์ค„์–ด๋“ค์–ด LCP์— ๋„์›€์ด ๋จ
  1. CLS
  • ๋กœ๋“œ๋  ์ปจํ…์ธ ์˜ ํฌ๊ธฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์ฃผ๊ธฐ
    width, height ๊ฐ™์€ ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์Œ

๋ฐ˜์‘ํ˜• ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ •ํ™•ํ•œ ์ด๋ฏธ์ง€ ๋†’์ด๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์šฐ๋‹ˆ๊นŒ aspect-ratio๋ผ๋Š” ์†์„ฑ์„ ์ด์šฉํ•ด ๋น„์œจ๋กœ ์ด๋ฏธ์ง€ ๋†’์ด๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ์ข‹์Œ

์ปจํ…์ธ ๊ฐ€ ๋„ˆ๋ฌด ๋™์ ์ด์–ด์„œ ๋†’์ด๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค ์‹ถ์œผ๋ฉด(ex: ํ…์ŠคํŠธ ๊ธธ์ด์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ฐฐ๋„ˆ ๋“ฑ) min-height๋ผ๋„ ์ •ํ•ด์ค˜์„œ ์กฐ๊ธˆ์€ ์˜์—ญ์ด ๋ฐ€๋ฆฌ๋”๋ผ๋„ ์ตœ์†Œํ•œ์˜ ๋†’์ด๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒํ•ด์„œ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๊ธฐ

๋ฐฐ๋„ˆ๋‚˜ ๊ด‘๊ณ  ๋“ฑ์˜ ๋™์ ์ธ ์š”์†Œ์˜ ์ž๋ฆฌ๋ฅผ ๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” height, width ๋“ฑ์˜ ์†์„ฑ(์ด์™€ ๋น„์Šทํ•œ ์†์„ฑ๋„ ใ„ฑใ…Š)์„ ๋ฏธ๋ฆฌ ์ •ํ•ด์ฃผ๋ฉด CLS๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ -> ๋ฌผ๋ก  ๋ฏธ๋ฆฌ ์˜์—ญ์„ ํ™•๋ณดํ•ด๋‘” ์ž๋ฆฌ๋Š” ๋กœ๋”ฉ์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ ํ•˜์–—๊ฒŒ ๋จ -> ํ•˜์ง€๋งŒ ์ด๋ฏธ ์˜์—ญ์ด ํ™•๋ณด๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด‘๊ณ ๋‚˜ ๋ฐฐ๋„ˆ๋กœ ์ธํ•ด ์ปจํ…์ธ ๊ฐ€ ๋ฐ€๋ฆฌ์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋ ‰์…˜์„ ํ•  ํ™•๋ฅ ์ด ์ค„์–ด๋“ฆ
  • ์ฒ˜์Œ ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋  ๋•Œ animation, transition ๋“ฑ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฑด๋“œ๋Š” css๋Š” ์ง€์–‘ํ•˜๊ธฐ
  • bfcache๊ฐ€ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
    ๋’ค๋กœ๊ฐ€๊ธฐ๋‚˜ ์•ž์œผ๋กœ ๊ฐ€๊ธฐ๋ฅผ ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ํŽ˜์ด์ง€๋“ค์˜ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•ด๋†“์Œ -> ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋‹ค์‹œ x
    ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ bfcache๊ฐ€ ๋˜์ง€๋งŒ ๊ฐ€๋”๊ฐ€๋‹ค๊ฐ€ ๋ง‰์•„๋†“๋Š” ๊ณณ๋„ ์žˆ์œผ๋‹ˆ ์ฒดํฌํ•˜๊ธฐ
  1. FID
  • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ„๊ธฐ(์™œ๋ƒํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—”์ง„์€ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์ธ๋ฐ ์˜ค๋ž˜ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ง€์—ฐ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)
  • code splitting์„ ํ†ตํ•ด ํ†ต์งธ๋กœ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์• ๊ธฐ
    ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์—‡์ด ํ•„์š”ํ•œ ๊ฑด์ง€ ์•„๋‹Œ์ง€ ์•Œ๊ธฐ ์–ด๋ ค์›Œ์„œ ์ง€์†์ ์œผ๋กœ ๊ด€์ฐฐํ•˜๋ฉด์„œ ๊ด€๋ฆฌํ•ด์•ผํ•จ
    (๋ฐ๋ธŒํˆด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ธดํ•œ๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋ก ๋งŽ์•„์งˆ์ˆ˜๋ก ๋‹ฌ๋ผ์ง)
  • DOM ์‚ฌ์ด์ฆˆ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ
  • ํŠธ๋ž˜ํ‚น๋“ค์„ ์œ„ํ•œ ๋ถ„์„ํˆด์„ ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋Š๋ ค์ง -> ์ง€์†์ ์œผ๋กœ ๊ด€์ฐฐํ•ด์„œ ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ถ„์„ํˆด์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒœ๊ทธ๋“ค์„ ์ง€์šฐ๊ธฐ๏ฟฝ

React: useCallback, useMemo, React.memo

useCallback, useMemo, React.memo

useCallBack, useMemo, React.memo ์ฐจ์ด์ 

์„ธ ๊ฐœ ๋‹ค ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ›…์ž„
๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๋ฌด์—‡์„ ๋œปํ• ๊นŒ?

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

  • useCallback : ํ•จ์ˆ˜๋ฅผ ์บ์‹ฑ
  • useMemo : ๊ฐ’ ์ž์ฒด๋ฅผ ์บ์‹ฑ
  • React.memo : ์ปดํฌ๋„ŒํŠธ๋ฅผ ์บ์‹ฑ
    ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์ž์‹์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋จ
    ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ฐ”๋€ ๊ฒƒ์ด ์—†๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค๋ฉด ๋‚ญ๋น„์ผ ๊ฒƒ์ž„
    ๋”ฐ๋ผ์„œ react.memo๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ๊ฐ–๋‹ค๊ฐ€ ์”€
    ๋ถ€๋ชจ์˜ state ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด props์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ(์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜)

ShouldComponentUpdate

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋˜ ๋ฉ”์†Œ๋“œ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ž„
์ด๊ฒŒ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ useCallback, useMemo, React.memo๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Œ

JavaScript: ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€?

  • ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด๋ฅผ ๋งํ•จ.
  • ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์ฝœ์Šคํƒ์— ์Œ“์•„ ์˜ฌ๋ ธ๋‹ค๊ฐ€ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ „์ฒด ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•จ
์˜ˆ์‹œ

var a = 1;

function outer() {
    function inner() {
        console.log(a) // undefined
        var a = 3;
    }
    inner()
    console.log(a) // 1

}

outer()
console.log(1)

  1. ์ „์—ญ ์ปจํ…์ŠคํŠธ (Global Execution Context):
  • ๋ณ€์ˆ˜:
    • a: 1 (์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ ๋ฐ ํ• ๋‹น)
  • ํ•จ์ˆ˜:
    • outer: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜๋œ outer ํ•จ์ˆ˜
  1. outer ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ:
  • ๋ณ€์ˆ˜:
    • inner: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์œผ๋กœ ์ •์˜๋œ inner ํ•จ์ˆ˜ (ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋งŒ ๋Œ์–ด์˜ฌ๋ ค์ง)
  1. inner ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ:
  • ๋ณ€์ˆ˜:
    • a: undefined (๋ณ€์ˆ˜ ์„ ์–ธ์€ ํ˜ธ์ด์ŠคํŒ…์— ์˜ํ•ด ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ, ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— undefined๋กœ ์„ค์ •)

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

์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋‹ด๊ธฐ๋Š” ์ •๋ณด๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  • variableEnvironment : ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ ์‹๋ณ„์ž๋“ค์— ๋Œ€ํ•œ ์ •๋ณด + ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด, ์„ ์–ธ ์‹œ์ ์˜ LexicalEnvironment์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
  • LexicalEnvironment : ์ฒ˜์Œ์—๋Š” variableEnvironment์™€ ๊ฐ™์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋จ
  • ThisBinding : this ์‹๋ณ„์ž๊ฐ€ ๋ฐ”๋ผ๋ด์•ผ ํ•  ๋Œ€์ƒ ๊ฐ์ฒด

VariableEnvironment๊ณผ LexicalEnvironment์˜ ์ฐจ์ด์ 

  • VariableEnvironment๊ณผ LexicalEnvironment๋Š” ๋‘˜ ๋‹ค environmentRecord, outerEnvironmentReference๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ

environmentRecord(=Record)

  • ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•จ
  • ๊ธฐ๋กํ•˜๋Š” ์ •๋ณด : ํ•จ์ˆ˜์— ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‹๋ณ„์ž, ํ•จ์ˆ˜์ž์ฒด, var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์‹๋ณ„์ž ๋“ฑ
  • ๊ด€๋ จ ๊ฐœ๋…: #1 ์ค‘ ํ˜ธ์ด์ŠคํŒ…
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์‹๋ณ„์ž ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š”๋ฐ, ํ˜ธ์ด์ŠคํŒ…์€๋ณ€์ˆ˜ ์ •๋ณด ์ •๋ณด ์ˆ˜์ง‘๊ณผ์ •์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•œ ๊ฐ€์ƒ๊ฐœ๋…์„ ์˜๋ฏธํ•จ

outerEnvironmentReference(=outer)
outer๋Š” ํ˜„์žฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐ

์˜ˆ์‹œ

var a = 1;
var outer = function() {
	var inner = function() {
		console.log(a); // undefined
		var a = 3;
	};
	inner();
	console.log(a); // 1
};
outer();
console.log(a); // 1

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ๊ทธ๋ฆฌ์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Œ

| inner ์ปจํ…์ŠคํŠธ |
| outer ์ปจํ…์ŠคํŠธ |
| ์ „์—ญ ์ปจํ…์ŠคํŠธ |
ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก

outer์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์˜ ํ™˜๊ฒฝ์€ ์ „์—ญ ์ปจํ…์ŠคํŠธ์ž„ -> ๋”ฐ๋ผ์„œ outer์˜ outerEnvironmentReference๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ.
inner์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์˜ ํ™˜๊ฒฝ์€ outer์ž„ -> ๋”ฐ๋ผ์„œ inner์˜ outerEnvironmentReference๋Š” outer ์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ•จ

=> ์™œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment๋ฅผ ์ฐธ์กฐํ• ๊นŒ? => ์„ ์–ธ๋  ๋•Œ์˜ ๋ณ€์ˆ˜๋‚˜ ์‹๋ณ„์ž ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ

์ฆ‰, ๊ฐ๊ฐ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” LexicalEnvironment ์•ˆ์— record์™€ outer๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , outer ์•ˆ์—๋Š” ๊ทธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LexicalEnvironment์ •๋ณด๊ฐ€ ๋‹ค ๋“ค์–ด์žˆ์Œ -> scope chain์— ์˜ํ•ด ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ record๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์Šค์ฝ”ํ”„์ฒด์ด๋‹

  • ์‹๋ณ„์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ

์ฐจ์ด์ ์œผ๋กœ๋Š” VariableEnvironment๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์˜ ์ดˆ๊ธฐ ์Šค๋ƒ…์ƒท์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. ์ดํ›„์— VariableEnvironment์˜ environmentRecord๋Š” ๋ณ€์ˆ˜ ๋“ฑ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ

LexicalEnvironment๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•จ. ์ฆ‰, LexicalEnvironment์˜ environmentRecord๋Š” ๋ณ€์ˆ˜ ๋“ฑ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•จ

OS: Process, Thread

Process, Thread

Process

Program

  • ์–ด๋–ค ์ž‘์—…์„ ์œ„ํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ
    ex: kakaotalk.exe ๋“ฑ

Process

  • ์šด์˜ ์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์‹คํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•จ

์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค์ž„
์ข€ ๋” ์ž์„ธํžˆ ๋งํ•˜์ž๋ฉด ํ•˜๋“œ๋””์Šคํฌ์— ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์‹คํ–‰์„ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๊ณ , ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ฌ๋ผ๊ฐ. ์ด ์ˆœ๊ฐ„๋ถ€ํ„ฐ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ๋ถ€๋ฆ„

ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(code, data, stack, heap)์„ ํ• ๋‹น ๋ฐ›์Œ

  • ์ฝ”๋“œ ์˜์—ญ : ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ.
    (์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋‚˜ ๋ช…๋ น์–ด๋“ค)
    CPU๋Š” ์ฝ”๋“œ ์˜์—ญ์— ์ €์žฅ๋œ ๋ช…๋ น์–ด๋“ค์„ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•จ.
  • ๋ฐ์ดํ„ฐ ์˜์—ญ : ์ฝ”๋“œ์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋‚˜ ํŒŒ์ผ๋“ค์˜ ๊ฐ์ข… ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ.
    ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด์„œ ํ• ๋‹น๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด์„œ ์†Œ๋ฉธํ•จ
  • ์Šคํƒ ์˜์—ญ : ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ ์–ธ๋œ ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ์ด ์ €์žฅ๋จ. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ธฐ๋ก๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด ์ œ๊ฑฐ๋จ
  • ํž™ ์˜์—ญ : ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•จ

ํ”„๋กœ์„ธ์Šค๋Š” ์ตœ์†Œ 1๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋ณ„๋„์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ.
์–ด๋–ค ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC(inter process communication))๋ฅผ ํ•ด์•ผํ•จ
ex: ์†Œ์ผ“์ด๋‚˜ ํŒŒ์ผ, ํŒŒ์ดํ”„ ๋“ฑ์„ ์ด์šฉํ•œ ํ†ต์‹  ๋ฐฉ๋ฒ•

ํ”„๋กœ์„ธ์Šค ๋‚ด์—๋Š” ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์Šค๋ ˆ๋“œ ๋‹จ์œ„๋กœ ์Šค์ผ€์ค„๋ง์„ ํ•จ

=> ์šฐ๋ฆฌ๊ฐ€ ์Œ์•…์„ ๋“ค์œผ๋ฉด์„œ ๋ฉ”์ผ์„ ๋ณด๋‚ด๊ณ  ์นดํ†ก ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๋Š” ๋“ฑ์˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ CPU๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ช…๋ น๋ฐ–์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ. ์ฆ‰ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„ ์‚ฌ์‹ค์€ ํ”„๋กœ์„ธ์Šค๋“ค์„ ๋น ๋ฅด๊ฒŒ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž„

๏ฟฝThread

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œย ๋™์‹œ์— ์ง„ํ–‰๋˜๋Š” ์ž‘์—… ๊ฐˆ๋ž˜, ํ๋ฆ„์˜ ๋‹จ์œ„๋ฅผ ๋งํ•จ

์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ํ•„์š”ํ•œ ์Šคํƒ๋งŒ ํ• ๋‹น๋ฐ›๊ณ  ์ฝ”๋“œ, ํž™, ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•จ(๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋ผ๋ฆฌ ์ž์›(์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™)์„ ๊ณต์œ ํ•˜๋ฉฐ ์‹คํ–‰๋จ)

CPU

์ปดํ“จํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฒ˜๋ฆฌ์žฅ์น˜

cpu๋Š” ํ•œ์ •๋œ ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ตœ๋Œ€ํ•œ์˜ ์„ฑ๋Šฅ์„ ์ด๋Œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” cpu๋ฅผ ์ ์ ˆํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•จ
์ฆ‰, OS๋Š” ์‹คํ–‰๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ(ํ”„๋กœ์„ธ์Šค)๋“ค์—๊ฒŒ CPU ์ž์› ๋ฐฐ์ •์„ ์ ์ ˆํžˆํ•ด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Œ

Process์™€ Thread์˜ ์ฐจ์ด์ 

์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ code,data,stack,heap์˜ ํ˜•์‹์œผ๋กœ ํ• ๋‹นํ•จ.
๊ฐ๊ฐ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

์ด์™€ ๋‹ฌ๋ฆฌ ์Šค๋ ˆ๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ. ์ฆ‰, ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๋‚ด์—์„œ stack ํ˜•์‹์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ๋”ฐ๋กœ ํ• ๋‹น๋ฐ›๊ณ  ๋‚˜๋จธ์ง€ ์˜์—ญ(code, heap, data) ์„ ๊ณต์œ ํ•จ. ๋”ฐ๋ผ์„œ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋Š” ๋ณ„๋„์˜ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ code, heap, data ๋ถ€๋ถ„์€ ์„œ๋กœ ๊ณต์œ ํ•ด ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋จ

์ปฌ์ฒ˜ํ• ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ

ํ˜‘์—…์—์„œ ๊ธฐ์–ต์— ๊ฐ€์žฅ ๋‚จ๋Š” ์ƒํ™ฉ, ํ˜‘์—…์—์„œ ์–ด๋ ค์› ๋˜ ๊ฒฝํ—˜(์–ด๋ ค์› ๋˜ ์ด์œ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€)

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

โ€œํŒ€์—์„œ 1์ธ๋ถ„์„ ํ•œ๋‹คโ€๊ณ  ํ•  ๋•Œ, 1์ธ๋ถ„์€ ์–ด๋–ค๊ฑธ ์˜๋ฏธํ•˜๋Š”๊ฑธ๊นŒ์š”?

๋‚ด๊ฐ€ ๋งก์€ ์—ญํ• ์— ์ตœ์„ ์„ ๋‹คํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
๋‚ด๋ฐฐ์บ ๋ถ€ํŠธ์บ ํ”„์—์„œ 4๋ฒˆ์ •๋„ ํŒ€์„ ํ•ด ๊ฐ€๋ฉด์„œ ๋Š๋‚€์ ์€ ์•„๋ฌด๋ฆฌ ๋ชฐ๋ผ๋„ ํ• ์ค„ ์•„๋Š”๊ฒŒ ์—†์–ด๋„
๋‚ด๊ฐ€ ํ•œ๋ถ€๋ถ„์— ์ฑ…์ž„์„ ๋‹คํ•˜๊ณ  ์ตœ์„ ์„ ๋‹คํ•˜๋Š” ๊ฒƒ์ด 1์ธ๋ถ„์ด๋‹ค ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ž˜ํ•˜์ง„ ๋ชปํ•ด๋„ ํ•˜๊ธฐ์œ„ํ•ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ•˜๊ณ  ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์„ ๋‹คํ•ด ํ•˜๋Š” ๊ฒƒ์ด ํŒ€์„ ์œ„ํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JavaScript : this, closure

this, closure

this

this๋ž€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ this๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ ๊ฒฐ์ •๋จ

ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋ฐฉ์‹

  • ๋ฉ”์†Œ๋“œ๋กœ์„œ์˜ ํ˜ธ์ถœ
    ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœ ์‹œ(ex: obj1.addNums) ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋Œ€์ƒ์ด this

  • ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ
    ํ•จ์ˆ˜๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ˜ธ์ถœ ์‹œ ํ˜ธ์ถœ์ฃผ์ฒด๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ this ์ง€์ • x -> ๋•Œ๋ฌธ์— this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
    ๋˜ํ•œ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€๋ผ๊ณ  ํ•ด๋„ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๋ฉด this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•จ

  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
    ์ฝœ๋ฐฑํ•จ์ˆ˜๋„ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ, ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜์—์„œ ๋ณ„๋„๋กœ this๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ ์œผ๋กœ ๊ทธ ๋Œ€์ƒ์„ ์ฐธ์กฐํ•จ

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ
    this๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด

  • apply, call, bind ํ˜ธ์ถœ
    apply, call, bind๋Š” ์›ํ•˜๋Š” this๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ž„

  1. apply
var func = function (a, b, c) {
console.log(this, a, b, c);
};

func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6

var obj = {
a: 1,
method: function (x, y) {
console.log(this.a, x, y);
}
};

obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6
  1. call
var func = function(a,b,c) {
   console.log(this, a,b,c,)
}

func(1,2,3) // window{โ€ฆ} 1 2 3

func.call({x: 1}, 2,3,4) // {x:1} 2 3 4
  1. bind
    call์ด๋‚˜ apply๋ž‘ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ call๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋„˜๊ฒจ๋ฐ›์€ this ๋ฐ ์ธ์ˆ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ
var func = function (a,b,c,d) {
  console.log(this, a,b,c,d)
}
func(1,2,3,4) // this๋Š” window ๊ฐ์ฒด ๊ฐ€๋ฆฌํ‚ด

var bindFunc = func.bind({x:1})
bindFunc(5,6,7,8) // {x:1}, 5, 6, 7, 8

// ๋ถ€๋ถ„ ์ ์šฉํ•จ์ˆ˜ 
var bindFunc2 = func.bind({x:1, 4, 5}) 
bindFunc2(6,7) // {x:1}, 4, 5, 6, 7

Closure

Closure๋ž€?

์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์ด๋ฏธ ์ข…๋ฃŒ๋˜์—ˆ์Œ์—๋„ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•จ โ†’ ์ด๋ฏธ ์ข…๋ฃŒ๋œ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ๋“ฑ์„ ์—ฌ์ „์˜ ์ฐธ์กฐ(์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์—ฌ์ „ํžˆ ์ฐธ์กฐ)ํ•  ์ˆ˜ ์žˆ์Œ

์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋ƒ๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ณด๊ณ  ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌํ™˜๊ฒฝ์„ ์•„์ง ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ์žˆ์–ด ๋ƒ…๋‘๊ธฐ ๋•Œ๋ฌธ์ž„

์˜ˆ์‹œ
const x = 1;

function outer() {
  const x = 10;
  const inner = function () {
    console.log(x); // 10
  };
  return inner;
}

const innerFunc = outer();
innerFunc();

const innerFunc = outer() <- ์ด ๋ถ€๋ถ„์—์„œ outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ์ธ inner ํ•จ์ˆ˜๋ฅผ innerFunc์— ํ• ๋‹นํ•จ
outer ํ•จ์ˆ˜๋Š” inner ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ ํ›„ ์ฝœ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง. ํ•˜์ง€๋งŒ outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ inner ํ•จ์ˆ˜๊ฐ€ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ
innerFunc() <- inner ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋๋˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ outer ํ•จ์ˆ˜์˜ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•˜์—ฌ, outer ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ x ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์„ ์–ธ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋Š” ํŠน์„ฑ์ด ๋ฐ”๋กœ ํด๋กœ์ €์ž„
inner ํ•จ์ˆ˜๋Š” console.log(x)๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์ฝœ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง
๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๏ฟฝ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ณ , ์ดํ›„์—๋„ ๊ทธ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋Ÿฐ ํŠน์„ฑ์ด ํด๋กœ์ €์ž„. ์ด๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” privateํ•œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

๊ทธ๋Ÿฌ๋ฉด ํด๋กœ์ €๋Š” ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?

  1. ์ƒํƒœ์œ ์ง€
    ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ
์˜ˆ์‹œ
function makeCounter() {
  let count = 0;
  
  return function() {
    return count++;
  }
}

let counter1 = makeCounter();

console.log(counter1());  // 0
console.log(counter1());  // 1

  1. ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์–ต์ œ
    ์ž์‹ ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ์˜ lexical ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ
์˜ˆ์‹œ
let count = 0;

function makeCounter() {
  return function () {
    return ++count;
  };
}

let counter1 = makeCounter();

console.log(counter1(), "before"); // 0
count = 1000;
console.log(counter1(), "after"); // 1001
  1. ์ •๋ณด์˜ ์€๋‹‰
์˜ˆ์‹œ
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name, age) {
  this.name = name; //public
  let _age = age; //private

  this.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };
}

const me = new Person("Choi", 33);
me.sayHi(); // Hi!, My name is Choi. I am 33.
console.log(me.name); // Choi
console.log(me._age); // undefined

const you = new Person("Lee", 30);
you.sayHi(); // Hi! My name is Lee. I am 30.
console.log(you.name); // Lee
console.log(you.age); // undefined

์œ„ ์ฝ”๋“œ์—์„œ me._age๋‚˜ you.age์— ์ ‘๊ทผํ•˜๋ฉด undefined๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ 
_age๋Š” Person ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ผ์„œ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
๋ณ€์ˆ˜ _age๋Š” Person ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ณ (์€๋‹‰ํ™”), ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ฝœ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง€์ง€๋งŒ ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฉ”์†Œ๋“œ SayHi ํ•จ์ˆ˜์—์„œ ๊ณ„์† ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ

me.name์ด ๋˜๋Š” ์ด์œ ๋Š” Person ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์˜ name ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ณ , ์ด ์†์„ฑ์€ ์–ด๋””์„œ๋“  ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” public ์†์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์ž„. ๋”ฐ๋ผ์„œ me.name์ด๋‚˜ you.name์ด๋ผ๊ณ  ํ•˜๋ฉด ๊ทธ ์†์„ฑ๊ฐ’์ด ๋‚˜์˜ด

[NetWork]์ฃผ์†Œ์ฐฝ์— naver.com์„ ์น˜๋ฉด ์ผ์–ด ๋‚˜๋Š”์ผ

#์ฃผ์†Œ์ฐฝ์— naver.com์„ ์น˜๋ฉด ์ผ์–ด ๋‚˜๋Š”์ผ

IP ์ฃผ์†Œ

  • IP ์ฃผ์†Œ๋ž€ ๋งŽ์€ ์ปดํ“จํ„ฐ๋“ค์ด ์ธํ„ฐ๋„ท ์ƒ์—์„œ ์„œ๋กœ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ •๋ฐ›์€ ์‹๋ณ„์šฉ ๋ฒˆํ˜ธ ์ด๋‹ค.
  • ํ˜„์žฌ๋Š” IPv4๋ฒ„์ „(32๋น„ํŠธ)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, 127.0.0.1 ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๋งํ•œ๋‹ค.
  • ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก IPv4 ์ฃผ์†Œ์˜ ๋ถ€์กฑ์œผ๋กœ IPv6๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, 128๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— IP์ฃผ์†Œ๊ฐ€ ๋ถ€์กฑํ•˜์ง€ ์•Š๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
  • ๋‹จ์  : IP ์ฃผ์†Œ๋Š” 12์ž๋ฆฌ์˜ ์ˆซ์ž๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ์ด ์™ธ์šฐ๊ธฐ ํž˜๋“ค๋‹ค

๋„๋ฉ”์ธ ๋„ค์ž„(Domain Name)

  • IP์ฃผ์†Œ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜์—ฌ 12์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ๋ฌธ์ž๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ฃผ์†Œ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด ๋„๋ฉ”์ธ ๋„ค์ž„์ด๋‹ค.
  • 'naver.com' ์ฒ˜๋Ÿผ ๋ช‡๊ฐœ์˜ ๋ฌธ์ž๋“ค๊ณผ .์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ๋„๋ฉ”์ธ ๋„ค์ž„์€ ์‚ฌ๋žŒ์˜ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ๋งŒ๋“  ์ฃผ์†Œ์ด๋ฏ€๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

DNS(Domian Name System)

  • ๋ฏธ๋ฆฌ ๋„๋ฉ”์ธ ๋„ค์ž„๊ณผ ํ•จ๊ป˜ ํ•ด๋‹นํ•˜๋Š” IP ์ฃผ์†Œ๊ฐ’์„ ํ•œ์Œ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค
  • ๋„๋ฉ”์ธ ๋„ค์ž„์œผ๋กœ ์ž…๋ ฅํ•˜๋ฉด DNS๋ฅผ ์ด์šฉํ•ด ์ปดํ“จํ„ฐ๋Š” IP์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ ์ฐพ์•„ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์ž‘๋™๋ฐฉ์‹

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋„๋ฉ”์ธ ๋„ค์ž„(www.naver.com)์„ ์ž…๋ ฅ์‚ฐ๋‹ค.
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ คํ•œ URL ์ฃผ์†Œ ์ค‘์—์„œ ๋„๋ฉ”์ธ ๋„ค์ž„(Domain Name)๋ถ€๋ถ„์„ DNS ์„œ๋ฒ„์— ๊ฒ€์ƒ‰ํ•˜๊ณ  DNS ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ๋„๋ฉ”์ธ ๋„ค์ž„์— ํ•ด๋‹นํ•˜๋Š” IP์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ URL ์ •๋ณด์™€ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค.
  3. ํŽ˜์ด์ง€ URL ์ •๋ณด์™€ ์ „๋‹ฌ๋ฐ›์€ IP ์ฃผ์†Œ๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ HTTP ์š”์ฒญ ๋ฉ”์‹œ๋‹ˆ๋Š” TCP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท์„ ๊ฑฐ์ณ ํ•ด๋‹น IP์ฃผ์†Œ์˜ ์ปดํ“จํ„ฐ๋กœ ์ „์†ก๋œ๋‹ค.
  4. ์ด๋ ‡๊ฒŒ ๋„์ฐฉํ•œ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€ URL ์ •๋ณด๋กœ ๋ณ€ํ™˜๋˜์–ด ์›น ํŽ˜์ด์ง€ URL ์ •๋ณด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  5. ๊ฒ€์ƒ‰๋œ ์›นํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋Š ๋˜ ๋‹ค์‹œ HTTPํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„œํ•˜๊ณ  TCP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท์„ ๊ฑฐ์ณ ์›๋ž˜ ์ปดํ“จํ„ฐ๋กœ ์ „์†กํ•˜๋‹ค.
  6. ๋„์ฐฉํ•œ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜๋˜์–ด ์›น ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ์ถœ๋ ฅ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

[Network] CORS ์—๋Ÿฌ๋ž€?

#CORS ์—๋Ÿฌ๋ž€?

์š”์ฒญ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅธ CORS ๋ฐœ์ƒ ์—ฌ๋ถ€

Cross-Origin

<img>,<video>,<script>,<link> ํƒœ๊ทธ ๋Š” ๋‹ค๋ฅธ์‚ฌ์ดํŠธ์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Same-Origin

  • ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์†Œ์Šค์— ๋Œ€ํ•ด ์ž๋ฐ”์Šคํ‚™ํŠธ ajax์š”์ฒญ APIํ˜ธ์ถœ์‹œ
  • ์›นํฐํŠธ CSS ํŒŒ์ธ ๋‚ด @font-face์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ํฐํŠธ ์‚ฌ์šฉ ์‹œ
  • XMLHttpRequest, Fetch API ์Šคํฌ๋ฆฝํŠธ

CORS ๋ž€?

Cross-Origin Resource Sharing ๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๋ฐฉ๋ฒ•์ด๋‹ค.

origin ๋ž€?

Protocol + Host + Post ๋ชจ๋‘ ํ•ฉ์ณ์ง„ URL์„ ์˜๋ฏธํ•œ๋‹ค.

Protocol: http, https
Host: domain
Port: ํฌํŠธ ๋ฒˆํ˜ธ
Path: ์‚ฌ์ดํŠธ๋‚ด๋ถ€ ๊ฒฝ๋กœ
Query string: ์š”์ฒญ์˜ key์™€ value๊ฐ’
Fragment: ํ•ด์‹œํƒœ๊ทธ

๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin Policy)

SOP (Same-Origin Policy)

๋™์ผํ•œ ์ถœ์ฒ˜์— ๋Œ€ํ•œ ์ •์ฑ… = ๋™์ผํ•œ ์ถœ์ฒ˜์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค๋ฅธ์ถœ์ฒ˜(Cross-Origin) ์„œ๋ฒ„์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋‚˜ ์œ ํŠœ๋ธŒ ์˜์ƒ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋™์ผ ์ •์ฑ…์ด ํ•„์š”ํ•œ ์ด์œ 

ํ•ด์ปค๊ฐ€ CSRF(Cross-Site Request Forgery)๋‚˜ XSS(Cross-Site Scripting) ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•ด์ปค๋ฅผ ์‹ฌ์–ด๋†“์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•˜์—ฌ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๊ฐ€๋กœ์ฑŒ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ ํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์ „์— ๋ฐฉ์ง€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ถœ์ฒ˜์˜ ๊ตฌ๋ถ„

URL์˜ ๊ตฌ์„ฑ์š”์†Œ ์ค‘ Protocal, Host,Port 3๊ฐ€์ง€๋งŒ ๋™์ผํ•˜๋ฉด ๋™์ผ ์ถœ์ฒ˜๋กœ ํŒ๋‹จํ•œ๋‹ค.

์ถœ์ฒ˜๋น„๊ต์™€ ์ฐจ๋‹จ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€

์ถœ์ฒ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์€ ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋œ ์ŠคํŒฉ์ด๋‹ค.(๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ต์„ ๋ฐ›์•„ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์—๋Ÿฌ๋ฅผ ๋ณด๋‚ธ๋‹ค.)

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (Cross-Origin Resource Sharing)

๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ์— ๋Œ€ํ•œ ํ—ˆ์šฉ/๋น„ํ—ˆ์šฉ ์ •์ฑ…์ด๋‹ค.

CORS๋Š” ์˜ˆ์™ธ ์กฐํ•ญ์„ ๋‘๊ณ  ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด๋ผ๋„ ์ด ์กฐํ•ญ์— ํ•ด๋‹นํ•  ๊ฒฝ์šฐ ํ—ˆ์šฉํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ € CORS ๊ธฐ๋ณธ๋™์ž‘

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ HTTP ์š”์ฒญ์˜ ํ—ค๋”์— Origin์„ ๋‹ด์•„ ์ „๋‹ฌ
    1. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์€ HTTPํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
    2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ ํ—ค์–ด๋ฐ Origin์ด๋ผ๋Š” ํ•„๋“œ์— ์ถœ์ฒ˜๋ฅผ ๋‹ด์•„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.
    3. ![[์Šคํฌ๋ฆฐ์ƒท 2023-11-30 ์˜คํ›„ 8.06.56.png]]
  2. ์„œ๋ฒ„๋Š” ์‘๋‹ตํ—ค๋”์— Access-Control-Allow-Origin์„ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
    1. ์„œ๋ฒ„๊ฐ€ ์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•  ๋•Œ ์‘๋‹ต ํ—ค์–ด๋ฐ Access-Control-Allow-Origin์ด๋ผ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์œผ๋กœ ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜ url์„ ๋‚ด๋ ค๋ณด๋‚ธ๋‹ค.
    2. ![[์Šคํฌ๋ฆฐ์ƒท 2023-11-30 ์˜คํ›„ 8.09.05.png]]
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ Access-Control-Allow-Origin์„ ๋น„๊ตํ•œ๋‹ค.
    1. ๋น„๊ตํ•ด ๋ณธํ›„ ์ฐจ๋‹จํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •
    2. ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ  CORS์—๋Ÿฌ
    3. ์œ ํšจํ•˜๋‹ค๋ฉด ๋‹ค๋ฅธ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฌธ์ œ์—†์ด ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

  1. ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๋˜๋Š” ํฌํŠธ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ
    • Access-Control-Allow-Origin ํ—ค๋” ์„ค์ •ํ•˜์—ฌ ์š”์ฒญ ํ—ˆ์šฉ
  2. HTTPS์—์„œ HTTP๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ
  3. ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ
    • Access-Control-Allow-Credentials ํ—ค๋” ์„ค์ • (์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ธ์ฆ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•จ)
  4. ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ
    • Access-Control-Allow-Headers ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜์—ฌ ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  5. ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์—†๋Š” ๊ฒฝ์šฐ
  6. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CORS๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  7. CDN ๋“ฑ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ
    • CDN ๋“ฑ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ ํ• ๋•Œ๋„ CORS์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์„ค์ • ํ™•์ธํ•ด์•ผํ•จ
  8. ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ
    • Access-Control-Allow-Headers ํ—ค๋”๋ฅผ ์„ค์ •
  9. ๋ธŒ๋ผ์šฐ์ € ์„ค์ • ๋ฌธ์ œ

ํ”„๋ก ํŠธ์—์„œ ์ธ์ฆ์ •๋ณด ํฌํ•จํ•œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ

์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ํ”„๋ก ํŠธ์—์„œ๋„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ• ๊ฒƒ์ด ์žˆ๋Š”๋ฐ withCredentials์˜ต์…˜์„ ์ถ”๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

[JS] this, closure

this๋Š” ํ˜ธ์ถœ์— ์˜ํ•ด ๋‹ฌ๋ผ์ง„๋‹ค.

1. ๋‹จ๋… ์œผ๋กœ ์“ด this

global object๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
strict ๋ชจ๋“œ ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด๋‹ค.

'use strict'

var x = this
console.log(x) //window

2. ํ•จ์ˆ˜ ์•ˆ์—์„œ this

ํ•จ์ˆ˜ ์ฃผ์ธ์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.
window ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

function myFunc(){
	return this
}
console.log(myFunc()) //window

var num = 0
function addNum(){
	this.num = 100
	num++
	console.log(num) //101
	console.log(window.num) //101
	console.log(num === windwo.num) //true
}
addNum()
  • num์€ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
  • strict mode ์—์„œ๋Š” undefined์„ ๊ฐ€๋ฅดํ‚จ๋‹ค.
"use strict";

function myFunction() {

return this;

}

console.log(myFunction()); //undefined

var num = 0
function addNum(){
	this.num = 100 //error cannot set property 'num' of undefined
	num++
}
addNum()

3. ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ this

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ์ฝ”๋“ฑ์„œ ์‚ฌ์šฉ๋œ this๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

var pserson = {
	firstName: 'Maru',
	lastName : 'Park',
	fullName : function () {
		return this.firstName + this.lastName
	}
}
person.fullName() // "Maru Park"

var num = 0;
function showNum(){
	console.log(this.num)
}
showNum() //0

var obj = {
	num: 200,
	func: showNum
}

obj.func()//200

4. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ this

์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์€ HTML ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

var btn = documnetquerySelector('#btn')
btn.addEventListener('click', function(){
console.log()//#btn
})

5. ์ƒ์„ฑ์ž ์•ˆ์—์„œ this

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋กœ this๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

function Person(){
	this.name = name
}

var kim = new Person('kim')
var park = new Person('Park')

console.log(kim.name)  //kim
console.log(park.name) //park

new ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ฒŒ ๋˜๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ™์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— this๋Š” window์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

6. ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ this

this ๋ฐ”์ธ๋”ฉ์„ ์ฝ”๋“œ์—์„œ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  function ์€ apply() call() bind()๋ผ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ this ๋ฐ”์ธ๋”ฉ์„ ์ฝ”๋“œ์—์„œ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

call, apply

const foo= {
	a : 20
}
function bar (){
	console.log(this.a)
}
bar.call(foo) //20
bar.apply(foo) // 20

call, apply์˜ ๋‹ค๋ฅธ ์ 

๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด์˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š”๋ฐ call์€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ชฉ๋ก, applay๋Š” ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

bind

const foo = {
	a: 20
}

function bar(){
	console.log(this.a)
}
const bound = bar.bind(foo)

bind ๋ฉ”์„œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์˜ค๋ธŒ์ ํŠธ๋กœ this๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๊ฒƒ์„ ํ•˜๋“œ ๋ฐ”์ธ๋”ฉ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜๋“œ ๋ฐ”์ธ๋”ฉ๋œ ํ•จ์ˆ˜๋Š” ์ดํ›„ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ ์ •ํ•ด์ง„ this ๋ฐ”์ธ๋”ฉ์„ ๊ฐ€์ง€๊ณ  ํ˜ธ์ถœ๋œ๋‹ค.

7. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ this

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ „์—ญ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋”๋ผ๋„ this๋ฅผ ์ƒˆ๋กœ ์ •์˜ ํ•˜์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ๋ฐ”๊นฅ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค์˜ this๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

var Person = function (name, age){
	this.name = name;
	this.age = age;
	this.say = function () {
		console.log(this) //Person{name: 'Maru', age:8}
		setTimeout(function(){
			console.log(this) //window
			console.log(this.name + 'is' + this.age + ' years old')
		},100)
	}
}
var me = new Person("Maru",8)
me.say() //global is undefined years old



// ()=>{}

var Person = function (name, age){
	this.name = name;
	this.age = age;
	this.say = function () {
		console.log(this) //Person{name: 'Maru', age:8}
		setTimeout(()=>{
	console.log(this)//Person{name: 'Maru', age:8}
			console.log(this.name + 'is' + this.age + ' years old')
		},100)
	}
}
var me = new Person("Maru",8)
me.say() //Maru is 8 years old

closure

ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋ (์ƒ์„ฑ๋ ) ๊ทธ ๋‹น์‹œ์— ์ฃผ๋ณ€์˜ ํ™˜๊ฒฝ๊ณผ ํ•จ๊ฒŒ ๊ฐ‡ํžˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ, ํ•จ์ˆ˜๊ฐ€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์‹คํ–‰๋  ๋•Œ๋„ ์ด ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ.

๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜์„œ ์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธ๋œ ์ดใ…œ์—๋„ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ

function outerFunc(init){
	function innerFunc(num){
		return init + num 
	}
	return innerFunc
}
let addFunc = outerFunc(1);
console.log(addFunc(1)) //2

ํด๋กœ์ € ํ™œ์šฉ

  1. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กด ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํด๋กœ์ € ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜๋”๋ผ๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋‚ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํด๋กœ์ €๋Š” ์ด์ฒ˜๋Ÿผ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์ฝ”ํ”„ ์•ˆ์— ๊ฐ€๋‘์–ด ๋‘” ์ฑ„๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ํ์‡„์„ฑ์„ ๊ฐ–๋Š”๋‹ค.
  2. ์ •๋ณด์˜ ์ ‘๊ทผ ์ œํ•œ(์บก์Šํ™”)
    โ€˜ํด๋กœ์ € ๋ชจ๋“ˆ ํŒจํ„ดโ€™์„ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด์— ๋‹ด์•„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
    ์ด๋Ÿฌํ•œ ์ •๋ณด์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์„ ์บก์Šํ™”๋ผ๊ณ  ํ•œ๋‹ค.
  3. ๋ชจ๋“ˆํ™”์— ์œ ๋ฆฌํ•˜๋‹ค.
    ํด๋กœ์ € ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ฐ์ž ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ด์™€ ๊ฐ™์ด ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™” ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋…๋ฆฝ์ ์ธ ๋ถ€ํ’ˆ์˜ ํ˜•ํƒœ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋“ˆํ™”๋ผ๊ณ ํ•œ๋‹ค.
    ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌถ์–ด๋‹ค๋‹ ์ˆ˜ ์žˆ๊ธฐ์— ํด๋กœ์ €๋Š” ๋ชจ๋“ˆํ™”์— ์œ ๋ฆฌํ•˜๋‹ค.

NewWork: ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ

ํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ธ์ฆ์— ๋Œ€ํ•ด์„œ ์•Œ๊ธฐ ์ „์— ๊ธฐ์กด์— ์“ฐ์ด๋˜ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ™์ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Œ

์„ธ์…˜(Session)์ด๋ž€?

์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•œ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋๋‚ด๋Š” ์‹œ์ ๊นŒ์ง€ ๊ฐ™์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์ผ๋ จ์˜ ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๊ณ  ๊ทธ ์ƒํƒœ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ 

์ฆ‰, ํด๋ผ์ด์–ธํŠธ ๋ณ„๋กœ ๊ฐ๊ฐ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๋Š” ๊ธฐ์ˆ ์ž„

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํด๋ผ์ด์–ธํŠธ ๋ณ„๋กœ ์„ธ์…˜ID๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์„ธ์…˜์„ ์œ ์ง€ํ•จ
  • ์ ‘์† ์‹œ๊ฐ„์— ์ œํ•œ์„ ๋‘์–ด ์ผ์ • ์‹œ๊ฐ„ ์‘๋‹ต์ด ์—†๋‹ค๋ฉด ์ •๋ณด๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ฒŒ ์„ค์ •๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋จ -> ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
  • ์ฟ ํ‚ค์— ๋น„ํ•ด ๋ณด์•ˆ์ ์ธ ๋ฉด์—์„œ ์ข€๋” ๋‚˜์Œ(์ฟ ํ‚ค๋Š” ์ค‘๊ฐ„์— ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ)
  • ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ๋งŒ๋ฃŒ๊ธฐํ•œ์— ์ƒ๊ด€์—†์ด ์ข…๋ฃŒ๋จ

์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹

์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— authentication ์š”์ฒญ์„ ๋ณด๋ƒ„(๋‹‰๋„ค์ž„, ํŒจ์Šค์›Œ๋“œ ๊ฐ™์€ ์œ ์ €์ •๋ณด๋ฅผ ๊ฐ™์ด ๋ณด๋ƒ„)
  • ์„œ๋ฒ„๋Š” ์„œ๋ฒ„์— ์ €์žฅ๋œ ํšŒ์› ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•ด ์ผ์น˜ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋งž๋‹ค๋Š” ์ธ์ฆ์„ ํ•˜๊ณ  ์„ธ์…˜์„ ๋งŒ๋“ค์–ด ์„ธ์…˜ ์•„์ด๋””๋ฅผ HTTP ์‘๋‹ต ํ—ค๋”์— Set-Cookie์•ˆ์— ์„ธ์…˜์•„์ด๋””๋ฅผ ๋„ฃ์–ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋ƒ„
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์„ ๋ฐ›์•„ set-cookie๋ฅผ ๋ณด๊ณ  ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค์— ์„ธ์…˜์•„์ด๋””๋ฅผ ์ €์žฅํ•˜๊ณ  ๋งค๋ฒˆ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ HTTP ํ—ค๋”์— ์„ธ์…˜์•„์ด๋””๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋ฅผ ๊ฐ™์ด ๋ณด๋ƒ„ โ†’ ์„œ๋ฒ„๊ฐ€ ๋งค๋ฒˆ ์„ธ์…˜ ์•„์ด๋””๋ฅผ ํ™•์ธํ•˜๊ณ  ์„œ๋ฒ„์— ์ €์žฅ๋œ ์„ธ์…˜์•„์ด๋””์™€ ์ผ์น˜ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ„
์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฌธ์ œ์ 

์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ , ์„ธ์…˜ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•จ. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ์•„์ด๋””๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ์ •๋ณด(๋กœ๊ทธ์ธ ์ƒํƒœ ๋“ฑ)์„ ์กฐํšŒํ•จ

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

๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์„ธ์…˜์•„์ด๋””๊ฐ€ ํƒˆ์ทจ๋‹นํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘๋  ์ˆ˜ ์žˆ์Œ

โ†’ ์–ด๋–ป๊ฒŒ? โ†’ ์ œ 3์ž๋‚˜ ํ•ด์ปค๊ฐ€ ์ฟ ํ‚ค๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ชฐ๋ž˜ ์‹ฌ์–ด์„œ ์„ธ์…˜์•„์ด๋”” ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ์Œ([xss](https://duni0107-day.tistory.com/69)(Cross-Site Scripting ์˜ˆ์‹œ ํŽ˜์ด์ง€))

ํ† ํฐ(Token)์ด๋ž€?

ํ† ํฐ์€ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋ฌธ์ž์—ด์„ ๋งํ•จ
์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ๋กœ๊ทธ์ธํ•˜๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ† ํฐ์ด ์ƒ์„ฑ๋˜๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ์ „์†ก๋˜์–ด ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ
ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Statelessํ•œ ํŠน์„ฑ์„ ๊ฐ€์ ธ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์— ๋น„ํ•ด ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ์ด ์žˆ์Œ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹
  • ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— authentication ์š”์ฒญ์„ ๋ณด๋ƒ„
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งž๋Š”์ง€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ํ† ํฐ์„ ์ƒ์„ฑํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ„
  • ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๊ณ (์ฟ ํ‚ค ๋“ฑ), ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค HTTP ํ—ค๋”์— ํ† ํฐ์„ ๊ฐ™์ด ๋ณด๋ƒ„
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ์œ ํšจํ•œ ํ† ํฐ์ผ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ•œ ์‘๋‹ต์„ ๋ณด๋ƒ„
ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฌธ์ œ์ 

ํ† ํฐ๋„ ์ค‘๊ฐ„์— ํƒˆ์ทจ๋‹นํ•  ์ˆ˜ ์žˆ์Œ(xss, man-in-the-middle-attack ๋“ฑ) โ†’ ํƒˆ์ทจ๋‹นํ•œ ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์—†์Œ(์™œ๋ƒํ•˜๋ฉด ํ† ํฐ์„ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ 3์ž๊ฐ€ ํƒˆ์ทจํ•œ ํ† ํฐ์€ ๋งŒ๋ฃŒ๊ธฐํ•œ์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฌดํ‘œํ™”ํ•  ์ˆ˜ ์—†์Œ)

JWT(JSON Web Token)

ํ† ํฐ์˜ ํ•œ ์ข…๋ฅ˜๋กœ, ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ์„ ์˜๋ฏธํ•จ.

๊ตฌ์„ฑ ์š”์†Œ
  1. Header

{
"alg": "HS256",
"typ": "JWT"
}

ํ† ํฐ์˜ ์ข…๋ฅ˜์™€ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋‹ด๊ฒจ์žˆ์Œ

  1. Payload

payload๋Š” ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด์˜ ์กฐ๊ฐ๋“ค(ํด๋ ˆ์ž„)์ด ๋‹ด๊ฒจ์žˆ์Œ

ํด๋ ˆ์ž„์ด๋ž€?
key-value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•œ ์Œ์˜ ์ •๋ณด(๋‚ด์šฉ)๋ฅผ ์˜๋ฏธํ•จ
์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ  ๋ฐ›๋Š” ์‹œ์Šคํ…œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์Œ

payload๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ 1. registered claims(๋“ฑ๋ก๋œ ํด๋ ˆ์ž„)

๋ฏธ๋ฆฌ ์ •ํ•ด์ ธ์žˆ๋Š” ํด๋ ˆ์ž„์œผ๋กœ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹Œ ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์ด ์ด๋ฏธ ์ •ํ•ด์ง„ ํด๋ ˆ์ž„์„ ๋งํ•จ. ํ•„์ˆ˜ ํด๋ ˆ์ž„์€ ์—†์ง€๋งŒ ๋งŽ์ด ์“ฐ์ด๋Š” ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ด ์žˆ์Œ

  • ์ข…๋ฅ˜
    • iss(issuer: ํ† ํฐ ๋ฐœํ–‰์ž)
    • sub(subject: ํ† ํฐ ์ œ๋ชฉ)(์ œ์ผ ์ค‘์š”ํ•จ)
    • iat(issued at: ํ† ํฐ ๋ฐœํ–‰ ์‹œ๊ฐ„)
  1. public claims(๊ณต๊ฐœ ํด๋ ˆ์ž„)
    ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ ˆ์ž„.
    ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ ์ถฉ๋Œ์ด ๋ฐฉ์ง€๋œ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ. ์ด๋ฅผ ์œ„ํ•ด์„œ uri ํ˜•์‹์œผ๋กœ ํด๋ ˆ์ž„ ์ด๋ฆ„์„ ์ง€์Œ

ex: { โ€œhttps:// [www.example.com](http://www.example.com)/adminโ€ : true }

  1. private claims(๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„)
    ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ํ˜‘์˜ํ•˜์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ ˆ์ž„์ž„.
    ex: { username : โ€˜ggโ€™ }
  1. Signature
    ์„œ๋ฒ„๋Š” ํ—ค๋” ํ˜น์€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ๋ณ€์กฐ๋˜์—ˆ๋Š”์ง€ ๊ทธ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ
JWT์˜ ๊ฒ€์ฆ ๋ฐ ์ƒ์„ฑ๊ณผ์ •
  1. JWT ์ƒ์„ฑ: ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ -> ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ๊ฐ Base64Url ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ฆ -> ๋‘ ๋ฌธ์ž์—ด์„ ๋ถ™์—ฌ ์„œ๋ฒ„์— ์ €์žฅ๋œ ์‹œํฌ๋ฆฟํ‚ค(์„œ๋ฒ„์—๋งŒ ์ €์žฅ๋˜์–ด์žˆ์Œ. ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์•Œ ์ˆ˜ ์—†์Œ)๋ฅผ ์‚ฌ์šฉํ•ด ํ—ค๋”์— ๋ช…์‹œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹œ๋ฅผ ์ƒ์„ฑ-> ์ƒ์„ฑํ•œ ํ•ด์‹œ๊ฐ’์„ ๋‹ค์‹œ Base64Url ์ธ์ฝ”๋”ฉ -> JWT์˜ ์„œ๋ช… ๋ถ€๋ถ„ ๋งŒ๋“ฆ -> ์ƒ์„ฑ๋œ JWT๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ

  2. JWT ๊ฒ€์ฆ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ JWT๋ฅผ ํ•จ๊ป˜ ๋ณด๋ƒ„ -> ์„œ๋ฒ„๋Š” ๋ฐ›์€ JWT์˜ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด Base64Url ๋””์ฝ”๋”ฉ -> ๋””์ฝ”๋”ฉํ•œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ถ™์ธ ๋ฌธ์ž์—ด + ์„œ๋ฒ„์— ์ €์žฅ๋œ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด์‹œ๋ฅผ ์ƒ์„ฑ -> ์ด ํ•ด์‹œ๊ฐ’๊ณผ JWT์˜ ์„œ๋ช…(signature) ๋ถ€๋ถ„ ๋น„๊ต -> ๋งŒ์•ฝ ๋‘ ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

Access, Refresh Token

JWT์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์€ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ž์ฃผ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๊ฑฐ๋กœ์›€
๋ฐ˜๋Œ€๋กœ ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ฒŒ๋˜๋ฉด ์ œ 3์ž์—๊ฒŒ ํ† ํฐ์„ ํƒˆ์ทจ๋‹นํ•  ๊ฒฝ์šฐ ๋ณด์•ˆ์— ์ทจ์•ฝํ•จ
๋งŒ์•ฝ JWT๊ฐ€ ํƒˆ์ทจ ๋‹นํ–ˆ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น ํ† ํฐ์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Œ(์ด๋ฏธ ๋ฐœํ–‰๋œ ํ† ํฐ์— ๋Œ€ํ•ด์„œ๋Š” ์„œ๋ฒ„์—์„œ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์—†์Œ)

์ด๋Ÿฐ ์ทจ์•ฝ์ ์„ ๋ง‰๊ณ ์ž Access Token๊ณผ Refresh Token์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•จ

์˜ˆ๋ฅผ ๋“ค๋ฉด ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์—‘์„ธ์Šค ํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‰ฌ ํ† ํฐ์„ ๊ฐ™์ด ๋ฐœ๊ธ‰ํ•ด์„œ ์คŒ
์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋‹ค๊ฐ€ ์—‘์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ๊ธฐํ•œ์ด ์ง€๋‚˜๋ฉด ์ฒ˜์Œ์— ๊ฐ™์ด ๋ฐœ๊ธ‰๋˜์—ˆ๋˜ ๋ฆฌํ”„๋ ˆ์‰ฌ ํ† ํฐ(์—‘์„ธ์Šค ํ† ํฐ๋ณด๋‹ค ๋งŒ๋ฃŒ๊ธฐํ•œ์ด ๊ธบ. ๋ณดํ†ต 2์ฃผ๋ผ๊ณ  ํ•จ)์„ ํ†ตํ•ด ์„œ๋ฒ„์— ์—‘์„ธ์Šค ํ† ํฐ์˜ ์žฌ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•จ

ํ•˜์ง€๋งŒ ๋ฆฌํ”„๋ ˆ์‰ฌ ํ† ํฐ๊นŒ์ง€ ํƒˆ์ทจ๋œ๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์›๋ž˜ ์‚ฌ์šฉ์ž ์ธ๊ฒƒ์ฒ˜๋Ÿผ ํ–‰์„ธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ -> ์ด์— ๋Œ€ํ•œ ์กฐ์น˜๋„ ์ถ”๊ฐ€๋กœ ํ•„์š”(ex: ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์‚ฌ์šฉ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์ด์ „์˜ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ฌดํšจํ•˜๋Š” ๋“ฑ)

JWT ํ† ํฐ์„ ์ฟ ํ‚ค์— ์ €์žฅํ–ˆ์„ ๋•Œ ์ทจ์•ฝ์ 

ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ(CSRF) ๊ณต๊ฒฉ

์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•˜๋Š” ํ–‰๋™์„ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ž„

์˜ˆ๋ฅผ ๋“ค์–ด ์€ํ–‰์— ๋กœ๊ทธ์ธํ•จ(์„ธ์…˜ ์•„์ด๋”” ์žˆ์Œ) โ†’ ๋ˆ„๊ตฐ๊ฐ€ ์นดํ†ก์ด๋‚˜ ๋ฌธ์ž ๋ฉ”์„ธ์ง€ ๋“ฑ์œผ๋กœ ๋™์˜์ƒ ๋งํฌ(์˜ˆ๋ฅผ ๋“ค๋ฉด 1๋ถ„๋งŒ์— ํœด๋Œ€ํฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ๋ผ๋Š” ์œ ํŠœ๋ธŒ ์˜์ƒ ๋งํฌ)๋ฅผ ๋ณด๋ƒ„ โ†’ ํด๋ฆญํ•จ โ†’ ์ •์ƒ์ ์œผ๋กœ ์œ ํŠœ๋ธŒ ๋™์˜์ƒ์ด ๋‚˜์˜ด โ†’ ํ•˜์ง€๋งŒ ์†Œ์Šค๋ณด๊ธฐ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๊ทธ ๋งํฌ ์†์— 12345๋ผ๋Š” ๊ณ„์ขŒ๋กœ 100๋งŒ์›์„ ์ž…๊ธˆํ•˜๋ผ๋Š” ์š”์ฒญ์„ ํ•˜๋Š” ๋งํฌ๊ฐ€ ์ˆจ๊ฒจ์ ธ์žˆ์Œ โ†’ ์‚ฌ์šฉ์ž๋„ ๋ชจ๋ฅด๊ฒŒ 12345๋ผ๋Š” ๊ณ„์ขŒ๋กœ 100๋งŒ์›์„ ๋ณด๋‚ด๋Š” ์š”์ฒญ์„ ํ•˜๊ณ , ์ฟ ํ‚ค์— ์žˆ๋Š” ์„ธ์…˜์•„์ด๋””๊ฐ€ ์ž๋™์œผ๋กœ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ๋ณด๋‚ด์ง

ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ ๊ณต๊ฒฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ

์ž์„ธํ•œ ์˜ˆ์‹œ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

๊ทธ๋Ÿผ ์–ด๋””๋‹ค๊ฐ€ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ?
์•„๋ž˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ์กฐ

JavaSript : ๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง, ์ด๋ฒคํŠธ์œ„์ž„

๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง, ์ด๋ฒคํŠธ ์œ„์ž„

๋ฒ„๋ธ”๋ง

  • ๋ฒ„๋ธ”๋ง์ด๋ž€?
    • ์•ˆ์ชฝ์— ์žˆ๋Š” ์ž์‹ ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•ด ๋ถ€๋ชจ ์š”์†Œ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฒ„๋ธ”๋ง์ด๋ผ๊ณ  ํ•จ.
    • ๋ชจ๋“  ์ด๋ฒคํŠธ๋Š” ๋ฒ„๋ธ”๋ง ๋จ(default)
      focus์™€ ๊ฐ™์ด ๋ฒ„๋ธ”๋ง ๋˜์ง€ ์•Š๋Š” ๋ช‡๋ช‡์˜ ์ด๋ฒคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฒคํŠธ๋Š” ๋ฒ„๋ธ”๋ง์ด ๋จ
๋ฒ„๋ธ”๋ง ์˜ˆ์‹œ
<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="alert('p')">P</p>
  </div>
</form>

๊ฐ€์žฅ ์•ˆ์ชฝ์— ์œ„์น˜ํ•œ p ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘๋™ํ•จ

  • p ํƒœ๊ทธ์˜ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•จ
  • ๋ฐ”๊นฅ ํƒœ๊ทธ์ธ div์˜ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•จ
  • ๊ทธ ์œ„์˜ ํƒœ๊ทธ์ธ form์— ํ• ๋‹น๋œ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•จ
  • document ๊ฐ์ฒด(DOM tree์˜ ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ๋…ธ๋“œ(๊ฐ์ฒด))๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ ์š”์†Œ์— ํ• ๋‹น๋œ onClick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•จ
    => ๋”ฐ๋ผ์„œ p๋งŒ ๋ˆŒ๋ €์„ ๋ฟ์ธ๋ฐ 3๊ฐœ์˜ alert ์ฐฝ('p' -> 'div' -> 'form')์ด ๋œธ
๋ฒ„๋ธ”๋ง ์ค‘๋‹จ ์˜ˆ์‹œ

ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์™„์ „ํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚œ ํ›„ ๋ฒ„๋ธ”๋ง์„ ์ค‘๋‹จํ•˜๋„๋ก ๋ช…๋ นํ•  ์ˆ˜ ์žˆ์Œ
๋ฐ”๋กœ event.stopPropagation()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form onclick="alert('form')">FORM
  <div onclick="alert('div')">DIV
    <p onclick="event.stopPropagation()">P</p>
  </div>
</form>

p๋ฅผ ํด๋ฆญํ•ด๋„ div์˜ onClick์€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

event.stopPropagation()๊ณผ event.stopImmediatePropagation()์˜ ์ฐจ์ด์ 
  1. event.stopPropagation()
    ํ˜„์žฌ ์ด๋ฒคํŠธ์˜ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ์ค‘๋‹จํ•จ. ์ฆ‰, ํ˜„์žฌ ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ
  2. event.stopImmediatePropagation()
    event.stopPropagation()๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ™์€ ์ด๋ฒคํŠธ ํƒ€์ž…์„ ๊ฐ€์ง„ ํ•ธ๋“ค๋Ÿฌ๋“ค๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•จ. ์ฆ‰, ๋ฒ„๋ธ”๋ง์ด๋‚˜ ์บก์ณ๋ง์„ ๋ฉˆ์ถ”๊ณ , ํ•ด๋‹น ์š”์†Œ์— ๋“ฑ๋ก๋œ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋“ค๋„ ๋ง‰์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋จ.
    ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ์— ํ• ๋‹น๋œ ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ชจ๋‘ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

์˜ˆ์‹œ

  <body>
    <div id="outer">
      Outer
      <button id="inner">Inner</button>
    </div>

    <script>
      document.querySelector("#outer").addEventListener("click", () => {
        alert("outer clicked!");
      });

      document.querySelector("#inner").addEventListener("click", (event) => {
        event.stopPropagation()
        alert("inner clicked - First Handler");
      });

      document.querySelector("#inner").addEventListener("click", (event) => {
        alert("inner clicked - Second Handler");
      });
    </script>

event.stopPropagation()์„ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ outer clicked alert๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  button์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์ธ inner clicked - First Handler์™€ inner clicked - Second Handler๋งŒ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž„.

์ฆ‰, ๋ถ€๋ชจ ์š”์†Œ์ธ #outer๋กœ์˜ ์ด๋ฒคํŠธ ์ „ํŒŒ(event propagation)์€ ๋ง‰์ง€๋งŒ ๋™์ผํ•œ ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ณ„์† ์‹คํ–‰๋จ

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ€๋ชจ ์š”์†Œ๋กœ์˜ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๋„ ๋ง‰๊ณ  ๊ฐ™์€ ์š”์†Œ ๋‚ด์˜ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ๋ง‰์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๋ฐ”๋กœ event.stopImmediatePropagation()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

  <body>
    <div id="outer">
      Outer
      <button id="inner">Inner</button>
    </div>

    <script>
      document.querySelector("#outer").addEventListener("click", () => {
        alert("outer clicked!");
      });

      document.querySelector("#inner").addEventListener("click", (event) => {
        event.stopImmediatePropagation()
        alert("inner clicked - First Handler");
      });

      document.querySelector("#inner").addEventListener("click", (event) => {
        alert("inner clicked - Second Handler");
      });
    </script>

#inner์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— event.stopImmediatePropagation()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
"inner clicked - First Handler"๋ผ๋Š” alert๋งŒ ๋ฐœ์ƒํ•˜๊ณ  #inner์˜ ๋‘ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๋ถ€๋ชจ ์š”์†Œ์ธ outer์˜ ์ด๋ฒคํŠธ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.

์ฆ‰, stopImmediatePropagation()๋Š” ๋ถ€๋ชจ ์š”์†Œ์ธ #outer๋กœ์˜ ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ์š”์†Œ ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ์ค‘๋‹จ์‹œํ‚ด

์บก์ณ๋ง

  • ์บก์ณ๋ง์ด๋ž€?
    ์ž์‹์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ถ€๋ชจ ์š”์†Œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์•ˆ์ชฝ ์ž์‹ ์š”์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์บก์ณ๋ง์ด๋ผ ํ•จ

ํ‘œ์ค€ DOM ์ด๋ฒคํŠธ์—์„œ ์ •์˜ํ•œ ์ด๋ฒคํŠธ ์ „ํŒŒ ํ๋ฆ„์—๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Œ

  1. ์บก์ณ๋ง ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„
  2. ํƒ€๊นƒ ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์‹ค์ œ ํƒ€๊นƒ ์š”์†Œ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋‹จ๊ณ„
  3. ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„ : ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„

์œ„์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ td ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์ตœ์ƒ์œ„ ์กฐ์ƒ์—์„œ ์‹œ์ž‘ํ•ด ์•„๋ž˜๋กœ ์ „ํŒŒ(์บก์ณ๋ง๋‹จ๊ณ„) -> ์ด๋ฒคํŠธ๊ฐ€ ํƒ€๊นƒ ์š”์†Œ์— ๋„์ฐฉํ•ด ์‹คํ–‰(ํƒ€๊นƒ๋‹จ๊ณ„) -> ๋‹ค์‹œ ์œ„๋กœ ์ „ํŒŒ(๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„)

์ด ๊ณผ์ •์„ ํ†ตํ•ด ํ• ๋‹น๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋จ
์บก์ฒ˜๋ง ๋‹จ๊ณ„๋ฅผ ์ด์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š์€๋ฐ, ์บก์ณ๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์žก์•„๋‚ด๋ ค๋ฉด addEventListener์˜ capture ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜๋ฉด ๋จ(default๋Š” false๋กœ, ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์žก์Œ)

elem.addEventListener(..., {capture: true})

ํ˜น์€ ์•„๋ž˜์™€ ๊ฐ™์ด true๋งŒ ์จ๋„ ๋จ
elem.addEventListener(..., true)
์˜ˆ์‹œ

์˜ˆ์‹œ

<style>
  body * {
    margin: 10px;
    border: 1px solid blue;
  }
</style>

<form>FORM
  <div>DIV
    <p>P</p>
  </div>
</form>

<script>
  for(let elem of document.querySelectorAll('*')) {
    elem.addEventListener("click", e => alert(`์บก์ณ๋ง: ${elem.tagName}`), true);
    elem.addEventListener("click", e => alert(`๋ฒ„๋ธ”๋ง: ${elem.tagName}`));
  }
</script>

์œ„์˜ ์˜ˆ์‹œ์—์„œ p ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒคํŠธ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Œ

  1. HTML -> BODY -> FORM -> DIV (์บก์ฒ˜๋ง ๋‹จ๊ณ„, ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์™ผ์ชฝ๊ณผ ๊ฐ™์ด alert๊ฐ€ ๋ฐœ์ƒํ•จ)
  2. p (ํƒ€๊นƒ ๋‹จ๊ณ„, ์บก์ฒ˜์™€ ๋ฒ„๋ธ”๋ง ๋‘˜ ๋‹ค์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋จ)
  3. DIV -> FORM -> BODY -> HTML (๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„, ๋‘ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์™ผ์ชฝ๊ณผ ๊ฐ™์ด alert๊ฐ€ ์‹คํ–‰๋จ)

์ด๋ฒคํŠธ ์œ„์ž„(event delegation)

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ DOM ์š”์†Œ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋Œ€์‹ , ํ•˜๋‚˜์˜ ์ƒ์œ„ DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ํŒจํ„ด
  • ์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๊ณตํ†ต์˜ ์ƒ์œ„ ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹จ ํ•˜๋‚˜๋งŒ ํ• ๋‹นํ•ด๋„ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ(์ด๋ฒคํŠธ ์ „ํŒŒ(๋ฒ„๋ธ”๋ง, ์บก์ณ๋ง์„ ์‚ฌ์šฉํ•ด์„œ))

๋งŒ์•ฝ ์ด๋ฒคํŠธ ์œ„์ž„์ด ์—†๋‹ค๋ฉด ๋ชจ๋“  ์š”์†Œ์— ์ผ์ผํžˆ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•จ
-> ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ์œ„์ž„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ์š”์†Œ์—๋งŒ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
ex: ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ์ด ์ˆ˜๋ฐฑ ๊ฐœ ์žˆ๋Š” ๋ชฉ๋ก์—์„œ ๊ฐ๊ฐ์˜ ์•„์ดํ…œ(<li>)์— ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฆฌ์ŠคํŠธ ์ „์ฒด(<ol>)์— ํ•œ ๋ฒˆ๋งŒ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์—ฌ์„œ ํด๋ฆญ๋œ ์•„์ดํ…œ์„ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž„

์˜ˆ์‹œ
<!DOCTYPE HTML>
<html>

<head>
  <link rel="stylesheet" href="messages.css">
  <meta charset="utf-8">
</head>

<body>

  <div id="container">
    <div class="pane">
      <h3>Horse</h3>
      <p>The horse is one of two extant subspecies of Equus ferus. It is an odd-toed ungulate mammal belonging to the taxonomic family Equidae. The horse has evolved over the past 45 to 55 million years from a small multi-toed creature, Eohippus, into the large, single-toed animal of today.</p>
      <button class="remove-button">[x]</button>
    </div>
    <div class="pane">
      <h3>Donkey</h3>
      <p>The donkey or ass (Equus africanus asinus) is a domesticated member of the horse family, Equidae. The wild ancestor of the donkey is the African wild ass, E. africanus. The donkey has been used as a working animal for at least 5000 years.</p>
      <button class="remove-button">[x]</button>
    </div>
    <div class="pane">
      <h3>Cat</h3>
      <p>The domestic cat (Latin: Felis catus) is a small, typically furry, carnivorous mammal. They are often called house cats when kept as indoor pets or simply cats when there is no need to distinguish them from other felids and felines. Cats are often valued by humans for companionship and for their ability to hunt vermin.
      </p>
      <button class="remove-button">[x]</button>
    </div>
  </div>

  <script>
    container.onclick = function(event) {
      if (event.target.className != 'remove-button') return;

      let pane = event.target.closest('.pane');
      pane.remove();
    };
  </script>

</body>
</html>

์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•ด์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋งŒ์œผ๋กœ ์‚ญ์ œ ๋ฒ„ํŠผ์ด ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

๋ผ๋Š” ์ƒ์œ„ ์š”์†Œ์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด๋‘๊ณ , ํ•˜์œ„ ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„ํŠผ์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ƒ์œ„ ์š”์†Œ๋กœ ์ „๋‹ฌ๋˜์–ด ๊ฒฐ๊ตญ container๊นŒ์ง€ ๋„๋‹ฌํ•จ(์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ์‚ฌ์šฉ๋จ)

์˜ˆ์‹œ ์ถœ์ฒ˜ : https://ko.javascript.info/event-delegation ๊ณผ์ œ 1๋ฒˆ

React: Redux, Recoil, Context API ๋น„๊ต ์„ค๋ช…

Redux

์žฅ์ 

  • ์šฉ๋Ÿ‰์ด ๊ฐ€๋ฒผ์›€
  • ํ™•์žฅ์„ฑ์ด ๋†’์Œ
  • flux ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฆ„ -> ๋ฒ„๊ทธ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•จ
  • action์„ ํ†ตํ•ด์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›€

๋‹จ์ 

  • ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์Œ(์•ก์…˜์ด๋‚˜ ๋””์ŠคํŒจ์น˜, ๋ฆฌ๋“€์„œ ๋“ฑ์„ ์ž‘์„ฑํ•ด์•ผํ•จ)
  • ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ์žˆ์Œ

๋ฆฌ๋•์Šค๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•„์š”ํ•œ ๋งŽ์€ ์–‘์˜ ์ƒํƒœ๋“ค์ด ์กด์žฌํ•  ๋•Œ (์ „์—ญ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ปด์งˆ ๋•Œ)
  • ์ƒํƒœ๋“ค์ด ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ
  • ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋กœ์ง์ด ๋ณต์žกํ•  ๋•Œ
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๊ฐ„ ๋˜๋Š” ํฐ ์‚ฌ์ด์ฆˆ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ์ฝ”๋“œ๊ฐ€ ๊ด€๋ฆฌ๋  ๋•Œ
  • ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์‹œ์ ์„ ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

=> ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๊ตณ์ด ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค!

React - Context API

์žฅ์ 

  • ๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • Context API๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ props drilling ์—†์ด prop๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

๋‹จ์ 

  • ์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ง์— ๊ด€๋ จ๋œ ์ตœ์ ํ™” x
    ์ „์—ญ์—์„œ context๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Provider๋ฅผ ๋งŒ๋“ค๊ฒŒ๋˜๋Š”๋ฐ, ํ”„๋กœ๋ฐ”์ด๋” ์ปดํฌ๋„ŒํŠธ๋Š” ๋งค๋ฒˆ ํ”„๋กœ๋ฐ”์ด๋”์— ์ƒˆ๋กœ์šด ๊ฐ’์ด ์ง€์ •๋˜์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•จ
    ๊ทธ ๊ฐ’์ด ์ƒˆ๋กœ์šด ์ฐธ์กฐ์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ณ  ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋จ

=> ์‰ฝ๊ฒŒ ์–˜๊ธฐํ•˜์ž๋ฉด ํ”„๋กœ๋ฐ”์ด๋” ํ•˜์œ„์—์„œ context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ํ”„๋กœ๋ฐ”์ด๋”์˜ value๋กœ ๊ณต์œ ํ•˜๋Š” prop์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ Œ๋”๋ง๋จ

์˜ˆ์‹œ
const MyContext = React.createContext();

funcrtion MyContextProvider({ children }) {
	const [state, setState] = useState("Context Value");
    
    return (
    	<MyContext.Provider 
        value={
            number, setNumber
        }
        >
        	{children}
        </MyContext.Provider>
    )
}

export default MyContextProvider;

createContext๋ฅผ ํ†ตํ•ด context ์ƒ์„ฑ ํ›„ provider๋ฅผ ๋งŒ๋“ค์–ด ์ƒํƒœ๋ฅผ ์ „์—ญ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

import { useState, createContext, useContext, useEffect } from "react";
import "./styles.css";

const MyContext = createContext(null);

const ChildComponentOne = () => {
  useEffect(() => {
    console.log("Child Component 1 is Rendered");
  });

  return <ChildComponentTwo />;
};

const ChildComponentTwo = () => {
  const [number, setNumber] = useContext(MyContext);

  useEffect(() => {
    console.log("Child Component 2 is Rendered");
  });

  return <>
    <p>{number}</p>
    <button onClick={() => setNumber(prev => prev + 1)}>+</button>
    <button onClick={() => setNumber(prev => prev - 1)}>-</button>
  </>
};

export default function App() {
  const [number, setNumber] = useState(0);

  return (
    <MyContext.Provider value={[number, setNumber]}>
      <ChildComponentOne />
    </MyContext.Provider>
  );
}

์ด ์ฝ”๋“œ์—์„œ ํ”„๋กœ๋ฐ”์ด๋” ์•ˆ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ˆœํžˆ ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ context๋ฅผ ์‚ฌ์šฉ์ค‘์ž„
๊ทธ๋Ÿฐ๋ฐ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์ƒ๊ธฐ๋Š” ์ฝ˜์†”์„ ๋ณด๋‹ˆ ์ปดํฌ๋„ŒํŠธ1๋„ ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง๋จ.
์™œ๋ƒํ•˜๋ฉด ์—์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ MyContext์˜ value๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ , ์ด๋กœ ์ธํ•ด ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฆฌ๋ Œ๋”๋ง๋จ ๋”ฐ๋ผ์„œ ChildComponentOne๋„ ๋ฆฌ๋ Œ๋”๋ง ๋จ

์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด React.memo๋ฅผ ์ ์šฉํ•ด๋„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ context๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด context๋ฅผ ์ฐธ์กฐํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง ๋จ -> ๊ฐ™์€ props๋กœ ๋ Œ๋”๋ง์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด React.memo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ ํ™”์— ๋„์›€์ด ๋˜์ง€๋งŒ props๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์Œ(์ตœ์ ํ™” x) -> ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ž^^!

Redux vs React - Cotnext API

Redux๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ
Context API๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌx, ๋‹จ์ˆœํžˆ ์ „์—ญ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์Œ

์ƒํƒœ ๊ด€๋ฆฌ๋ž€?

  • ์ดˆ๊ธฐ ๊ฐ’ ์ง€์ •
  • ํ˜„์žฌ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
  • ๊ฐ’ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•จ

cotnext api๋Š” ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•จ. ๋Œ€์‹  provider์˜ value๋กœ useState์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋„ฃ์–ด ์‚ฌ์šฉ์ž ์ธก์—์„œ setState๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผํ•จ(์ฆ‰, ์ƒํƒœ ๋ณ€ํ™”๋Š” ์ƒํƒœ๋ฅผ ์„ ์–ธํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป)


<MyContext.Provider value={{ number, setNumber }}>
  <ChildComponent />
</MyContext.Provider>

์—ฌ๊ธฐ์„œ setNumber ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผํ•จ
ํ•˜์ง€๋งŒ ๋ฆฌ๋•์Šค์—์„œ๋Š” ์•ก์…˜์„ ์ •์˜ํ•˜๊ณ  ์•ก์…˜์„ ๋ฆฌ๋“€์„œ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•จ

// ์•ก์…˜ ์ •์˜
const INCREMENT = 'INCREMENT';

// ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜
function increment() {
  return { type: INCREMENT };
}

// ๋ฆฌ๋“€์„œ
function counter(state = 0, action) {
  switch (action.type) {
    case INCREMENT:
      return state + 1;
    default:
      return state;
  }
}

๋•Œ๋ฌธ์— ๋ฆฌ๋•์Šค๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์„ ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•จ
๋˜ํ•œ ์ค‘์•™ ์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ๋…ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— context api๋ณด๋‹ค ์ข€ ๋” ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ์Œ

Recoil

  • ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • atom -> selector -> component๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ€์ง

์žฅ์ 

  • useState์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋‚ฎ์Œ
  • ์‚ฌ์šฉ๋ฒ•์ด ์ง๊ด€์ ์ž„(์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จ)
  • ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๊ฑฐ์˜ ์—†์Œ
  • ๋™์‹œ์„ฑ ์ง€์›(concurrent mode) : ๋ฆฌ์•กํŠธ์—์„œ ๋ Œ๋”๋ง ๋™์ž‘์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•ด ์ ์ ˆํ•œ ๋•Œ์— ๋ Œ๋”๋ง์„ ํ•ด์คŒ
    recoil์—์„œ๋Š” ๋น„๋™๊ธฐ selector๋ฅผ ๋งŒ๋“ค๊ณ  suspense๋กœ ๊ฐ์‹ธ๋ฉด ๋ฆฌ์•กํŠธ์˜ ๋™์‹œ์„ฑ ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ์บ์‹ฑ ์ง€์›
  • atom์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค selector๊ฐ€ ๋ณ€๊ฒฝ๋จ -> atom์˜ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋ฆฌ์ฝ”์ผ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฉ”๋ชจ์ด์ฆˆํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

๋‹จ์ 

  • ๋ฐ๋ธŒํˆด์ด ๋นˆ์•ฝํ•จ
  • recoil์—์„œ ์ œ๊ณตํ•˜๋Š” ํ›…๋“ค์ด ์•„์ง unstableํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

[react] useState

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋ฉฐ ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—…๋ฐ์ดํŠธ ๋ ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ํ™”๋ฉด์ด ์žฌ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

useState๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” ์ด์œ 

DOM๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ ์žˆ๋Š” ์ผ๋ฐ˜๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ Œ๋”๋ง ๋ ๋•Œ ๋งˆ๋‹ค ์ดˆ๊ธฐํ™” ๋˜์ง€๋งŒ state ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•ด์ค๋‹ˆ๋‹ค.
๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒˆ๋กœ๊ณ ์ง์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— state์˜ ์ตœ์‹ ์ƒํƒœ๋กœ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐฑ์‹ ํ•ด ์ฃผ๋Š”๊ฒƒ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์— state๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ state๋ฅผ ๊ฐฑ์‹ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ๋ฐœ์ƒํ•  ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์•Œ์•„์„œ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

setState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ• ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.