htmx๋ฅผ ์ฒ์ ๋ฃ๋ ์ฌ๋๋ค์๊ฒ์ ํํ ๋์ค๋ ๋นํ ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํ๋ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ ๋ณต์ก์ฑ์ ๋ํด ๋ถํํ๊ณ ์์ง๋ง, ๋น์ ์ ํด๊ฒฐ์ฑ ๋ ๋ ๋ค๋ฅธ ๋ณต์กํ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ผ ๋ฟ์ ๋๋ค.
์ด๊ฒ์ ํ๋ฅญํ ๋ฐ๋ก ์ ๋๋ค! ํ๋ก์ ํธ์ ์๋ก์ด ์๋ํํฐ(3P) ์ฝ๋๋ฅผ ๋์ ํ ๋ ๋ฐ๋์ ๋ฌผ์ด๋ด์ผ ํ ์ค์ํ ์ง๋ฌธ์ ๋๋ค. ์ง์ 3P ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ผ๋, ํ๋ก์ ํธ์ ํฌํจ์ํค๋ฉด ๊ทธ ์ฝ๋๋ฅผ ์ดํดํด์ผ ํ๊ณ , ์ ๊ทธ๋ ์ด๋ํ๊ณ ์ถ์ ๋ ์ดํด๋ฅผ ์๋ก ๊ณ ์ณ์ผ ํฉ๋๋ค. ์ด๋ ํฐ ์ฑ ์์ ๋๋ค.
์ด ๋นํ์ ๊ตฌ์ฑ ์์๋ก ๋๋์ด, htmx๊ฐ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ฅผ ์ผ๋ง๋ ์์ฃผ ๋ฐฉ์นํ๋์ง ์ ํํ ์์๋ด ์๋ค.
์ผ๋ถ htmx ์นํธ์๋ค์ โhtmx๋ ํ๋ ์์ํฌ๊ฐ ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋คโ๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๋ ์๋ง๋ ์ ํํ์ง ์์ต๋๋ค.
โํ๋ ์์ํฌโ๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด์ ๋๋คโ์ด๋ค 3P ์ฝ๋๊ฐ โ๋ผ์ด๋ธ๋ฌ๋ฆฌโ์์ โํ๋ ์์ํฌโ๋ก ์งํํ๋ ์์ ์ ๋ํ ์๊ฒฉํ ๊ท์น์ ์์ง๋ง, ๊ทธ๋๋ ์ ์ํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ๋งฅ์์:
๋น์ ๋ฅผ ์ข์ํ๋ค๋ฉด: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๊ณ์ ์ถ๊ฐํ๋ ํฑ๋๋ฐํด์ด๊ณ , ํ๋ ์์ํฌ๋ ์ฌ์ฉ์๊ฐ ํฑ๋๋ฐํด๋ฅผ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์ ์ดํ๋ ์ฌ์ ์ ์๋ ๊ธฐ๊ณ์ ๋๋ค.
์ด ๊ตฌ๋ถ์ ๋ชจํธํ๊ธด ํ์ง๋ง, ์ผ๋ถ 3P ์ฝ๋๋ฅผ ์ผ๋ง๋ ์ฝ๊ฒ ๋์ฒดํ ์ ์๋์ง ์ค๋ช ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, CSV ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ JavaScript ์๋น์ค๋ ์๋ง๋ ๋ค๋ฅธ CSV ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ง๋ง, NextJS ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ JavaScript ์๋น์ค๋ NextJS์ ๋ํ ์์กด์ฑ์ด ๋งค์ฐ ์ปค์ง ๊ฒ์ ๋๋ค. ์ฝ๋์ ์๋น ๋ถ๋ถ์ด NextJS ๊ตฌ์ฑ ์์์ ์ํธ์์ฉํ๋ ๊ฒ์ ์ ์ ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ์๋น์ค๊ฐ ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ๊ฒฝ์ฐ, ํด๋น ํ๋ ์์ํฌ์ ์ ์ฉํ ์๋ช ์ ์๋น์ค์ ์ ์ฉํ ์๋ช ๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ง์ฝ ๊ทธ ํ๋ ์์ํฌ๊ฐ ๋ฒ๋ ค์ง๊ฑฐ๋, ๊ฒฝ๋ฉธ๋นํ๊ฑฐ๋, ์์ ํ๊ธฐ์ ๋ฐ๋์งํ์ง ์๊ฒ ๋๋ฉด, ํ๋ก์ ํธ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์ ์ ๋ ์ด๋ ค์์ง๋ค๊ฐ ๊ฒฐ๊ตญ ํฌ๊ธฐํ๊ณ , ํ๋ก์ ํธ๋ฅผ ์์ ํ ํ๊ธฐํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ฌ๋๋ค์ด โhtmx๊ฐ ๋ ๋ค๋ฅธ JavaScript ํ๋ ์์ํฌ์ธ๊ฐ?โ๋ผ๊ณ ๋ฌผ์ ๋ ๊ฑฑ์ ํ๋ ๊ฒ์ ๋ฐ๋ก ์ด๋ฌํ ์ ์ ๋๋ค. ๊ทธ๋ค์ ๊ณผ๊ฑฐ์ ๋ง์ ์น ๊ฐ๋ฐ ํ๋ ์์ํฌ์ฒ๋ผ ๊ธ๋ฐฉ ์ธ๋ชจ์๊ฒ ๋ ์์คํ ์ ํฌ์ํ๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋์: 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๋ฅผ ํ๋ ์์ํฌ๋ก ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋คโ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ด 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๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ์ฃผ์ฅ์ ์ฌ์ ํ ๊ณ ์งํ๊ณ ์์ต๋๋ค.