์์ฝ: API๋ฅผ ๋ฐ์ดํฐ์ ์ ํ๋ฆฌ์ผ์ด์ API๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์๋ค๋ฉด, ์ฌ๊ธฐ์ ์ ์ํ๋ ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ API๋ฅผ JSON์์ ํ์ดํผ๋ฏธ๋์ด(HTML)๋ก ๋ณ๊ฒฝํ๊ณ htmx์ ๊ฐ์ ํ์ดํผ๋ฏธ๋์ด ์งํฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ์ ํ์ดํผ๋ฏธ๋์ด ๋ชจ๋ธ์ ์ฅ์ (๋จ์์ฑ, ์ ๋ขฐ์ฑ, ์ ์ฐ์ฑ ๋ฑ)์ ๋๋ฆด ์ ์์ต๋๋ค.
์ต๊ทผ Max Chernyak์ด โ์์ ์ ํ๋ก ํธ์๋๋ฅผ ์ํ ๋ฒ์ฉ API๋ฅผ ๋ง๋ค์ง ๋ง์ธ์โ๋ผ๋ ์ ๋ชฉ์ ์์ธ์ด๋ฅผ ์์ฑํ์ต๋๋ค. ๊ทธ์ ์์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
YAGNI(You Ainโt Gonna Need It, ํ์ํ์ง ์๋ค๋ ์๋ฏธ)๋ ๋๊ธฐ์ ์ ์ฐํฉ ํ๋ก ํธ์๋๋ GraphQL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ ์ฉ๋ฉ๋๋ค.
Max๋ ๋ฒ์ฉ API์ ์ ํ๋ฆฌ์ผ์ด์ API์ ๋ค์ํ ์๊ตฌ ์ฌํญ์ ์ค๋ช ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ฉ API์ ํ์์ฑ์ ๋์ดํฉ๋๋ค:
๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ API์ ํ์์ฑ์ผ๋ก๋ ๋ค์์ ์ธ๊ธํฉ๋๋ค:
์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ฐ์ดํฐ/์ ํ๋ฆฌ์ผ์ด์ API ๋ถ์ผ์น ๋ฌธ์ ๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
Max์ ์ ์์ API๋ฅผ ๋ฒ์ฉ API์ ์ ํ๋ฆฌ์ผ์ด์ API์ ๋ โ๋ฐ์ชฝโ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค:
ํ๋ก ํธ์๋๋ฅผ ๋ฒ์ฉ API ํด๋ผ์ด์ธํธ๋ก ์ทจ๊ธํ๋ ๊ฒ์ ์ค๋จํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ถ๋ถ์ผ๋ก ์ทจ๊ธํ๊ธฐ ์์ํ์ธ์.
โํ์ด์งโ ์ ์ฒด์ JSON์ ์ ์กํ ์ ์๋ค๊ณ ์์ํด ๋ณด์ธ์.
/page/a
๋ผ๋ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์ด/page/a
์ ๋ํ ์ ์ฒด JSON์ ๋ ๋๋งํ์ธ์. ๋ชจ๋ ํ์ด์ง์ ๋ํด ์ด๋ ๊ฒ ํ์ธ์. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ ๋ณต์กํ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ์์ฒญ์ ๋ณด๋ด๋๋ก ๊ฐ์ํ์ง ๋ง์ธ์. ์ธ์์ ์ธ ์ ํ์ผ๋ก ๊ทธ๋ค์ ๊ดด๋กญํ์ง ๋ง์ธ์. ํ๋ ฅํ์ธ์.
Max๊ฐ ์ ๊ธฐํ ๋ฌธ์ ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
ํนํ ๋ฒ์ฉ API๋ ์์ ์ ์ด์ด์ผ ํ๋ ๋ฐ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ API๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ง๊ฒ ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค.
Jean-Jacques Dubray๋ ์ด ๊ธฐ์ฌ์์ API ์ค๊ณ์๋ค์๊ฒ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์ค๋ช ํฉ๋๋ค:
์์ฆ ๋ด ์ผ์ ๊ฐ์ฅ ํ๋ ๋ถ๋ถ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ API๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ๋๋ค. ๋ํ๋ ํญ์ ์ด๋ ๊ฒ ์งํ๋ฉ๋๋ค:
Dev โ ๊ทธ๋์ ์ด ํ๋ฉด์๋ ๋ฐ์ดํฐ ์์ x, y, z๊ฐ ํ์ํฉ๋๋คโฆ {x:, y:, z:} ํ์์ ์๋ต์ ๋ฐํํ๋ API๋ฅผ ๋ง๋ค์ด ์ฃผ์ค ์ ์๋์?
Me โ ์๊ฒ ์ต๋๋ค
์ด๊ฒ์ Max๊ฐ ์ธ๊ธํ ๊ธด์ฅ๊ฐ์ ์๋ฒฝํ๊ฒ encapsulationํ ์์ ๋๋ค. API ์์ง๋์ด๋ค์ ์ผ๋ฐ์ ์ด๊ณ ์์ ์ ์ธ API๋ฅผ ์ค๊ณํ๊ณ ์ถ์ดํ์ง๋ง, ์์ฃผ ๋ณ๊ฒฝ๋๋ UI์ ์๋ฒ ์ธก์์ ์ต์ ์ผ๋ก ํด๊ฒฐ๋๋ ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ์ข ์๋ฉ๋๋ค.
Max๊ฐ ์ง์ ํ๋ฏ์ด:
โํ์ด์ง aโ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ์ฌ ํ์ํ ์์ ๋ง ์ํํ๋๋ก ํ์ธ์. โํ์ด์ง aโ์ ๋ํ ๋ฒ๊ทธ, ๋ณด์, ์ฑ๋ฅ์ ์ฒ ์ ํ ํ ์คํธํ์ธ์. ์ฌ์ง์ด โํ์ด์ง aโ์ ํ์ํ ๋ชจ๋ ๊ฒ์ ํ๋์ ํฐ SQL ์ฟผ๋ฆฌ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ค์ ๋งํด, Max๊ฐ ์ ๊ธฐํ ๋ฐ์ดํฐ/์ ํ๋ฆฌ์ผ์ด์ API ๋ถ์ผ์น ๋ฌธ์ ์ ์ ์ ์ผ๋ก ๋์ํ๋ฉฐ, API๋ฅผ ๋๋ก ๋๋์๋ ๊ทธ์ ์ ์์ ์นญ์ฐฌํฉ๋๋ค.
ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ค์ ๋จ๊ณ๊ฐ ์์ต๋๋ค:
์ ํ๋ฆฌ์ผ์ด์ API๋ฅผ ๋ฒ์ฉ ๋ฐ์ดํฐ API์ ๋ถ๋ฆฌํ ํ์๋, ๊ณต๊ฐ ๋ฐ์ดํฐ API์ ์ ์ฝ์ ์ฝ๋งค์ด์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ API์ ์ ์ฒด ํํ๋ฅผ ์ฌ๊ณ ํ ์ ์์ต๋๋ค. ์์ ๋กญ๊ฒ ์๊ฐ์ ํ์ฅํ ์ ์๋ ๊ธฐํ๊ฐ ์๊น๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ API์ ํต์ฌ ๋ฌธ์ ๋ ๋น ๋ฅธ ๋ณํ์ ํ์ด์ง(๋๋ ๋ฆฌ์์ค)๋ณ ์กฐ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํํ ์ด ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋งค์ฐ ํ๋ฅญํ ๊ธฐ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค: ํ์ดํผ๋ฏธ๋์ด์ ๋๋ค!
ํ์ดํผ๋ฏธ๋์ด๋ HATEOAS๋ฅผ ํตํด API ๋ณํ๊ฐ ๋ฌธ์ ๊ฐ ๋์ง ์๊ฒ ๋ง๋ญ๋๋ค. ํ์ดํผ๋ฏธ๋์ด API์ ํํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ๊ทธ๊ฒ์ ์๋ก์ด HTML๋ก ๋ฐ์๋ฉ๋๋ค. ์๋ก์ด API๋ ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ฐ์ดํธํ ํ์ ์์ด ๋จ์ํ ์๋ฒ์์ ๋ฐํ๋๋ ์๋ก์ด HTML๋ก ๋ํ๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์๋ก์ด HTML์ ๋ณด๊ณ , ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ ํ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์, Max๊ฐ ์ณ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ๊ทธ๋ ์ถฉ๋ถํ ๋ฉ๋ฆฌ ๊ฐ์ง ์์์ต๋๋ค: ๋ฐ์ดํฐ/์ ํ๋ฆฌ์ผ์ด์ API ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด API๋ฅผ ๋ถ๋ฆฌํ๋ ์ ์ ์ ๋์ฝ์ ํ๋ค๋ฉด, ํ์ดํผ๋ฏธ๋์ด์ ์ฅ์ ์ ์ฌ๋ฐ๊ฒฌํ๋ ๊ฒ์ ๊ทธ ๊ธธ์์ ํ ๊ฑธ์ ๋ ๋์๊ฐ๋ ๊ฒ์ ๋๋ค.
โํ์ง๋ง ํ์ดํผ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์น 1.0์ผ๋ก ๋์๊ฐ๊ณ ์ถ์ง ์๋คโ๊ณ ๋ฐ๋ํ ์๋ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋งค์ฐ ํฉ๋ฆฌ์ ์ธ ๋ฐ๋ ์๊ฒฌ์ด์ง๋ง, ์ฌ๋๋ค์ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํด ์๊ณ , ์ด์ HTML์ ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
์ ๊ฐ ์ข์ํ๋ ๋ ๊ฐ์ง๋ unpoly์, ๋ฌผ๋ก ์ ๊ฐ ๋ง๋ htmx์ ๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ API(์ฆ, โHTML์ ์ฌ์ฉํ์ธ์, ์์ ์ฒ๋ผโ)๋ก ์ ํํ๋ฉด REST-ful ์น ๋ชจ๋ธ์ ๋ชจ๋ ์ด์ (๋จ์์ฑ, ์ ๋ขฐ์ฑ ๋ฑ)๊ณผ ์ฑ์ํ ์น ํ๋ ์์ํฌ์์ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ด์ (์บ์ฑ, SQL ํ๋ ๋ฑ)์ ๋๋ฆด ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ htmx์ ๊ฐ์ ํ์ดํผ๋ฏธ๋์ด ์งํฅ ํ๋ก ํธ์๋ ๊ธฐ์ ์ ์ ํํจ์ผ๋ก์จ ๊ทธ ๋ชจ๋ธ ๋ด์์ ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ๋ค์ ์๋ก์์ง์ง๋ง, ์ด๋ฒ์๋ ์กฐ๊ธ ๋ ๋์์ก์ต๋๋ค.