htmx์ ํ์ดํผ๋ฏธ๋์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ํํ ๋ฐ๋ ์๊ฒฌ ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค:
HTML์ ๋ฐํํ๊ณ JSON์ ๋ฐํํ์ง ์๋๋ค๋ฉด, ๋ชจ๋ฐ์ผ ์ฑ์๋ ์๋น์ค๋ฅผ ์ ๊ณตํด์ผ ํ๋ฏ๋ก API๋ฅผ ์ค๋ณตํ์ง ์์ผ๋ ค ํ ๊ฒ์ด๋ค.
์ด๋ฏธ ๋ค๋ฅธ ์์ธ์ด์์ ์ ๋ JSON API์ ํ์ดํผ๋ฏธ๋์ด API๋ฅผ ๋ณ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์ค๋ช ํ ๋ฐ ์์ต๋๋ค.
๊ทธ ์์ธ์ด์์ ์ ๋ HTML์ ๋ฐํํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ API ์๋ํฌ์ธํธ๋ฅผ ์์ ์ ์ด๊ณ ๊ท์น์ ์ด๋ฉฐ ํํ๋ ฅ์ด ์๋ JSON ๋ฐ์ดํฐ API๋ก๋ถํฐ ๋ถ๋ฆฌํ๊ธฐ ์ํด API๋ฅผ โ์ค๋ณตโํ ๊ฒ์ (์ด๋ ์ ๋๊น์ง) ๋ช ์์ ์ผ๋ก ๊ถ์ฅํ์ต๋๋ค.
์ด ์์ด๋์ด์ ๊ด๋ จ๋ ๋ํ๋ฅผ ๋๋์๋ณด๋ฉด์, ๋ง์ ์ฌ๋๋ค์ด ์ ๋งํผ ์ต์ํ์ง ์์ ํจํด์ ๋น์ฐํ ์๊ณ ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก ๋ชจ๋ธ/๋ทฐ/์ปจํธ๋กค๋ฌ (MVC) ํจํด์ ๋๋ค.
์ต๊ทผ ํ์บ์คํธ์์ ๋ง์ ์ ์ ์น ๊ฐ๋ฐ์๋ค์ด MVC์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์๋ค๋ ์ฌ์ค์ ์๊ณ ์กฐ๊ธ ์ถฉ๊ฒฉ์ ๋ฐ์์ต๋๋ค. ์ด๋ ์๋ง๋ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ด ํ์ค์ด ๋๋ฉด์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๊ฐ ๋ถ๋ฆฌ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ ๊ฒ์ ๋๋ค.
MVC๋ ์น ์ด์ ์ ์กด์ฌํ๋ ๊ฐ๋จํ ํจํด์ผ๋ก, ์ฌ์ฉ์์๊ฒ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฑฐ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ต์ ์ธ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
โ๋ชจ๋ธโ ๊ณ์ธต์ โ๋๋ฉ์ธ ๋ชจ๋ธโ์ ํฌํจํฉ๋๋ค. ์ด ๊ณ์ธต์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ๋ ๋๋ฉ์ธ ๋ก์ง์ ํฌํจํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฝ์ฒ ๊ด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฐ๋ฝ์ฒ ๊ด๋ จ ๋ก์ง์ด ์ด ๊ณ์ธต์ ํฌํจ๋ฉ๋๋ค. ์ด ๊ณ์ธต์๋ ์๊ฐ์ ์์์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ด์ผ ํ๋ฉฐ, ์๋์ ์ผ๋ก โ์์โํด์ผ ํฉ๋๋ค.
โ๋ทฐโ ๊ณ์ธต์ ์ฌ์ฉ์์๊ฒ ํ์๋๋ โ๋ทฐโ ๋๋ ์๊ฐ์ ์์๋ฅผ ํฌํจํฉ๋๋ค. ์ด ๊ณ์ธต์ ์ข ์ข (ํญ์์ ์๋์ง๋ง) ๋ชจ๋ธ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก โ์ปจํธ๋กค๋ฌโ ๊ณ์ธต์ ์ด ๋ ๊ณ์ธต์ ์กฐ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ณ , ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ ํ ์ ๋ฐ์ดํธ๋ ๋ชจ๋ธ์ ๋ทฐ์ ์ ๋ฌํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฐ์ดํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋ง์ ๋ณํ์ด ์์ง๋ง, ๊ธฐ๋ณธ ์์ด๋์ด๋ ์ด๋ ์ต๋๋ค.
์ด๊ธฐ ์น ๊ฐ๋ฐ์์๋ ๋ง์ ์๋ฒ ์ธก ํ๋ ์์ํฌ๊ฐ ๋ช ์์ ์ผ๋ก MVC ํจํด์ ์ฑํํ์ต๋๋ค. ์ ๊ฐ ๊ฐ์ฅ ์ต์ํ ๊ตฌํ์ Ruby On Rails๋ก, ๊ฐ ์ฃผ์ ์ ๋ํ ๋ฌธ์๋ฅผ ์ ๊ณตํฉ๋๋ค: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์๋๋ ๋ชจ๋ธ, HTML ๋ทฐ ์์ฑ์ ์ํ ๋ทฐ, ๊ทธ๋ฆฌ๊ณ ๋ ์ฌ์ด๋ฅผ ์กฐ์ ํ๋ ์ปจํธ๋กค๋ฌ.
Rails์์ ๋๋ต์ ์ธ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Rails๋ HTML ๋ฐ HTTP ์์ฒญ/์๋ต ๋ผ์ดํ์ฌ์ดํด์ ๊ธฐ๋ฐ์ผ๋ก ํ ํ์ค์ (๋ค์ โ์๊ณ โ ๋จ์ํ๋) MVC ํจํด์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
Rails ์ปค๋ฎค๋ํฐ์์ ์์ฃผ ์ธ๊ธ๋๋ ๊ฐ๋ ์ค ํ๋๋ โFat Model, Skinny Controllerโ์ ๋๋ค. ์ด ์์ด๋์ด๋ ์ปจํธ๋กค๋ฌ๊ฐ ์๋์ ์ผ๋ก ๊ฐ๋จํด์ผ ํ๋ฉฐ, ๋ชจ๋ธ์์ ๋ฉ์๋ ํ๋ ๋๋ ๋ ๊ฐ๋ฅผ ํธ์ถํ ํ ๋ฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์ ์ ๋ฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ชจ๋ธ์ ๋ฐ๋ฉด์ ๋๋ฉ์ธ ํนํ ๋ก์ง์ด ๋ง์ด ํฌํจ๋ โ๋๊บผ์ดโ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. (์ด๊ฒ์ด God Objects๋ก ์ด์ด์ง ์ ์๋ค๋ ๋ฐ๋ ์๊ฒฌ๋ ์์ง๋ง, ์ด๋ ์ง๊ธ ๋ ผ์ธ๋ก ๋๊ฒ ์ต๋๋ค.)
์ด Fat Model/Skinny Controller ๊ฐ๋ ์ ์ผ๋์ ๋๊ณ , MVC ํจํด์ ๊ฐ๋จํ ์์ ์ ์ด ํจํด์ด ์ ์ ์ฉํ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ์์ ๋ก๋ ์ ๊ฐ ์ข์ํ๋ ์จ๋ผ์ธ ์ฐ๋ฝ์ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ด์ง ์ฐ๋ฝ์ฒ ํ์ด์ง๋ฅผ HTML ํ์ด์ง๋ก ์์ฑํ์ฌ ํ์ํ๋ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
@app.route("/contacts")
def contacts():
contacts = Contact.all(page=request.args.get('page', default=0, type=int))
return render_template("index.html", contacts=contacts)
์ฌ๊ธฐ์ ์ ๋ Python๊ณผ Flask๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ ์ ๊ฐ Hypermedia Systems ์ฑ ์์ ์ฌ์ฉํ๋ ๋๊ตฌ๋ค์ ๋๋ค.
์ด ์์ ์์ ์ปจํธ๋กค๋ฌ๋ ๋งค์ฐ โ์์ต๋๋คโ: ์ปจํธ๋กค๋ฌ๋ Contact
๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํตํด ์ฐ๋ฝ์ฒ๋ฅผ ์กฐํํ๊ณ , ์์ฒญ์์ ์ ๋ฌ๋ page
์ธ์๋ฅผ ์ ๋ฌํฉ๋๋ค.
์ด๋ ๋งค์ฐ ์ ํ์ ์ธ ํํ์ ๋๋ค: ์ปจํธ๋กค๋ฌ์ ์ญํ ์ HTTP ์์ฒญ์ ๋๋ฉ์ธ ๋ก์ง์ ๋งคํํ๊ณ , HTTP ํน์ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ๋ชจ๋ธ์ด ์ดํดํ ์ ์๋ ๋ฐ์ดํฐ(์: ํ์ด์ง ๋ฒํธ)๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค.
์ปจํธ๋กค๋ฌ๋ ์ดํ index.html
ํ
ํ๋ฆฟ์ ํ์ด์ง๋ ์ฐ๋ฝ์ฒ ์ปฌ๋ ์
์ ์ ๋ฌํ์ฌ, ์ด๋ฅผ HTML ํ์ด์ง๋ก ๋ ๋๋งํ๊ณ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก ํฉ๋๋ค.
๋ฐ๋ฉด, Contact
๋ชจ๋ธ์ ๋ด๋ถ์ ์ผ๋ก ๋น๊ต์ โ๋๊บผ์ธโ ์ ์์ต๋๋ค:
all()
๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ, ๋ฐ์ดํฐ ํ์ด์ง ์ฒ๋ฆฌ, ๋ณํ ๋๋ ๋น์ฆ๋์ค ๊ท์น ์ ์ฉ ๋ฑ์ ํฌํจํ๋ ๋๋ฉ์ธ ๋ก์ง์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ ๊ด์ฐฎ์ต๋๋ค.
๊ทธ ๋ก์ง์ Contact ๋ชจ๋ธ์ ์บก์ํ๋์ด ์๊ณ , ์ปจํธ๋กค๋ฌ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋น๊ต์ ์ ๊ฐ๋ฐ๋ Contact ๋ชจ๋ธ์ด ๋๋ฉ์ธ์ ์บก์ํํ๊ณ ์๋ค๋ฉด, ๋น์ทํ ์์ ์ ์ํํ๋ฉด์ HTML ๋ฌธ์๊ฐ ์๋ JSON ๋ฌธ์๋ฅผ ๋ฐํํ๋ ๋ค๋ฅธ API ์๋ํฌ์ธํธ/์ปจํธ๋กค๋ฌ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค:
@app.route("/api/v1/contacts")
def contacts():
contacts = Contact.all(page=request.args.get('page', default=0, type=int))
return jsonify(contacts=contacts)
์ด ๋ ์ปจํธ๋กค๋ฌ ํจ์๋ค์ ๋ณด๋ฉด โ์ด๊ฑด ์ด๋ฆฌ์์ด, ๋ฉ์๋๊ฐ ๊ฑฐ์ ๋์ผํ์์โ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๋น์ ์ด ๋ง์ต๋๋ค. ํ์ฌ๋ก์๋ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
ํ์ง๋ง ์์คํ ์ ๋ ๊ฐ์ง ์ ์ฌ์ ์ถ๊ฐ ์ฌํญ์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , DDOS ๊ณต๊ฒฉ์ด๋ ์๋ชป ์์ฑ๋ ์๋ํ ํด๋ผ์ด์ธํธ๊ฐ ์์คํ ์ ๋ฒ๋ํ์ง ์๋๋ก JSON API์ ๋ ์ดํธ ๋ฆฌ๋ฏธํ ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด Flask-Limiter ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ๋๋ค:
@app.route("/api/v1/contacts")
@limiter.limit("1 per second")
def contacts():
contacts = Contact.all(page=request.args.get('page', default=0, type=int))
return jsonify(contacts=contacts)
๊ฐ๋จํฉ๋๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์: ์ฐ๋ฆฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ์ ํ์ ์ ์ฉํ๊ณ ์ถ์ง ์๊ณ , JSON ๋ฐ์ดํฐ API์๋ง ์ ์ฉํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ง๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฝ๊ฒ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ด์ ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํด ๋ด
์๋ค. HTML ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ index.html
ํ
ํ๋ฆฟ์ ํ๋ฃจ์ ์ถ๊ฐ๋ ์ฐ๋ฝ์ฒ ์๋ฅผ ๋ํ๋ด๋ ๊ทธ๋ํ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๊ทธ๋ํ๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
์ฐ๋ฆฌ๋ index.html
ํ
ํ๋ฆฟ์ ๋ ๋๋ง์ ๊ทธ๋ํ ์์ฑ์ ์ํด ์ฐจ๋จ๋์ง ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ํด Lazy Loading ํจํด์ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
์ด๋ฅผ ์ํด HTML๋ก ํด๋น ์ง์ฐ ๋ก๋ฉ ์ฝํ
์ธ ๋ฅผ ๋ฐํํ๋ ์๋ก์ด ์๋ํฌ์ธํธ /graph
๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
@app.route("/graph")
def graph():
graphInfo = Contact.computeGraphInfo(page=request.args.get('page', default=0, type=int))
return render_template("graph.html", info=graphInfo)
์ฌ๊ธฐ์๋ ์ญ์, ์ฐ๋ฆฌ์ ์ปจํธ๋กค๋ฌ๋ ์ฌ์ ํ โ์์ต๋๋คโ: ๋จ์ํ ๋ชจ๋ธ์ ์์ ์ ์์ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ๋ก ์ ๋ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HTML API์ ์๋ก์ด ์๋ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ์ง๋ง, _JSON ๋ฐ์ดํฐ API์๋ ์ถ๊ฐํ์ง ์์๋ค๋ ๊ฒ_์ ๋๋ค. ์ฆ, ์ด (UI ์๊ตฌ์ ์ํด ์์ ํ ์ฃผ๋๋๋) ํน์ํ ์๋ํฌ์ธํธ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ง๋ ๊ฒ์ด๋ผ๊ณ ๋ค๋ฅธ ๋น์น ํด๋ผ์ด์ธํธ๋ค์๊ฒ ์ฝ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ฐ์ดํฐ๊ฐ /graph
์ ์๊ตฌ์ ์ผ๋ก ์ ๊ณต๋ ๊ฒ์ด๋ผ๊ณ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ฝ์ํ์ง ์๊ธฐ ๋๋ฌธ์, HTML ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์์
์์ฉ ์ํ์ ์์ง์ผ๋ก์์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS)๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ด URL์ ๋์ค์ ์์ ๋กญ๊ฒ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฆฌํฉํฐ๋งํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ต์ ํ๋ก ์ธํด ๊ฐ์๊ธฐ ๊ทธ๋ํ ๊ณ์ฐ์ด ๋นจ๋ผ์ ธ์ /contacts
์๋ต์ ์ธ๋ผ์ธ์ผ๋ก ํฌํจ์ํฌ ์ ์๋ค๋ฉด,
์ด ์๋ํฌ์ธํธ๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์๊ฒ ๋
ธ์ถ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์ํ๊ธฐ ์ํด์๋ง ์กด์ฌํ๋ ๊ฒ์ผ๋ก ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ์ดํผ๋ฏธ๋์ด API์ ํ์ํ ์ ์ฐ์ฑ๊ณผ JSON ๋ฐ์ดํฐ API์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ์ป์ ์ ์์ต๋๋ค.
MVC ๊ด์ ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์, ๋๋ฉ์ธ ๋ก์ง์ด ๋ชจ๋ธ์ ์์ง๋์๊ธฐ ๋๋ฌธ์, ๋ ๊ฐ์ API๋ฅผ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์๋ ์๋นํ ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋ฌ์ฑํ ์ ์๋ค๋ ์ ์ ๋๋ค. JSON๊ณผ HTML ์ปจํธ๋กค๋ฌ ๊ฐ์ ์ด๊ธฐ์๋ ๋ง์ ์ ์ฌ์ฑ์ด ์์์ง๋ง, ์๊ฐ์ด ์ง๋๋ฉด์ ์ฐจ๋ณํ๋์์ต๋๋ค.
๋์์, ๋ชจ๋ธ ๋ก์ง์ ์ค๋ณตํ์ง ์์์ต๋๋ค: ๋ ์ปจํธ๋กค๋ฌ ๋ชจ๋ ์๋์ ์ผ๋ก โ์๊ฒโ ์ ์ง๋์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ์์ ์ ์ํํ๊ธฐ ์ํด ๋ชจ๋ธ ๊ฐ์ฒด์ ์์ํ์ต๋๋ค.
๋ฐ๋ผ์ ๋ API๋ ์๋ก ๋ถ๋ฆฌ๋์์ผ๋ฉฐ, ๋๋ฉ์ธ ๋ก์ง์ ์ค์์ ์ง์ค๋์ด ์์ต๋๋ค.
(์ด ์ ์ ์ ๊ฐ ์ ์ฝํ ์ธ ํ์์ ์ฌ์ฉํ์ง ์๋์ง์ ๊ฐ์ ์๋ํฌ์ธํธ์์ HTML๊ณผ JSON์ ๋ฐํํ์ง ์๋ ์ด์ ์๋ ์ฐ๊ฒฐ๋ฉ๋๋ค.)
Spring, ASP.NET, Rails์ ๊ฐ์ ๋ง์ ์ค๋๋ ์น ํ๋ ์์ํฌ๋ ๋งค์ฐ ๊ฐ๋ ฅํ MVC ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ก์ง์ ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
Django๋ MVT๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ์ฌ MVC์ ์ ์ฌํ ๋ณํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๋ฌํ MVC์ ๋ํ ๊ฐ๋ ฅํ ์ง์์ ์ด๋ฌํ ํ๋ ์์ํฌ๊ฐ htmx์ ์ ์ด์ธ๋ฆฌ๋ ์ด์ ์ค ํ๋์ด๋ฉฐ, ์ด๋ฌํ ์ปค๋ฎค๋ํฐ๊ฐ htmx์ ๋ํด ํฅ๋ฏธ๋ฅผ ๋๋ผ๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.
์์ ์์๋ค์ ๋ถ๋ช ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํธํฅ๋์ด ์์ง๋ง, ๋์ผํ ์์ด๋์ด๋ ํจ์ํ ์ปจํ ์คํธ์์๋ ์ ์ฉ๋ ์ ์์ต๋๋ค.
MVC ๊ฐ๋ ์ด ์๋ก์ด ๋ถ๋ค์๊ฒ๋, ์ด ๊ธ์ด MVC ๊ฐ๋ ์ ๋ํด ์ข์ ๊ฐ์ ์ฃผ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ์กฐ์ง ์์น์ ์ฑํํจ์ผ๋ก์จ API๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ฉด์๋ ์ฝ๋์ ์ค๋ณต์ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.