Is htmx Just Another JavaScript Framework?

Alexander Petros

#์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์Œ

htmx๋ฅผ ์ฒ˜์Œ ๋“ฃ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ์„œ ํ”ํžˆ ๋‚˜์˜ค๋Š” ๋น„ํŒ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋‹น์‹ ์˜ ํ•ด๊ฒฐ์ฑ…๋„ ๋˜ ๋‹ค๋ฅธ ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

์ด ๋น„ํŒ์„ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‚˜๋ˆ„์–ด, htmx๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐฉ์น˜ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„๋ด…์‹œ๋‹ค.

#๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฐจ์ด

์ผ๋ถ€ htmx ์˜นํ˜ธ์ž๋“ค์€ โ€œhtmx๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹คโ€œ๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ€œํ”„๋ ˆ์ž„์›Œํฌโ€œ๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด์ž…๋‹ˆ๋‹คโ€”์–ด๋–ค 3P ์ฝ”๋“œ๊ฐ€ โ€œ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€œ์—์„œ โ€œํ”„๋ ˆ์ž„์›Œํฌโ€œ๋กœ ์ง„ํ™”ํ•˜๋Š” ์‹œ์ ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ๊ทœ์น™์€ ์—†์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์ •์˜ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ๋งฅ์—์„œ:

๋น„์œ ๋ฅผ ์ข‹์•„ํ•œ๋‹ค๋ฉด: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๊ณ„์— ์ถ”๊ฐ€ํ•˜๋Š” ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์ด๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์—ฌ ์ œ์–ดํ•˜๋Š” ์‚ฌ์ „ ์ œ์ž‘๋œ ๊ธฐ๊ณ„์ž…๋‹ˆ๋‹ค.

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

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

์‚ฌ๋žŒ๋“ค์ด โ€œhtmx๊ฐ€ ๋˜ ๋‹ค๋ฅธ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ์ธ๊ฐ€?โ€œ๋ผ๊ณ  ๋ฌผ์„ ๋•Œ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ณผ๊ฑฐ์˜ ๋งŽ์€ ์›น ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ๊ธˆ๋ฐฉ ์“ธ๋ชจ์—†๊ฒŒ ๋  ์‹œ์Šคํ…œ์— ํˆฌ์žํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ: htmx๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋น ๋ฅด๊ฒŒ ์‚ฌ๋ผ์ ธ์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์›น์‚ฌ์ดํŠธ๋“ค๋งŒ ๋‚จ๊ธฐ๊ณ  ๊ฐˆ ์šด๋ช…์ผ๊นŒ์š”?

#htmx๋Š” (๋ณดํ†ต) ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ง€์†์ ์ธ ๋…ผ์Ÿ์— ์‚ฌ๊ณผ๋“œ๋ฆฌ๋ฉฐโ€”์ €๋Š” htmx๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๋ช…๋ฐฑํžˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ htmx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ๋งˆ๋‹ค, HTML์— htmx ์†์„ฑ(i.e. hx-post, hx-target)์„ ํฌํ•จํ•˜๊ณ , htmx ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, ๊ทธ ์—”๋“œํฌ์ธํŠธ์—์„œ htmx๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: hx-* ์ปจํŠธ๋กค์ด ํฌํ•จ๋œ HTML). ์ด๋Ÿฌํ•œ ์†์„ฑ, ํ—ค๋” ๋ฐ ์—”๋“œํฌ์ธํŠธ๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ†ตํ•ด ์š”์†Œ๊ฐ€ DOM์— ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

htmx๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ๋ช‡ ๊ฐ€์ง€ ์„น์…˜์— ๋™์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ React๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, React๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ฃผ์žฅ์€ ์•„๋ฌด๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด htmx๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•˜๋ฉด์„œ htmx์˜ ์š”๊ตฌ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ htmx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! htmx์˜ ๊ฐ•์ ์— ๋งž์ถฐ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. Form ๋ณธ๋ฌธ์„ JSON ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ์ •๋ง๋กœ ๊ณ ์ง‘ํ•œ๋‹ค๋ฉด ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค! application/x-www-form-urlencoded ๋ณธ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ •๋ง๋กœ ๊ณ ์ง‘ํ•œ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค! ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜์ดํผ๋ฏธ๋””์–ด API์™€ ๋ถ„๋ฆฌ๋œ URL๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋„ค, htmx๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ htmx๊ฐ€ ๋˜ ๋‹ค๋ฅธ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. htmx๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ง€์ง€ ๋ชปํ•œ ์—„์ฒญ๋‚œ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค: ๋ฐ”๋กœ HTML์ž…๋‹ˆ๋‹ค.

#htmx๋Š” HTML์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค

htmx๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹คโ€”๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์ด JavaScript ํ”„๋ ˆ์ž„์›Œํฌ์ผ๊นŒ์š”? ํ•œ ๊ฐ€์ง€ ๋ถ„๋ช…ํ•œ ์˜๋ฏธ์—์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค: htmx๋Š” ์•ฝ 4,000์ค„์˜ JS๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ์ค‘์š”ํ•œ ์˜๋ฏธ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค: React, Svelte, Solid ๋“ฑ์€ JS(X)๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ํ•œ ํ›„ ๊ทธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋ฅผ HTML๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด, htmx๋Š” ๋‹จ์ง€ HTML์„ ์ž‘์„ฑํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ํฌ๊ธฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ์˜ ๋ฒ”์ฃผ๋ฅผ ์™„์ „ํžˆ ์—†์• ์ค๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ข…์ข… ์–ด๋–ค ์˜์กด์„ฑ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•ด๋‹น ๋ณ€๊ฒฝ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋ง‰ํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Java๋Š” ์ด ๋ฌธ์ œ์˜ ๊ฐ€์žฅ ์•…๋ช… ๋†’์€ ์˜ˆ์ž…๋‹ˆ๋‹คโ€”์ƒ์‚ฐ ํ™˜๊ฒฝ์—์„œ Java 8์„ ์ ˆ๋Œ€ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์„ ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ Java ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” Spring์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค โ€”ํ•˜์ง€๋งŒ npm ํŒจํ‚ค์ง€ ์ƒํƒœ๊ณ„๋„ ๊ทธ์— ๋ชป์ง€์•Š๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. htmx โ€œํ”„๋ ˆ์ž„์›Œํฌโ€œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด htmx๋Š” ์„œ๋“œํŒŒํ‹ฐ ์˜์กด์„ฑ์ด ์—†๋Š”, ํด๋ผ์ด์–ธํŠธ์—์„œ ๋กœ๋“œ๋˜๋Š” JavaScript ํŒŒ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„๊ฐ€ ์˜์กดํ•˜๋Š” ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋‚˜ ์˜์กด์„ฑ ์ฒด์ธ๊ณผ ์ ˆ๋Œ€ ์ถฉ๋Œํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” HTML์„ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ htmx์™€ ์ž‘์—…ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ htmx ์‚ฌ์šฉ์ž๋“ค์ด JSX๋กœ API ์‘๋‹ต์„ ๋ Œ๋”๋งํ•˜์ง€๋งŒ, htmx๋Š” ๊ณ ์ „์ ์ธ ํ…œํ”Œ๋ฆฟ ์—”์ง„๊ณผ๋„ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์–ธ์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Django์™€ Rails์— ๋Œ€ํ•ด ๋ญ๋ผ๊ณ  ํ•˜๋“  ๊ฐ„์—, ๊ทธ๋“ค์€ 2008๋…„์— ์ค‘์š”ํ–ˆ๊ณ  ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹คโ€”htmx๋Š” ์ด ๋‘˜๊ณผ๋„ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” htmx ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์˜ ๋ฐ˜๋ณต์ ์ธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค: htmx๋Š” ์˜ค๋ž˜๋œ ๊ฐœ๋ฐœ ๋„๊ตฌ์™€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ ๋„๊ตฌ ๋ชจ๋‘์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ๋ชจ๋“  ๋„๊ตฌ์˜ ๊ณตํ†ต ๋ถ„๋ชจ๋Š” HTML์ด๋ฉฐ, htmx๋Š” HTML์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

NOTE: ์ด ๋ถ„์„์— ๋™์˜ํ•˜๋ฉฐ ๋…ผ๋ฆฌ์  ๊ฒฐํ•จ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , Carson์€ htmx๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ์ฃผ์žฅ์— ์—ฌ์ „ํžˆ ๊ณ ์ง‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

</>