React์— ๋ฌผ์ฃผ๊ธฐ..?๐ŸŒผ

๋บฉยท2022๋…„ 5์›” 31์ผ
1

์‹ ๊ธฐํ•œ ๊ฐœ๋ฐœ ์„ธ์ƒ

๋ชฉ๋ก ๋ณด๊ธฐ
10/11
post-thumbnail

Hydration = ์ˆ˜ํ™”

์ˆ˜ํ™”์— ์‚ฌ์ „์ ์ธ ๋œป ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์šฉ์•ก ์†์—์„œ ์šฉ์งˆ ๋ถ„์ž๋‚˜ ์ด์˜จ์ด ์šฉ๋งค์ธ ๋ฌผ ๋ถ„์ž์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ถ„์ž๊ตฐ์„ ์ด๋ฃจ๊ฒŒ ๋จ. ๋˜๋Š” ๊ทธ๋Ÿฐ ํ˜„์ƒ

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๋ฌผ์— ๋…น์ด๋Š”๊ฑด๋ฐ ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ๋ฆฌ์•กํŠธ์— ๋ฌผ์„ ์ฃผ๋Š”๊ฒƒ๋„ ์•„๋‹Œ๋ฐ ์™œ hydration์ด๋ž€ ํ‘œํ˜„์„ ์“ฐ๋Š”๊ฑธ๊นŒ?

์›นํŽ˜์ด์ง€๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ๊ณผ์ •์—์„œ React์™€ ๊ฐ™์€ Client Side Redering(CSR) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฒˆ๋“ค๋œ js๋ฅผ ๊ฐ€์ ธ์™€ DOM์„ ๋žœ๋”๋งํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋งŽ์€ ์žฅ์ ๊ณผ ํ•จ๊ป˜ ์ดˆ๊ธฐ ๋žœ๋”๋ง์˜ ์†๋„ ์ €ํ•˜, SEO์˜ ํ•œ๊ณ„ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์  ๋˜ํ•œ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ Server Side Rendering(SSR)์„ ์„ ํƒํ•˜๊ณค ํ•˜๋Š”๋ฐ, SSR์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— JavaScript๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณด๋ฉด SSR์ด ๋ฌด์กฐ๊ฑด ์ข‹์€๊ฒƒ ๊ฐ™์ง€๋งŒ SSR๊ณผ CSR๋„ ๋ฌด์—‡์„ ์ค‘์ ์— ๋‘๋Š๋ƒ์— ๋”ฐ๋ผ ์žฅ๋‹จ์ ์ด ์žˆ์–ด ์™”๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ Server Side ๋‹จ์—์„œ ๋จผ์ € ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  JSํŒŒ์ผ๋“ค๋„ ๋ฒˆ๋“ค๋งํ•œ ํ›„์— ๋‘˜๋‹ค Client Side๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐ์„ ํ•ด๋ƒˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ์˜ DOM์€ ๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ์ •์ ์ธ(๋ฉ”๋งˆ๋ฅธ) ์ƒํƒœ(dehydration)์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ HTML ์ฝ”๋“œ์™€ JS ์ฝ”๋“œ๋ฅผ ์„œ๋กœ ๋งค์นญ์‹œ์ผœ ๋™์ ์ธ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋žœ๋”๋งํ•˜๋Š” ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ ์ด๊ฒŒ ๋ฐ”๋กœ Hydration์ด๋‹ค.

์ฆ‰, Hydration์€ ๋ธŒ๋ผ์šฐ์ €์— ์‚ฌ์ดํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ์›น์‚ฌ์ดํŠธ์˜ ๋™์ ์ธ ์ƒํƒœ์™€ ์ •์ ์ธ ์ƒํƒœ๋ฅผ ๋น„์œ ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋ง์ด๋‹ค.

render์™€ hydrate

๊ทธ๋ŸผReactDOM.render์™€ ReactDOM.hydrate์˜ ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด๋ณด์ž.
์ผ๋‹จ render๋Š” DOM์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

ReactDOM.render(element, container[, callback])

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

hydrate๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด

ReactDOM.hydrate(element, container[, callback])

ํ˜•ํƒœ๊ฐ€ render์™€ ๋˜‘๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ, hydrate๋Š” ๋ Œ๋”๋ง์€ ํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ ์ง€์ •๋œ DOM ์š”์†Œ์— ํ•˜์œ„๋กœ hydrate ์ฒ˜๋ฆฌ๋งŒ ํ•œ๋‹ค. ์ด๋Š” ๋ Œ๋”๋ง์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•  DOM์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด DOM Tree์—์„œ ํ•ด๋‹น๋˜๋Š” DOM ์š”์†Œ๋ฅผ ์ฐพ์•„ ์ •ํ•ด์ง„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†์„ฑ(์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ)๋“ค๋งŒ ๋ถ€์ฐฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

HTML Streaming๊ณผ Selective Hydration

์ด์ œ ์„œ๋ฒ„ ๋ Œ๋”๋ง๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น ๋ฅธ First Contentful Paint๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ์—์„œ hydration์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ณ๋ฅผ ์ƒˆ๋กœ์šด ์†”๋ฃจ์…˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, SSR์˜ ํŽ˜์ด์ง€๋Š” ์‹ค์ œ๋กœ JS๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฒจ๋ถ€๋  ๋•Œ๊นŒ์ง€ ์ž…๋ ฅ์— ์‘๋‹ตํ•  ์ˆ˜ ์—†์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React18๋ถ€ํ„ฐ HTML Streaming๊ณผ Selective Hydration์ด ๋„์ž…๋๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด SSR์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋‘๊ฐ€์ง€ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ด ๋ฒจ๋กœ๊ทธ์— ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋†“์•˜๋‹ค.

๋งˆ๋ฌด๋ฆฌ

SSR์˜ ๋ณ‘๋ชฉํ˜„์ƒ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํ™˜๊ฒฝ์ด ๋˜์—ˆ์ง€๋งŒ, ์„ค๊ณ„์˜ ๋ณต์žก์„ฑ์€ ํ•œ ์ธต ๋” ์˜ฌ๋ผ๊ฐ„๊ฑฐ ๊ฐ™๊ธดํ•˜๋‹ค..

profile
์ด์ œ๋Š” ๋ณ‘์•„๋ฆฌ๋Š” ๋ฒ—์–ด๋‚˜์•ผํ•˜๋Š” ํ”„๋ก ํŠธ๊ฐœ๋ฐœ์ž

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 7์›” 26์ผ

Hydration์— ๊ด€ํ•œ ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค
๊ธ€์„ ์ฝ๋‹ค๊ฐ€ ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒจ์„œ ์งˆ๋ฌธ ๋‚จ๊น๋‹ˆ๋‹ค.
"
๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ Server Side ๋‹จ์—์„œ ๋จผ์ € ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  JSํŒŒ์ผ๋“ค๋„ ๋ฒˆ๋“ค๋งํ•œ ํ›„์— ๋‘˜๋‹ค Client Side๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐ์„ ํ•ด๋ƒˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ์˜ DOM์€ ๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ์ •์ ์ธ(๋ฉ”๋งˆ๋ฅธ) ์ƒํƒœ(dehydration)์ผ ๊ฒƒ์ด๋‹ค.
"
์œ„ ๋ฌธ์žฅ์—์„œ ์ด๋ฏธ JSํŒŒ์ผ๋“ค๋„ ๋ฒˆ๋“ค๋งํ•œ ํ›„ ๋ณด๋‚ด์ฃผ๋ฉด HTML์—์„œ๋„ js ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ์•„๋‹Œ๊ฑด๊ฐ€์š”?? ์ด ๋•Œ์˜ DOM์€ ๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ์ƒํƒœ ๋ผ๋Š”๊ฒŒ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ