REST์ ๋ํ ์ ์ฝ ์กฐ๊ฑด ์งํฉ์ ์ต์ข ์ ์ผ๋ก ์ถ๊ฐ๋ ๊ฒ์ 3.5.3์ ์ ์ฝ๋ ์จ ๋๋งจ๋ ์คํ์ผ์์ ๋น๋กฏ๋ฉ๋๋ค(Figure 5-8). REST๋ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด ์ ํ๋ฆฟ์ด๋ ์คํฌ๋ฆฝํธ ํํ๋ก ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ด๋ ์ฌ์ ์ ๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์๋ฅผ ์ค์์ผ๋ก์จ ํด๋ผ์ด์ธํธ๋ฅผ ๋จ์ํํฉ๋๋ค. ๋ฐฐํฌ ํ ๊ธฐ๋ฅ์ ๋ค์ด๋ก๋ํ ์ ์๊ฒ ํจ์ผ๋ก์จ ์์คํ ํ์ฅ์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ฐ์์ฑ์ ๋ฎ์ถ๊ธฐ ๋๋ฌธ์ REST ๋ด์์ ์ ํ์ ์ธ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐ๋ฆฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํ์ฌ ์ธ๊ธฐ๋ฅผ ๋๊ณ ์๋ SPA ์ ๊ทผ๋ฒ๊ณผ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ์ผ๋ก ๋น๋ํ๋ ๊ฒ์ ๋๋ค. SPA ์ ๊ทผ๋ฒ์ JavaScript ๊ธฐ๋ฐ์ด๋ฉฐ, ๋คํธ์ํฌ ์์ค์์ RPC ๊ธฐ๋ฐ์ ๋๋ค.
HDA(Hypermedia-Driven Application) ๋ฌธ์์์ ์คํฌ๋ฆฝํ ์ ๋ํด ๊ฐ๋จํ ์ธ๊ธํฉ๋๋ค:
HDA์์ ํ์ดํผ๋ฏธ๋์ด(HTML)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ์ฃผ์ ๋งค์ฒด์ด๋ฏ๋ก:
- ๋ชจ๋ ์๋ฒ์์ ํต์ ์ ์ฌ์ ํ HTTP ์์ฒญ๊ณผ ํ์ดํผ๋ฏธ๋์ด(HTML) ์๋ต์ ํตํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์คํฌ๋ฆฝํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋ก ํธ์๋ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์คํฌ๋ฆฝํ ์ ๊ธฐ์กด ํ์ดํผ๋ฏธ๋์ด(HTML)๋ฅผ ๋ณด์ํ์ง๋ง, ์ด๋ฅผ ์ด์ํ๊ฑฐ๋ ๊ธฐ๋ณธ์ ์ธ REST-ful ์ํคํ ์ฒ๋ฅผ ์ ๋ณตํ์ง ์์ต๋๋ค.
์ด ๊ธฐ์ฌ์์๋ ์ด ๋ง์ง๋ง ์ธ๊ธ์ ํ์ฅํ์ฌ REST-ful, ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ํ๊ฑฐ๋ ์ ๋ณตํ์ง ์๋ ์คํฌ๋ฆฝํ ์ด ์ด๋ค ๋ชจ์ต์ธ์ง ์ค๋ช ํ๊ณ ์ ํฉ๋๋ค. ์ด ๊ท์น๋ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ๊ธฐ ์ํด ์ง์ ์์ฑ๋ ์คํฌ๋ฆฝํ ๋ฟ๋ง ์๋๋ผ ์ผ๋ฐ์ ์ธ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉ๋ฉ๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ๊ธฐ๋ณธ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ด ๊ท์น๋ค์ ์๋์์ ๋ ์์ธํ ์ค๋ช ๋ฉ๋๋ค.
HDA์ ๊ธฐ๋ณธ ์์น์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์์ง์ผ๋ก์์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ๊ทผ๋ฒ์ ์ด ์์น์ ๋ฐ๋ฆ ๋๋ค.
์ค์ ๋ก, ์ด๋ ์คํฌ๋ฆฝํ ์ด ์๋ฒ์์ ๋นํ์ดํผ๋ฏธ๋์ด ๋คํธ์ํฌ ๊ตํ์ ํผํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ
์ ์๋ฒ์์ ํ์ดํผ๋ฏธ๋์ด(์: HTML)๋ฅผ ์ฌ์ฉํ ์๋ต์ด ์๋ ๋ฐ์ดํฐ API ํ์(์: ๋จ์ JSON)์ ์ฌ์ฉํ ์๋ต์ ๋ฐ๋ fetch()
๋ฐ XMLHttpRequest
์ฌ์ฉ์ ํผํด์ผ ํฉ๋๋ค.
HATEOAS๋ฅผ ์กด์คํ๋ค๋ ๊ฒ์ ๋ํ JavaScript์ ์ ์ฅ๋ ๋ณต์กํ ์ํ(์ฆ, DOM ์ธ๋ถ์ ์ ์ฅ๋ ์ํ)๋ฅผ ํผํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๋ง์ง๋ง ์ง์ ์ ์์ ์ ํ์๋ก ํฉ๋๋ค: JavaScript์ ์ํ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ๋ ๊ฒ์ ๋ ์ ๊ตํ ํ๋ก ํธ์๋ ๊ฒฝํ(์: ์์ ฏ)์ ์ง์ ์ง์ํ๋ ๊ฒฝ์ฐ ํ์ฉ๋ ์ ์์ต๋๋ค.
ํ๋ฉ์ด REST์์ ์คํฌ๋ฆฝํ ์ ๋ชฉ์ ์ ๋ํด ๋งํ ๊ฒ์ ๋ค์ ๊ฐ์กฐํ์๋ฉด:
๋ฐฐํฌ ํ ๊ธฐ๋ฅ์ ๋ค์ด๋ก๋ํ ์ ์๊ฒ ํจ์ผ๋ก์จ ์์คํ ํ์ฅ์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์คํฌ๋ฆฝํ ์ ํ์ดํผ๋ฏธ๋์ด(์: HTML)๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๋ก ํ์ฌ ํ์ดํผ๋ฏธ๋์ด๋ฅผ ๋ ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ REST-ful ์์คํ ์ ์ ๋นํ ์ผ๋ถ์ ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ข์ ์๋ ๋ฆฌ์น ํ ์คํธ ํธ์ง๊ธฐ์ ๋๋ค: ์ด ํธ์ง๊ธฐ๋ ์ ํ ์ ๋ณด, ํ์ด๋ผ์ดํ ์ ๋ณด, ์ฝ๋ ์๋ ์์ฑ ๋ฑ์ ํฌํจํ ๋ฌธ์์ ๋งค์ฐ ์ ๊ตํ JavaScript ๋ชจ๋ธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ชจ๋ธ์ ๋๋จธ์ง DOM๊ณผ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ๋ฆฌ์น ํ ์คํธ ํธ์ง๊ธฐ๋ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด JavaScript API ํธ์ถ์ ์๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ค ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ DOM์ ๋ ธ์ถํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์จ๊ฒจ์ง ์ ๋ ฅ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ง๊ธฐ์ ๋ด์ฉ์ ์ฃผ๋ณ DOM์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
์์ด๋์ด๋ ์คํฌ๋ฆฝํ ์ ์ฌ์ฉํ์ฌ ํ์ดํผ๋ฏธ๋์ด ๊ฒฝํ์ ํฅ์์ํค๋, ๋ง์ SPA ํ๋ ์์ํฌ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ HTML์ ๋ ํฐ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ๋จ์ํ UI ์ค๋ช ์ธ์ด๋ก ์ ๋ฝ์ํค์ง ์๊ณ HTML๊ณผ ์ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์์ง์ผ๋ก์์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ์ธก ์ํ๋ฅผ ์ ํ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์์์ ์ธ๊ธํ ๋ฆฌ์น ํ ์คํธ ํธ์ง๊ธฐ ์์๋ ํด๋ผ์ด์ธํธ ์ธก์ ์๋นํ ์์ ์ํ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ง๋ง ํด๋ผ์ด์ธํธ ์ธก ์ํ๊ฐ ์ ๋นํ๊ณ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์์ ํ ์ผ์นํ๋ ๋ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ค๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฒํผ์ด๋ ์ต์ปค๋ฅผ ํด๋ฆญํ์ฌ ๋ค๋ฅธ ์์์ ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ๋ณด์ด๋๋ก ํ๋ ๊ฐ๋จํ ๊ฐ์์ฑ ํ ๊ธ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์ด ์ผ์์ ์ธ ํด๋ผ์ด์ธํธ ์ธก ์ํ๋ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด ์ํ๋ ์์ ํ ํ๋ก ํธ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ ์์คํ ์ํ๊ฐ ์ด ์ข ๋ฅ์ ์คํฌ๋ฆฝํ ๊ณผ ํจ๊ป ์ ๋ฐ์ดํธ๋๋ค๋ฉด(์ฆ, ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์จ๊ธฐ๋ ๊ฒ์ด ์๋ฒ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ), ํ์ดํผ๋ฏธ๋์ด ๊ตํ์ด ํ์ํ๊ฒ ๋ฉ๋๋ค.
๊ณ ๋ คํด์ผ ํ ์ค์ํ ์ธก๋ฉด์ ํด๋ผ์ด์ธํธ ์ธก์์ ์
๋ฐ์ดํธ๋ ์ํ๊ฐ ์๋ฒ์ ๋๊ธฐํ๋์ด์ผ ํ๋์ง ์ฌ๋ถ์
๋๋ค.
๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ํ์ดํผ๋ฏธ๋์ด ๊ตํ์ด ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ํ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์๋ง ์ ์งํ๋ ๊ฒ์ด ๊ด์ฐฎ์ต๋๋ค.
JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ๋ฅญํ ๋ฐฉ๋ฒ ์ค ํ๋๋ ํ๋ถํ ์ปค์คํ ์ด๋ฒคํธ ๋ชจ๋ธ์ ๊ฐ์ง๋ ๊ฒ์ ๋๋ค.
์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ JavaScript ๊ธฐ๋ฐ ๊ตฌ์ฑ ์์๋ htmx์ ๊ฐ์ ํ์ดํผ๋ฏธ๋์ด ์งํฅ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ๋ฃ๊ณ ํ์ดํผ๋ฏธ๋์ด ๊ตํ์ ํธ๋ฆฌ๊ฑฐํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ์๊ฐ ์ ํํ ๋์์ ํตํด ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ ์ ์๋ _ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค_์ด ๋ ์ ์๊ฒ ํฉ๋๋ค.
๊ทธ ์๋ก Sortable.js ์์ ๋ฅผ ๋ค ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ htmx๋ Sortable.js์์ ํธ๋ฆฌ๊ฑฐ๋๋ end
์ด๋ฒคํธ๋ฅผ ๋ฃ์ต๋๋ค:
<form class="sortable" hx-post="/items" hx-trigger="end">
<div class="htmx-indicator">Updating...</div>
<div><input type='hidden' name='item' value='1'/>Item 1</div>
<div><input type='hidden' name='item' value='2'/>Item 2</div>
<div><input type='hidden' name='item' value='3'/>Item 3</div>
<div><input type='hidden' name='item' value='4'/>Item 4</div>
<div><input type='hidden' name='item' value='5'/>Item 5</div>
</form>
end
์ด๋ฒคํธ๋ Sortable.js์์ ๋๋๊ทธ ์ค ๋๋กญ์ด ์๋ฃ๋ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
htmx๋ hx-trigger
์์ฑ์ ํตํด ์ด ์ด๋ฒคํธ๋ฅผ ๋ฃ๊ณ HTTP ์์ฒญ์ ๋ฐํํ์ฌ ์๋ฒ์ ํ์ดํผ๋ฏธ๋์ด๋ฅผ ๊ตํํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Sortable.js๋ฅผ ์ฌ์ฉํ๋ ๋๋๊ทธ ์ค ๋๋กญ ๊ธฐ๋ฅ์ด ๊ฐ๋ ฅํ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค๋ก ๋ณํ๋ฉ๋๋ค.
์ต๊ทผ ์น ๊ฐ๋ฐ์์ ์ฃผ๋ชฉ๋ฐ๊ณ ์๋ ํธ๋ ๋ ์ค ํ๋๋ โ์์ผ๋๋โ๋ผ๋ ๊ฐ๋ ์ ๋๋ค:
์์ผ๋๋ ์ํคํ ์ฒ๋ ์๋ฒ ๋ ๋๋ง๋ ์น ํ์ด์ง ๋ด์์ ์์, ์ง์ค๋ ์ธํฐ๋ํฐ๋ธ ์์๋ค์ ๊ถ์ฅํฉ๋๋ค.
๋ ์ ๊ตํ ์คํฌ๋ฆฝํ ์ ๊ทผ์ด ํ์ํ๊ณ , ์ ์์ ์ธ ํ์ดํผ๋ฏธ๋์ด ๊ตํ ๋ฉ์ปค๋์ฆ ์ธ๋ถ์ ์๋ฒ์์ ํต์ ์ด ํ์ํ ๊ฒฝ์ฐ, ๊ฐ์ฅ ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์ ๊ทผ์ ์์ผ๋๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋นํ์ดํผ๋ฏธ๋์ด ์์๋ฅผ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ๋ ๋นํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ์ ์์ผ๋๋๋ฅผ ๋ ๋์ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ํตํฉํ๋ ๊น๋ํ ๋ฐฉ๋ฒ์ผ๋ก, ์์์ ์ค๋ช ํ Sortable.js ์์ ์ฒ๋ผ โ๋ด๋ถโ ์์ผ๋๋๋ฅผ โ์ธ๋ถโ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค๋ก ๋ณํํ ์ ์๊ฒ ํฉ๋๋ค.
Deniz Akลimลek๋ ๋นํ์ดํผ๋ฏธ๋์ด ์์ผ๋๋๋ฅผ ๋ ํฐ ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ํฌํจํ๋ ๊ฒ์ด ๋ฐ๋์ ๊ฒฝ์ฐ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ค๋ ์ ์ ๊ด์ฐฐํ์ต๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ์ํ ๋ง์ง๋ง ๊ท์น์ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํ ์ ๋๋ค. ์ด๋ ํ์ดํผ๋ฏธ๋์ด ๋ด์ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฉฐ, ์ธ๋ถ ํ์ผ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ์ด๋ ์ฌ๊ธฐ์ ์ธ๊ธ๋ ๋ค๋ฅธ ๊ฐ๋ ๋ค์ ๋นํด ๋ ผ๋์ด ๋ ์ ์์ผ๋ฉฐ, ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ์ํ โ์ ํ์ โ ๊ท์น์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค: ๊ณ ๋ คํด๋ณผ ๋งํ์ง๋ง ํ์๋ ์๋๋๋ค.
์ด๋ฌํ ์คํฌ๋ฆฝํ ์ ๊ทผ๋ฒ์ ๋ ํนํ์ง๋ง, ์ผ๋ถ HTML ์คํฌ๋ฆฝํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํนํ Alpine.js์ hyperscript์์ ์ฑํ๋์์ต๋๋ค.
๋ค์์ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ hyperscript์ ์์ ๋๋ค:
<button _="on click toggle .visible on the next <section/>">
๋ค์ ์น์
ํ์
</button>
<section>
....
</section>
์ด ๋ฒํผ์ ํด๋ฆญํ ๋ section
์์์ .visible
ํด๋์ค๋ฅผ ํ ๊ธํฉ๋๋ค.
์ด๋ฌํ ์ธ๋ผ์ธ ์คํฌ๋ฆฝํ ์ ๊ทผ์ ์ฃผ์ ์ฅ์ ์ ๊ฐ๋ ์ ์ผ๋ก ํ์ดํผ๋ฏธ๋์ด ์์ฒด๊ฐ ๊ฐ์กฐ๋๋ค๋ ์ ์ ๋๋ค. ์ด๋ ํ์ดํผ๋ฏธ๋์ด ์คํฌ๋ฆฝํ ๋ณด๋ค ๋ ๊ฐ์กฐ๋ฉ๋๋ค.
์ด ์ฝ๋๋ฅผ JSX Components์ ๋น๊ตํด๋ณด๋ฉด, ์คํฌ๋ฆฝํ ์ธ์ด(JavaScript)๊ฐ ํต์ฌ ๊ฐ๋ ์ด๋ฉฐ, ํ์ดํผ๋ฏธ๋์ด/HTML์ด ๊ทธ ์์ ํฌํจ๋์ด ์๋ ๋ฐฉ์์ ๋๋ค:
class Button extends React.Component {
constructor(props) {
// ...
}
toggleVisibilityOnNextSection() {
// ...
}
render() {
return <button onClick={this.toggleVisibilityOnNextSection}>{this.props.text}</button>;
}
}
์ฌ๊ธฐ์ JavaScript๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ์ ์ด๋ฉฐ, ํ์ดํผ๋ฏธ๋์ด/HTML์ UI ์ค๋ช ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ, HTML์ด ํ์ดํผ๋ฏธ๋์ด๋ผ๋ ์ฌ์ค์ ๊ฑฐ์ ์ค์ํ์ง ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ธ๋ผ์ธ ์คํฌ๋ฆฝํ ๊ณผ JSX ์ ๊ทผ๋ฒ์ ๊ณตํต๋ ์ฅ์ ์ ๊ณต์ ํฉ๋๋ค: ๋ ๋ค ํ๋์ ์ง์ญ์ฑ(LoB) ์์น์ ์ถฉ์กฑํฉ๋๋ค. ์ด๋ค์ ๋ชจ๋ ์์๋ ๊ตฌ์ฑ ์์์ ๋ํ ํ๋์ ์ง์ญํ ํ์ฌ ์ด๋ฌํ ์์์ ๊ตฌ์ฑ ์์๊ฐ ๋ฌด์์ ํ๋์ง ์ฝ๊ฒ ์ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
๋ฌผ๋ก , ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ, ํ์ดํผ๋ฏธ๋์ด ๋ด์์ ์ง์ ์ํ๋๋ ์คํฌ๋ฆฝํ ์ ์์ ๋ํ ์ ์ ํ ํ๊ณ๊ฐ ์์ด์ผ ํฉ๋๋ค. ์คํฌ๋ฆฝํ ์ด ๋๋ฌด ๋ง์์ ธ ํ์ดํผ๋ฏธ๋์ด ๋ฌธ์์ โํํโ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ hyperscript behaviors๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ ๊ธฐ๋ฒ์ ํตํด ์ธ๋ผ์ธ ์คํฌ๋ฆฝํ ์ ์ฌ์ฉํ๋ฉด์๋ ๊ตฌํ์ ๋ณ๋์ ํ์ผ์ด๋ ์์น๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์ธ๋ผ์ธ ์คํฌ๋ฆฝํ ์ ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ์คํฌ๋ฆฝํ ์ ํ์๋ ์๋์ง๋ง, ์ ํต์ ์ธ ์คํฌ๋ฆฝํ /ํ์ดํผ๋ฏธ๋์ด ๋ถ๋ฆฌ์๋ ๋์์ผ๋ก ๊ณ ๋ คํด๋ณผ ๋งํฉ๋๋ค.
๋ฌผ๋ก , ํ์ค ์ธ๊ณ์์๋ HATEOAS๋ฅผ ์๋ฐํ๊ณ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์๋ ์ ์ฉํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ด ์์ต๋๋ค. ์ด๋ ์ข ์ข ํ์ดํผ๋ฏธ๋์ด ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค๋ฅธ ๊ณณ์์ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ, ์ค์ฉ์ฃผ์๋ฅผ ๊ถ์ฅํฉ๋๋ค: ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ฐ์ธ๋ ๊ฒ์ด ์ฝ๋ค๋ฉด, ๊ทธ๊ฒ์ด ์ข์ ์ ํ์ด ๋ ์ ์์ต๋๋ค. ์์ํ์ง ๋ชปํ ๊ณณ์์, ์ ์คํธ๋ฆผ ์์ฑ์๊ฐ ํ ๋ฆฌํ์คํธ๋ฅผ ๊ณ ๋ คํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง, ๊ทธ๋ ์ง ์๊ณ ์ข์ ๋์์ด ์๋ค๋ฉด, JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๊ณ๋ ๋๋ก ์ฌ์ฉํ์ญ์์ค.
ํ์ดํผ๋ฏธ๋์ด ์นํ์ ์ด์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํ๋ ค๊ณ ๋ ธ๋ ฅํ๋, ๊ฐ๋ ์ ์์์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ณต์ก์ฑ ์์ฐ์ ๋๋ฌด ๋ง์ด ์๋ชจํ์ง ์๋๋ก ํ์ญ์์ค: ๊ทธ๋ ์ ์ถฉ๋ถํ ์ ์ ๊ทธ๊ฒ์ผ๋ก ์กฑํฉ๋๋ค.