๐Ÿ“ JAMstack๊ณผ ์ •์  ์›น

๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์‚ฌ์šฉํ•œ ์›น ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค Netlify์— ๊ด€ํ•ด ์•Œ์•„๋ณด๋˜ ์ค‘ JAMstack์ด๋ž€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์™”๋‹ค.

JAMstack๊ณผ ์ด์— ๊ด€๋ จ๋œ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

๋™์ / ์›น๊ณผ ์ •์  ์›น

๋™์  ์›น์€ ์‚ฌ์šฉ์ž(ํด๋ผ์ด์–ธํŠธ) ์š”์ฒญ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ์›น ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ ์›น ์•ฑ ์„œ๋ฒ„(WAS)๊นŒ์ง€ ๊ฐ€๋‹ฟ์•„์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฆ‰์„์—์„œ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋™์  ํŽ˜์ด์ง€๋Š” ์†Œ์…œ ๋„คํŠธ์›Œํฌ ๋Œ“๊ธ€ ์ฐฝ์ด๋‚˜ ์‡ผํ•‘ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, ์ถ”์ฒœ ์ƒํ’ˆ์ฒ˜๋Ÿผ ์‹œ์‹œ๊ฐ๊ฐ์œผ๋กœ ๋‚ด์šฉ์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์— ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

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

์ •์  ์‚ฌ์ดํŠธ๋Š” ์‹คํ–‰์ด ์›น ์„œ๋ฒ„ ์ž์ฒด์—์„œ ์ผ์–ด๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— DB๊นŒ์ง€ ๊ฐ–์ถ˜ ์ดˆ๊ณ ์„ฑ๋Šฅ ์›น ํ˜ธ์ŠคํŠธ๊ฐ€ ํ•„์š” ์—†๋‹ค. ๋งŽ์€ ์ •์  ์‚ฌ์ดํŠธ๋Š” CDN์— ๋ฐฐํฌ๋œ๋‹ค.

statid/dynamic page

์ •์  ํŽ˜์ด์ง€๋Š” ์›น ์„œ๋ฒ„๋งŒ์„ ํ•„์š”๋กœ ํ•˜์ง€๋งŒ, ๋™์  ํŽ˜์ด์ง€๋Š” ์›น ์„œ๋ฒ„์™€ WAS๊นŒ์ง€ ํ•„์š”ํ•˜๋‹ค.

์›น ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ •์  ํŽ˜์ด์ง€(html, jpeg, css, js๋“ฑ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ฒ„๋‹ค. WAS๋Š” HTML ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” DB ์กฐํšŒ๋‚˜ ๋‹ค์–‘ํ•œ ๋กœ์ง์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์„œ๋ฒ„๋‹ค.

LAMP, MEAN ์Šคํƒ

์žผ์Šคํƒ ์ด์ „์— LAMP, MEAN ์Šคํƒ์ด ์žˆ์—ˆ๋‹ค. LAMP ์Šคํƒ์€ Linux ์šด์˜์ฒด์ œ, Apache ์›น ์„œ๋ฒ„, MySQL, PHP/Python์˜ ์•ฝ์ž๋ฅผ ๋”ด ์กฐํ•ฉ์ด๋‹ค. ์˜ค๋žซ๋™์•ˆ ๊ณต์ธ๋œ ์ „ํ†ต์ ์ธ ์›น ๊ตฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ LAMP ๊ธฐ๋ฐ˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ์›น ์„œ๋ฒ„๋Š” ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ด ์ฝ”๋“œ๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ MySQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์›น ํŽ˜์ด์ง€๋ฅผ ์ฆ‰์„์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. MEAN ์Šคํƒ์€ MongoDB, ExpressJS, AngularJS, NodeJS๋ผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ์›น ๊ตฌ์กฐ๋ฅผ ๋œปํ•œ๋‹ค. Frontend/Backend ์–ธ์–ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํ†ต์ผํ•˜์—ฌ ํŽธ์˜์„ฑ์„ ์ถ”๊ตฌํ•œ ์ผ€์ด์Šค๋‹ค.

LAMP ์Šคํƒ๊ณผ MEAN ์Šคํƒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ legacy web์€ ๋™์ ์ด๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 24์‹œ๊ฐ„ ์ƒ์ฃผํ•˜๋Š” ์›น ์„œ๋ฒ„๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๊ตฌ์กฐ ๋งŒํผ์ด๋‚˜ ๋ณด์•ˆ์— ์‹ ๊ฒฝ์„ ์จ์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋”์šฑ์ด ๋™์  ์›น ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋กœ๋“œํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฐ™์€ ์ง€์—ฐ์‹œ๊ฐ„์„ ๋‚ฉ๋“ํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ๋งŽ์•„์ง์— ๋”ฐ๋ผ ์ •์  ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์•„์ง€๋Š” ์ถ”์„ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ถ”์„ธ์™€ ๋”๋ถˆ์–ด JAMstack๋„ ์„ฑํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. JAMstack์€ ์ •์  ์›น์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

legacy web vs JAMstack

JAMstack

์žผ์Šคํƒ์ด๋ž€ Javascript, APIs, Markup์˜ ์•ฝ์ž๋กœ, ์ผ์ข…์˜ ์›น ์‚ฌ์ดํŠธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋Š” Javascript๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ , DB๋‚˜ ์„œ๋ฒ„ ๊ด€๋ จ ๊ธฐ๋Šฅ์€ API๋กœ ๋Œ€์ฒดํ•˜๊ณ , SSG(Static Site Generator)๋กœ Markup์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘๋Š” ๊ฐœ๋…์„ ๋งํ•œ๋‹ค. ์žผ์Šคํƒ์€ 2018๋…„ ํด๋ผ์šฐ๋“œ ๋ฐ ์›น ํ˜ธ์ŠคํŒ… ์—…์ฒด์ธ Netlify์—์„œ ์ •์  ์›น ์ถ”์„ธ์— ๋งž์ถฐ ์ œ์•ˆํ•œ ์›น ๊ฐœ๋ฐœ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค. (โ€˜์ •์  ์›นโ€™์ด ๊ฐ€์ง„ ๋ถ€์ •์ ์ธ ์–ด๊ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์žผ์Šคํƒ์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ๊ณ ์•ˆํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.) ์žผ์Šคํƒ์€ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•์„ ํ†ตํ•œ ์›น ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ์†๋„ ํ–ฅ์ƒ๊ณผ ์›นํŽ˜์ด์ง€ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•(์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ)์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ์žผ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ์›น ํŽ˜์ด์ง€๋Š” ํ‘œ์ค€ ๋งˆํฌ์—… ์–ธ์–ด๋กœ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ์•ฑ ์„œ๋ฒ„๋‚˜ ์„œ๋ฒ„ ์ธก ๊ธฐ์ˆ (Node.js ๋“ฑ)์— ๋Œ€ํ•œ ์ข…์†์„ฑ ์—†์ด ์–ด๋””์„œ๋‚˜ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

2010๋…„๋Œ€ ์ค‘๋ฐ˜ ์ •์  ์›น ์ธ๊ธฐ์— ํž˜์ž…์–ด ์ œํ‚ฌ(Jeckyll), ํœด๊ณ (Hugo), ๊ฐœ์ธ ๋น„(Gatsby), Next.js์™€ ๊ฐ™์€ ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ(SSG)๊ฐ€ ์ƒ๊ฒจ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. SSG์˜ ๋ถ€ํฅ์€ ์žผ์Šคํƒ์˜ ๋ถ€ํฅ๊ณผ ๊ฐ™๋‹ค. ์žผ์Šคํƒ ์•„ํ‚คํ…์ฒ˜๋Š” ๋™์  ์›น์ด ์•„๋‹Œ ์ •์  ์›น์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ, ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋™์  ํŽ˜์ด์ง€ ์ค‘์‹ฌ์˜ ์‚ฌ์ดํŠธ์™€ ๋ฐฑ์—”๋“œ ์–ธ์–ด์— ์˜์กดํ•˜๋Š” ์•ฑ์€ ์žผ์Šคํƒ ๋„์ž…์ด ์–ด๋ ต๋‹ค.

Gatsby SSG์™€ netlify ์›น ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ์•„์ฃผ ์‰ฝ๊ฒŒ ์žผ์Šคํƒ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Netlify

netlify ์„œ๋น„์Šค๋Š” ์žผ์Šคํƒ ์ฒ ํ•™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ ๊ฐ์—๊ฒŒ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.

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

Github Repo์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฒฐ๋ก 

์ •์  ์›น ์ธ๊ธฐ์— ํž˜์ž…์–ด ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ SSG๊ฐ€ ์ƒ๊ฒจ๋‚˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , SSG์˜ ์ธ๊ธฐ๊ฐ€ JAMstack ๊ฐœ๋ฐœ๋ก ์˜ ๋ฐœ์ „์œผ๋กœ ์ด์–ด์กŒ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์—ผ๋‘ํ•˜์ž.

์ •์ /๋™์  ์›น์ด SPA/MPA, CSR/SSR๋ผ๋Š” ๊ฐœ๋…๊ณผ ์–ด๋–ค ์—ฐ๊ด€์„ ๋งบ๊ณ  ์žˆ๋Š” ๊ฑด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์˜๋ฌธ์„ ํ•ด์†Œํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

Netlify์™€ JAMstack์˜ ์ƒ์„ธํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ•œ๊ฒƒ๋„ ์•„์‰ฝ๋‹ค. CDN์„ ๋น„๋กฏํ•œ ๊ฐœ๋…๋“ค์ด ์•„์ง ์–ด๋ ต๋‹ค.

References

์˜คํ”ˆ์†Œ์Šค ๋ธ”๋กœ๊ทธ ๊ธฐ์ˆ ์˜ ์ƒˆ ๋ฐ”๋žŒ! ์ •์  ํŽ˜์ด์ง€๋ž€?

์žผ์Šคํƒ, ์›น ๊ฐœ๋ฐœ์„ ๋’ค์ง‘๋Š” ์ •์  ์›น์‚ฌ์ดํŠธ ํ˜๋ช…

์ •์  ํŽ˜์ด์ง€์™€ ๋™์  ํŽ˜์ด์ง€

์žผ์Šคํƒ ์†Œ๊ฐœ: ์•ˆ์ „ํ•œ ๊ณ ์„ฑ๋Šฅ ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ

JAM Stack ๊ฐœ๋… ์ •๋ฆฌํ•˜๊ธฐ

Web Server์™€ WAS์˜ ์ฐจ์ด


Written by@Lechuck
์ดˆ๋ณด ๊ฐœ๋ฐœ์ž

GitHub