Next.js: TTFB ๋ฐ CPU ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ ๋ Œ๋”๋ง

์— ๋งŒ๋“  2017๋…„ 02์›” 19์ผ  ยท  36์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

TTFB ๋ฐ CPU ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ ๋ Œ๋”๋ง pages > 50KB (๊ฐ€์ƒ ์ŠคํŠธ๋ฆผ ์˜ค๋ฒ„ํ—ค๋“œ) ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

https://github.com/zeit/next.js/pull/767 ์„ ๋Œ€์ฒด

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  36 ๋Œ“๊ธ€

ํ•œ๊ฐ€์ง€ ์–ธ๊ธ‰ํ• ๊ฑด..

์ŠคํŠธ๋ฆผ ๋ Œ๋”๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์˜ ์–‘์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ํ–ฅ์ƒ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

SSR ๋ Œ๋”๋ง ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ React์˜ renderToString() ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 2.0 ์ดํ›„์— ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ ๋ Œ๋”๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์˜ ์–‘์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ํ–ฅ์ƒ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

_aickin/react-dom-stream์—์„œ _

ReactDOM.renderToString์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ CPU๋ฅผ ์ง€๋ฐฐํ•˜๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ๊ณ ๊ฐˆ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘์€ ํŽ˜์ด์ง€์™€ ํฐ ํŽ˜์ด์ง€๊ฐ€ ํ˜ผํ•ฉ๋œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„์—์„œ ํŠนํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ์€ ๋น„๋™๊ธฐ ๋ฐ ๋ถ€๋ถ„ ๋ชจ๋‘๋ฅผ ํ†ตํ•ด ํฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์ค„์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๊ฐ™์€ ๋งฅ๋ฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ https://github.com/FormidableLabs/rapscallion์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ŠคํŠธ๋ฆฌ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ฆ‰์‹œ ์ฝ˜ํ…์ธ  ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ:

  • ๋ Œ๋”๋ง์€ ๋น„๋™๊ธฐ์‹์ด๋ฉฐ ๋น„์ฐจ๋‹จ์ž…๋‹ˆ๋‹ค.
  • Rapscallion์€ renderToString๋ณด๋‹ค ์•ฝ 50% ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ์ŠคํŠธ๋ฆฌ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ฆ‰์‹œ ์ฝ˜ํ…์ธ  ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ด์ ์„ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ ์š”์†Œ์˜ HTML์„ ์ƒ์šฉ๊ตฌ๋กœ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋”์šฑ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์บ์‹ฑ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

#2279์— Rapscallion์˜ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค... Rapscallion + Next๊ฐ€ ๋ฏธ์ณค์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ/์•ฝ์† ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜์ค€ ์บ์‹ฑ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ฒŒ์ž„ ์ฒด์ธ์ €์ž…๋‹ˆ๋‹ค... :godmode:

์ด์ œ React 16์—๋Š” ์ž์ฒด renderToNodeStream ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ next.js๊ฐ€ renderToString ๋Œ€์‹  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํฐ ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @timneutkens ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

์ด๋ฏธ ์ถ”๊ฐ€ํ•  ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์†Œ์‹์ด ์žˆ๋‚˜์š”?

Next.js๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋น„๋™๊ธฐ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ render ( renderToString ๋ฅผ ๊ธฐ๋ณธ ๋ Œ๋”๋Ÿฌ๋กœ ์‚ฌ์šฉ)๋ฅผ ๋…ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด razzle ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ  Next.js์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปค์Šคํ…€ ๋น„๋™๊ธฐ ๋ Œ๋”๋Ÿฌ.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ babel ๊ตฌ์„ฑ.

์–ด๋–ค ๋กœ๋“œ๋งต/์ŠคํŠธ๋ฆฌ๋ฐ ๋ Œ๋”๋ง ์ง€์› ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ next.js์— ์ด๊ฒƒ์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

React Fizz / ์ด์— ๋Œ€ํ•œ ๊ณ„ํš์„ ๊ตฌํ˜„ํ•˜๋Š” React ํŒ€์—์„œ ๋ณด๋ฅ˜ ์ค‘์ž…๋‹ˆ๋‹ค.

@timneutkens ์—ฌ๊ธฐ์—์„œ ์ถ”์ ํ•  ๋ฌธ์ œ, PR์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

2019๋…„ 8์›” 8์ผ์— ๊ฒŒ์‹œ๋œ Facebook ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ
https://reactjs.org/blog/2019/08/08/react-v16.9.0.html

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

์•„์ง ์„œ๋ฒ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด :)

next.js์—์„œ renderToNodeStream์„ ๊ตฌํ˜„ํ•˜๋Š” ์—…๋ฐ์ดํŠธ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

<3

๋ชจ๋“  ์—…๋ฐ์ดํŠธ?

@StarpTech ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์‚ดํŽด๋ณด์•˜๊ณ (์ด ๊ธฐ๋Šฅ๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!) ๋ฐ˜์‘ ํŒ€์ด react-flight ๋ผ๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ์†”๋ฃจ์…˜์˜ ๊ธฐ๋ฐ˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

๋ฐ˜์‘ ๋น„ํ–‰:

์ปค์Šคํ…€ React ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ—˜์ ์ธ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์ž‘์—…์— ์•ฝ๊ฐ„์˜ ๋น›์„ ๋น„์ถ”๋Š” ๊ด€๋ จ PR, ๋‚ด๊ฐ€ ํ•ด์„ํ•œ ๊ฒƒ(์ด ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹˜ ๐Ÿ™ˆ)
#17285 : ๋น„ํ–‰์„ ์œ„ํ•œ ๊ธฐ๋ณธ API, ์„œ๋ฒ„๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ฌธ์ž์—ด๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ์ฒญํฌ์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋Š” ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๊ฐ€ ์ŠคํŠธ๋ฆผ์—์„œ ์‹ค์ œ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ถˆ์™„์ „ํ•˜์ง€๋งŒ ํฅ๋ฏธ๋กœ์šด ๊ตฌ๋ฌธ์ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค .

# 17398 ์ตœ๊ทผ์˜ PR, ๊ทธ๋ž˜์„œ ๋ฉ์–ด๋ฆฌ์œ„ํ•œ API (๋‹น์‹ ์ด ์šด์ด ๋Š๋ผ๋Š” ๊ฒฝ์šฐ) ๋‹น์‹  ์ž์‹ ์—์„œ ๊ทธ ๋ถ€๋ถ„์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ•ฉ์ณ์งˆ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ๋‹ค์†Œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. :)

_์ฃผ์ œ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ ๋‚ด์šฉ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ํ˜ธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)_

@pepf ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํ . ์—ฌ๋Ÿฌ๋ถ„, ํฅ๋ฏธ๋กœ์šด ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์™œ NextJS๊ฐ€ ์ง€๊ธˆ streamAsString์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„œ์ŠคํŽœ์Šค ๋ฐ ๊ธฐํƒ€์— ๋Œ€ํ•œ React ์ง€์› SSR์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@arunoda ์ € ๋ฉ”๋ชจ๋ฆฌ ๋žŒ๋‹ค ํ•จ์ˆ˜ ๋˜๋Š” Cloudflare ์ž‘์—…์ž์— ๋งค์šฐ ์ค‘์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ์ค„์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์†Œ์‹์ด ์žˆ๋‚˜์š”?

์†Œ์‹ ์žˆ์–ด? :ํ”ผ

๋ฐ˜์‘ ์„œ์ŠคํŽœ์Šค๊ฐ€ ์ ˆ๋Œ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋‚˜๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ์ฝ˜ํ…์ธ ๊ฐ€ ์ ์€ ํŽ˜์ด์ง€(vercel์˜ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ์—์„œ ๋ Œ๋”๋ง๋จ)์—์„œ 800-1000ms์˜ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ HTML์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ฉด ์ดˆ๊ธฐ ์ ‘์ด‰ ์ง€์ ์ด ์ฆ๊ฐ€ํ•˜๊ณ  ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ธ์ง€๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋กœ๋“œ ux๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

image

NextJS๊ฐ€ ์•„๋‹Œ Vercel์˜ ํ•œ๊ณ„์ธ๊ฐ€์š”? Vercel์€ Lambda์™€ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ฝœ๋“œ ์Šคํƒ€ํŠธ์—…์— ํฌ์ƒ๋ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ ํŒ€์€ ์ฝ˜ํ…์ธ ๊ฐ€ ๋งŽ์€ ์‚ฌ์ดํŠธ๋ฅผ ๋งŽ์ด ์šด์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ „์ฒด ์š”์ฒญ์— ๋Œ€ํ•ด ํƒ€์ด๋ฐ์ด 50ms ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์—ฌ๊ธฐ์„œ ์€์ด์•Œ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์€์ƒ‰ ์ด์•Œ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํ™˜์˜ํ• ๋งŒํ•œ ๊ฐœ์„ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

50ms๋Š” ์–ธ๊ธ‰๋œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„์— ๋น„ํ•ด ์ตœ์ ํ™”ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ž‘๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ Cloudflare ์ž‘์—…์ž์™€ ๊ฐ™์€ ์—ฃ์ง€์—์„œ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Cloudflare ์—ฃ์ง€ ์œ„์น˜์— ๋Œ€ํ•œ ํ•‘ ๋˜๋Š” ์ตœ์†Œ ์ ˆ๋ฐ˜ ), Cloudflare ์ž‘์—…์ž๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ ์ผ๋ฐ˜์ ์œผ๋กœ 5๋ฐ€๋ฆฌ์ดˆ ๋ฏธ๋งŒ์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ, Lambda ๋ฐ Lambda@Edge ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ์ฝœ๋“œ ์Šคํƒ€ํŠธ์—์„œ ์‘๋‹ตํ•˜๋Š” ๋ฐ 1์ดˆ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด Varcel(์ž์ฒด cdn์„ ๋นŒ๋“œํ•จ)์ด ๊ณ ์šฉํ•œ next.js ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋‚˜์€ ์‚ฌ๋ก€๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด next.js๋ฅผ Cloudflare ์ž‘์—…์ž์—๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•œ ๋ฌธ์„œ๋‚˜ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ํ–ˆ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์ด ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋‚ด ํœด๋Œ€์ „ํ™”์—์„œ ์ „์†ก๋จ

2020๋…„ 7์›” 5์ผ ์˜คํ›„ 5์‹œ 47๋ถ„์— Wis [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.


50ms๋Š” ์–ธ๊ธ‰๋œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„๊ณผ ๋น„๊ตํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๊ธฐ์— ๋งค์šฐ ๋‚ฎ๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ Cloudflare ์ž‘์—…์ž์™€ ๊ฐ™์€ ์—ฃ์ง€์—์„œ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” 50ms๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค(๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Cloudflare ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํ•‘ ๋˜๋Š” ์ตœ์†Œํ•œ ์ ˆ๋ฐ˜), Cloudflare ์ž‘์—…์ž๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ ์ผ๋ฐ˜์ ์œผ๋กœ 5๋ฐ€๋ฆฌ์ดˆ ๋ฏธ๋งŒ์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ, Lambda ๋ฐ Lambda@Edge ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ์ฝœ๋“œ ์Šคํƒ€ํŠธ์—์„œ ์‘๋‹ตํ•˜๋Š” ๋ฐ 1์ดˆ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด Varcel(์ž์ฒด cdn์„ ๋นŒ๋“œํ•จ)์ด ๊ณ ์šฉํ•œ next.js ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋‚˜์€ ์‚ฌ๋ก€๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

50ms๋Š” ์–ธ๊ธ‰๋œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„์— ๋น„ํ•ด ์ตœ์ ํ™”ํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ์ž‘๊ณ  ์ƒ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ๋‚˜๋Š” 50ms ์‘๋‹ต ์‹œ๊ฐ„์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” NextJS์˜ SRR์ด ์ฝ˜ํ…์ธ ๊ฐ€ ๋งŽ์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ๋ถ„๋‹น 3,000๊ฐœ ์ด์ƒ์˜ ์š”์ฒญ์—์„œ๋„ ์ƒ๋Œ€์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ์ง€์ ํ•œ ๊ฒƒ๋ฟ์ด๋ฏ€๋กœ Switz์˜ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๊ณณ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด next.js๋ฅผ Cloudflare ์ž‘์—…์ž์—๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•œ ๋ฌธ์„œ๋‚˜ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

HTML ๋‚ด์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ์œผ๋ฉฐ ์„œ๋ฒ„ ์‘๋‹ต ์‹œ๊ฐ„์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค! :(

@huggler ์ด ์˜ˆ์ œ ๋ฅผ cacheable-response ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redis(๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ html์„ ์บ์‹œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต ์‹œ๊ฐ„์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด next.js๋ฅผ Cloudflare ์ž‘์—…์ž์—๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•œ ๋ฌธ์„œ๋‚˜ ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ํ–ˆ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์ด ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

@switz @tils13 https://fab.dev/ ํ™•์ธํ•˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ๋Š” 2020๋…„ ์ดˆ์— ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  ๊ทธ๊ฒƒ์€ ์‹œํ—˜ํŒ ์ƒํƒœ์— ์žˆ์—ˆ์ง€๋งŒ ๊ฝค ๋ฉ€๋ฆฌ ์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ๊ฐ€๋กœ๋ง‰๋Š” ์ œํ•œ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” Cloudflare ์ž์ฒด์˜€์ง€๋งŒ ์ง€๊ธˆ์ฏค์ด๋ฉด ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๋™์•ˆ ๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์žฌํ‰๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฒˆ์— ๋ณด๋‹ˆ ๊ฝค ์‹ฌ๊ฐํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ https://github.com/flareact/flareact๋ฅผ ์ฃผ์‹œํ•˜๊ณ 

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰