Why htmx Does Not Have a Build Step

Alexander Petros

htmx의 λͺ‡λͺ‡ κΈ°μ—¬μžλ“€λ‘œλΆ€ν„° 반볡적으둜 μ œκΈ°λ˜λŠ” 질문 쀑 ν•˜λ‚˜λŠ” htmxκ°€ μ™œ TypeScript둜 μž‘μ„±λ˜μ§€ μ•Šμ•˜λŠ”μ§€, μ•„λ‹ˆλ©΄ μ™œ htmx에 λΉŒλ“œ 단계가 μ „ν˜€ μ—†λŠ”μ§€μ— κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€. htmx의 전체 μ†ŒμŠ€ μ½”λ“œλŠ” 단일 3,500μ€„μ˜ JavaScript 파일둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. htmx에 κΈ°μ—¬ν•˜λ €λ©΄ htmx.js νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ 되며, μ΄λŠ” λ―Έλ‹ˆνŒŒμ΄(minification) 및 압좕을 거친 ν›„ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ λΈŒλΌμš°μ €μ— μ „μ†‘λ˜λŠ” 파일과 λ™μΌν•©λ‹ˆλ‹€.

μ €λŠ” htmx ν”„λ‘œμ νŠΈλ₯Ό λŒ€ν‘œν•˜μ§€λŠ” μ•Šμ§€λ§Œ, λͺ‡ 가지 μ€‘μš”ν•œ κΈ°μ—¬λ₯Ό ν–ˆμœΌλ©°, 이 λ¬Έμ œκ°€ 제기될 λ•Œλ§ˆλ‹€ λΉŒλ“œ 단계가 μ—†λŠ” 섀정을 μœ μ§€ν•˜λŠ” 것을 적극적으둜 μ˜Ήν˜Έν•΄μ™”μŠ΅λ‹ˆλ‹€. 제 κ΄€μ μ—μ„œ, htmx에 λΉŒλ“œ 단계가 μ—†λŠ” μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

#ν•œ 번 μž‘μ„±ν•˜λ©΄ μ˜μ›νžˆ μ‹€ν–‰λœλ‹€

라이브러리λ₯Ό 순수 JavaScript둜 μž‘μ„±ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” 그것이 μ˜μ›νžˆ 지속될 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄λŠ” μ•„λ§ˆλ„ JavaScript의 κ°€μž₯ κ³Όμ†Œν‰κ°€λœ κΈ°λŠ₯일 κ²ƒμž…λ‹ˆλ‹€. νŠΉμ • μ˜ˆμ™Έκ°€ μžˆμ„ 수 μžˆμ§€λ§Œ, 1999년에 μž‘μ„±λœ JavaScriptλŠ” ν˜„λŒ€μ˜ μ½”λ“œμ™€ ν•¨κ»˜ μ΅œμ‹  Google Chromeμ—μ„œλ„ μˆ˜μ • 없이 μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λŠ” 맀우 적은 ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ—μ„œ κ°€λŠ₯ν•œ μΌμž…λ‹ˆλ‹€. Python, Java, C와 같은 언어듀은 μƒˆλ‘œμš΄ μ–Έμ–΄ κΈ°λŠ₯을 μ„ νƒν•˜λ©΄ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” APIλ‘œλΆ€ν„° λ²—μ–΄λ‚˜κ²Œ λ˜λŠ” 버전 관리 λ©”μ»€λ‹ˆμ¦˜μ„ 가지고 μžˆκΈ°μ— μ΄λŸ¬ν•œ νŠΉμ„±μ„ 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Όλ‘ , λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ΄ κ²½ν—˜ν•œ JavaScriptλŠ” μ‹œκ°„μ΄ 지남에 따라 λ¬Έμ œκ°€ λ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 3κ°œμ›” 후에 node μ €μž₯μ†Œλ₯Ό λ‹€μ‹œ 열어보면, ν”„λ‘œμ νŠΈκ°€ λ³΄μ•ˆ κ²½κ³ , ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” 라이브러리 β€œμ—…κ·Έλ ˆμ΄λ“œβ€, 그리고 ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•  λ‹Ήμ‹œμ—λŠ” 졜고둜 μ—¬κ²¨μ‘Œλ˜ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ ˆμž„μ›Œν¬κ°€ μ΄μ œλŠ” 기술 λΆ€μ±„λ‘œ 여겨지고 μžˆλŠ” 상황에 λΉ μ Έ μžˆλŠ” 것을 λ°œκ²¬ν•˜κ²Œ 될 κ²ƒμž…λ‹ˆλ‹€. 이 상황에 λŒ€ν•œ μ±…μž„μ΄ λˆ„κ΅¬μ—κ²Œ μžˆλŠ”μ§€λŠ” λ…Όμ˜ν•˜μ§€ μ•Šκ² μ§€λ§Œ, μ–΄μ¨Œλ“  JavaScript λŸ°νƒ€μž„ μ™Έμ˜ μ˜μ‘΄μ„±μ„ μ—†μ• λ©΄ μ΄λŸ¬ν•œ 문제 전체λ₯Ό μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜€λŠ˜λ‚  JavaScriptλ₯Ό μž‘μ„±ν•˜λŠ” 인기 μžˆλŠ” 방법 쀑 ν•˜λ‚˜λŠ” TypeScriptμ—μ„œ μ»΄νŒŒμΌν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(이 κΈ€μ—μ„œλŠ” TypeScriptλ₯Ό 예둜 많이 μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€. TypeScriptκ°€ μ•„λ§ˆ λΉŒλ“œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” κ°€μž₯ 쒋은 이유일 κ²ƒμž…λ‹ˆλ‹€). TypeScriptλŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œ λ„€μ΄ν‹°λΈŒλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, TypeScript μ½”λ“œλŠ” ECMA의 μ—„κ²©ν•œ ν•˜μœ„ ν˜Έν™˜μ„±μ— λŒ€ν•œ μ§‘μ°©μœΌλ‘œλΆ€ν„° λ³΄ν˜Έλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  μ˜μ‘΄μ„±κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ, μƒˆλ‘œμš΄ μ£Όμš” TypeScript 버전이 이전 버전과 ν•˜μœ„ ν˜Έν™˜μ„±μ„ 보μž₯ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄, μ΅œμ‹  개발 도ꡬ 체인을 μ‚¬μš©ν•˜λ €λ©΄ μœ μ§€ 보수λ₯Ό ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

μœ μ§€ λ³΄μˆ˜λŠ” λ…Έλ™μœΌλ‘œ μ§€λΆˆν•˜λŠ” λΉ„μš©μ΄λ©°, μ˜€ν”ˆ μ†ŒμŠ€ μ½”λ“œλ² μ΄μŠ€λŠ” κ°€μž₯ μœ μ§€ 보수λ₯Ό κ°λ‹Ήν•˜κΈ° μ–΄λ €μš΄ ν”„λ‘œμ νŠΈλ“€μž…λ‹ˆλ‹€. λΉŒλ“œ 단계λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ htmxλ₯Ό μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” 데 ν•„μš”ν•œ 노동을 크게 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ²½ν—˜μ€ htmx의 전신인 intercooler.jsμ—μ„œλ„ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. intercooler.jsλŠ” (μ œκ°€ μ΄ν•΄ν•˜κΈ°λ‘œλŠ”) 맀우 적은 λ…Έλ ₯으둜 λ¬΄κΈ°ν•œ μœ μ§€ κ΄€λ¦¬λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. htmx 1.0이 μΆœμ‹œλ˜μ—ˆμ„ λ•Œ TypeScriptλŠ” 4.1 λ²„μ „μ΄μ—ˆκ³ , intercooler.jsκ°€ μΆœμ‹œλ˜μ—ˆμ„ λ•Œ TypeScriptλŠ” 1.0 버전 μ΄μ „μ΄μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ λ‹Ήμ‹œ TypeScript λ²„μ „μœΌλ‘œ μž‘μ„±λœ μ½”λ“œκ°€ μ˜€λŠ˜λ‚ μ˜ TypeScript 컴파일러(이 글을 μž‘μ„±ν•  λ‹Ήμ‹œ 5.1 버전)μ—μ„œ μˆ˜μ • 없이 컴파일될 수 μžˆμ„κΉŒμš”? 그럴 μˆ˜λ„ 있고, 아닐 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ htmxλŠ” JavaScript둜 μž‘μ„±λ˜μ—ˆκ³ , μ˜μ‘΄μ„±μ΄ μ—†κΈ° λ•Œλ¬Έμ— μ›Ή λΈŒλΌμš°μ €κ°€ μœ νš¨ν•œ ν•œ μˆ˜μ • 없이 싀행될 κ²ƒμž…λ‹ˆλ‹€. λΈŒλΌμš°μ € 곡급업체듀이 μ–΄λ €μš΄ μž‘μ—…μ„ λŒ€μ‹ ν•˜κ²Œ ν•˜μ‹­μ‹œμ˜€.

#개발자 κ²½ν—˜

TypeScript의 개발자 κ²½ν—˜(DX)이 λ§Žμ€ λ©΄μ—μ„œ JavaScript보닀 μš°μˆ˜ν•˜λ‹€λŠ” 것은 μ‚¬μ‹€μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ TypeScript DXκ°€ λͺ¨λ“  λ©΄μ—μ„œ μš°μˆ˜ν•˜λ‹€λŠ” 것은 사싀이 μ•„λ‹ˆλ©°, μ†Œν”„νŠΈμ›¨μ–΄ μ—”μ§€λ‹ˆμ–΄λ“€μ΄ 진보λ₯Ό κΈ°λŠ₯의 μ™„μ „μ„±μœΌλ‘œ λ³΄λŠ” κ²½ν–₯이 가끔씩 그듀이 μ’‹μ•„ν•˜λŠ” DX μΈ‘λ©΄μ—μ„œ λŒ€κ°€λ‘œ μ§€λΆˆν•œ λΉ„μš©μ„ κ°„κ³Όν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, TypeScriptλ₯Ό μ‚¬μš©ν•˜λŠ” μž‘μ€ λŒ€κ°€λŠ” μ»΄νŒŒμΌν•˜λŠ” 데 μ‹œκ°„μ΄ 걸리고, λ³€κ²½ 사항을 ν…ŒμŠ€νŠΈν•˜λ €λ©΄ μž¬μ»΄νŒŒμΌμ„ κΈ°λ‹€λ €μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 보톡 이 λΉ„μš©μ€ λ¬΄μ‹œν•  수 μžˆμ„ μ •λ„λ‘œ 적고 μΆ©λΆ„νžˆ μ§€λΆˆν•  κ°€μΉ˜κ°€ μžˆμ§€λ§Œ, μ–΄μ¨Œλ“  λΉ„μš©μž…λ‹ˆλ‹€.

TypeScriptλ₯Ό μ‚¬μš©ν•  λ•Œ 더 μ€‘μš”ν•œ λΉ„μš©μ€ λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜λŠ” μ½”λ“œκ°€ μ—¬λŸ¬λΆ„μ΄ μž‘μ„±ν•œ μ½”λ“œκ°€ μ•„λ‹ˆλΌλŠ” μ μž…λ‹ˆλ‹€. μ΄λŠ” λΈŒλΌμš°μ €μ˜ 개발자 도ꡬλ₯Ό μ‚¬μš©ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€. TypeScript μ½”λ“œμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, ν•΄λ‹Ή μ˜ˆμ™Έμ˜ μŠ€νƒ 트레이슀(μžλ°”μŠ€ν¬λ¦½νŠΈ 쀄 번호, μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ λ“±)κ°€ μ—¬λŸ¬λΆ„μ΄ μž‘μ„±ν•œ TypeScript μ½”λ“œμ™€ μ–΄λ–»κ²Œ μΌμΉ˜ν•˜λŠ”μ§€ νŒŒμ•…ν•΄μ•Ό ν•©λ‹ˆλ‹€. 반면, JavaScript μ½”λ“œμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄, λ°”λ‘œ μ†ŒμŠ€ μ½”λ“œλ‘œ μ΄λ™ν•˜μ—¬ μž‘μ„±ν•œ λ‚΄μš©μ„ 읽고 λ””λ²„κ±°μ—μ„œ 쀑단점을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ—„μ²­λ‚œ DXμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ μž‘μ—…ν•΄ λ³Έ 적이 μ—†λŠ” μ Šμ€ μ›Ή κ°œλ°œμžλ“€μ—κ²ŒλŠ” κ³„μ‹œμ™€ 같은 κ²½ν—˜μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

λΉŒλ“œ 단계 μ˜Ήν˜Έμžλ“€μ€ TypeScriptκ°€ μ†ŒμŠ€ 맡을 생성할 수 μžˆλ‹€κ³  μ§€μ ν•©λ‹ˆλ‹€. μ΄λŠ” λΈŒλΌμš°μ €μ— TypeScript와 JavaScriptκ°€ μ–΄λ–»κ²Œ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ•Œλ €μ€λ‹ˆλ‹€. λ§žμŠ΅λ‹ˆλ‹€! κ·ΈλŸ¬λ‚˜ μ΄μ œλŠ” TypeScript둜 μž‘μ„±ν•œ μ½”λ“œ, μƒμ„±λœ JavaScript μ½”λ“œ, 이 λ‘˜μ„ μ—°κ²°ν•˜λŠ” μ†ŒμŠ€ λ§΅μ΄λΌλŠ” 또 λ‹€λ₯Έ 것을 관리해야 ν•©λ‹ˆλ‹€. μ΄μ œλŠ” ν•« λ¦¬λ‘œλ”© 개발 μ„œλ²„μ— μ˜μ‘΄ν•˜κ²Œ λ˜μ—ˆμœΌλ©°, 이 μ„œλ²„κ°€ λ‘œμ»¬ν˜ΈμŠ€νŠΈμ—μ„œ 이듀을 μ΅œμ‹  μƒνƒœλ‘œ μœ μ§€ν•΄ 쀄 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€ν…Œμ΄μ§• μ„œλ²„μ—μ„œλŠ” μ–΄λ–»κ²Œ λ κΉŒμš”? ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ”μš”? μ΄λŸ¬ν•œ ν™˜κ²½μ—μ„œ λ°œμƒν•˜λŠ” 버그λ₯Ό μΆ”μ ν•˜κΈ°κ°€ 더 μ–΄λ €μ›Œμ§ˆ κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” ν•΄κ²°ν•  수 μžˆλŠ” λ¬Έμ œμ΄μ§€λ§Œ, μ—¬λŸ¬λΆ„μ΄ λ§Œλ“  문제이며, μ΄λŠ” λŒ€κ°€μž…λ‹ˆλ‹€.

htmx의 DXλŠ” 맀우 κ°„λ‹¨ν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 단일 νŒŒμΌμ„ λ‘œλ“œν•˜λ©°, 이 νŒŒμΌμ€ λͺ¨λ“  ν™˜κ²½μ—μ„œ μ—¬λŸ¬λΆ„μ΄ μž‘μ„±ν•œ 것과 λ™μΌν•œ νŒŒμΌμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½ν—˜μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λŒ€κ°€λ„ μ‘΄μž¬ν•˜μ§€λ§Œ, 이 ν”„λ‘œμ νŠΈμ— μ ν•©ν•œ μ„ νƒμž…λ‹ˆλ‹€.

#λͺ…ν™•μ„± κ°•μ œ

λͺ¨λ“ˆν™”λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ˜ ν›Œλ₯­ν•œ 아이디어 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. λͺ¨λ“ˆμ€ μ½”λ“œλ₯Ό 더 μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 잘 μ •μ˜λœ ν•˜μœ„ ꡬ쑰둜 λ‚˜λˆ”μœΌλ‘œμ¨ 맀우 λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. λͺ¨λ“ˆμ€ 맀우 μœ μš©ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ•Œλ•Œλ‘œ μ—¬λŸ¬λΆ„μ΄ λ‹¨μˆœν•œ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•  λ•Œ, λ˜λŠ” μƒλŒ€μ μœΌλ‘œ λ‹¨μˆœν•œ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•  λ•Œ, 더 λ³΅μž‘ν•œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ΄λ“€μ˜ λ³΅μž‘μ„±μ„ 흉내 λ‚΄λ©΄μ„œ λ™λ“±ν•œ κ°€μΉ˜λ₯Ό μ°½μΆœν•˜μ§€ λͺ»ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 htmxλŠ” μƒλŒ€μ μœΌλ‘œ λ‹¨μˆœν•œ 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€. 즉, 선언적인 ν•˜μ΄νΌν…μŠ€νŠΈ νŠΉμ„±μ„ μ‚¬μš©ν•˜μ—¬ DOM μš”μ†Œλ₯Ό 더 μ‰½κ²Œ λŒ€μ²΄ν•  수 μžˆλ„λ‘ HTML에 λͺ‡ 가지 속성을 μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. htmxλ₯Ό 단일 파일둜 μœ μ§€ν•˜λŠ” 것(ν˜„μž¬ μ•½ 3,500쀄)은 λΌμ΄λΈŒλŸ¬λ¦¬μ— μ˜λ„μ„±μ„ λΆ€μ—¬ν•˜λ©°, μƒˆλ‘œμš΄ μ½”λ“œλ₯Ό μΆ”κ°€ν•  λ•Œ μ‹€μ§ˆμ μΈ 압박감을 μ€λ‹ˆλ‹€. μ΄λŠ” μƒλŒ€μ μœΌλ‘œ λ‹¨μˆœν•¨μ„ μœ μ§€ν•˜λŠ” κ· ν˜•μ„ μœ μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

DX λΉ„μš©μ€ λͺ…ν™•ν•˜μ§€λ§Œ, λ†€λΌμš΄ DX 이점도 μžˆμŠ΅λ‹ˆλ‹€. μ†ŒμŠ€ νŒŒμΌμ—μ„œ ν•¨μˆ˜ 이름을 κ²€μƒ‰ν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ˜ λͺ¨λ“  ν˜ΈμΆœμ„ μ¦‰μ‹œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€(이것은 더 κ³ κΈ‰ μ½”λ“œ νƒμƒ‰μ˜ ν•„μš”μ„±μ„ μ€„μž…λ‹ˆλ‹€). κΈ°λŠ₯이 숨겨질 수 μžˆλŠ” 곳이 μ—†κΈ° λ•Œλ¬Έμ— htmx μž‘μ—…μ΄ 훨씬 더 μ ‘κ·Όν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€. 훨씬 더 λ³΅μž‘ν•œ ν”„λ‘œμ νŠΈμ—μ„œλ„ 이 μ ‘κ·Ό 방식을 λΆ€λΆ„μ μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, SQLite3λŠ” 단일 파일 μ†ŒμŠ€ ν•©λ³‘μ—μ„œ 컴파일되며(λ¬Όλ‘  κ°œλ°œμ„ μœ„ν•΄ λ³„λ„μ˜ νŒŒμΌμ„ μ‚¬μš©ν•˜μ§€λ§Œ, 그듀도 λ―Έμ³€μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€), 이λ₯Ό 톡해 ν•΄ν‚Ήν•˜κΈ°κ°€ 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€. λ¦¬λˆ…μŠ€ 컀널을 μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ ꡬ좕할 μˆ˜λŠ” μ—†κ² μ§€λ§Œ, htmxλŠ” λ¦¬λˆ…μŠ€ 컀널이 μ•„λ‹™λ‹ˆλ‹€.

#λΉ„μš©

λͺ¨λ“  기술 μ„ νƒμ—λŠ” μž₯점과 단점이 μžˆμŠ΅λ‹ˆλ‹€. λΉŒλ“œ 단계λ₯Ό μƒλž΅ν•˜λŠ” 선택 μ—­μ‹œ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ„ νƒμ˜ μž₯단점을 μΈμ‹ν•˜μ—¬ 정보에 μž…κ°ν•œ 결정을 내릴 수 μžˆμ–΄μ•Ό ν•˜λ©°, μ–΄λ–€ μž₯μ μ΄λ‚˜ 단점이 더 이상 μ μš©λ˜μ§€ μ•Šμ„ λ•Œ κ·Έ 결정을 μž¬κ²€ν† ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 순수 JavaScript둜 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μž₯점을 염두에 두고, 이둜 인해 λ°œμƒν•˜λŠ” λ¬Έμ œμ λ“€μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

#정적 νƒ€μž…μ΄ μ—†λ‹€

TypeScriptλŠ” JavaScript의 μ—„κ²©ν•œ μƒμœ„ 집합이며, TypeScriptκ°€ μ œκ³΅ν•˜λŠ” λͺ‡ 가지 κΈ°λŠ₯은 맀우 μœ μš©ν•©λ‹ˆλ‹€. TypeScriptλŠ”β€¦ νƒ€μž…μ„ μ œκ³΅ν•˜λ©°, μ΄λŠ” IDEκ°€ μ½”λ“œλ₯Ό μ œμ•ˆν•˜λŠ” λŠ₯λ ₯을 ν–₯μƒμ‹œν‚€κ³ , λ©”μ„œλ“œλ₯Ό 잘λͺ» μ‚¬μš©ν–ˆμ„ κ°€λŠ₯성이 μžˆλŠ” 뢀뢄을 지적해 μ€λ‹ˆλ‹€. TypeScriptμ—μ„œλŠ” μ½”λ“œμ˜ 이름 λ³€κ²½ 및 λ¦¬νŒ©ν„°λ§ 도ꡬ가 JavaScript보닀 훨씬 더 μ‹ λ’°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ htmx μ½”λ“œλŠ” JavaScript둜 μž‘μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” λΈŒλΌμš°μ €κ°€ JavaScriptλ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 그리고 JavaScriptκ°€ 동적 νƒ€μž…μ„ μœ μ§€ν•˜λŠ” ν•œ, htmx μ†ŒμŠ€ μ½”λ“œμ—μ„œ μ§„μ •ν•œ 정적 νƒ€μž…μ„ μ–»κΈ° μœ„ν•œ νŠΈλ ˆμ΄λ“œμ˜€ν”„λŠ” κ°€μΉ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€(ν•˜μ§€λ§Œ htmx μ‚¬μš©μžλŠ” μ—¬μ „νžˆ .d.ts 파일둜 μ„ μ–Έλœ νƒ€μž… APIλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€).

미래의 htmx λ²„μ „μ—μ„œλŠ” JSDoc을 μ‚¬μš©ν•˜μ—¬ λΉŒλ“œ 단계 없이도 일뢀 보μž₯을 μ œκ³΅ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬λ“€, 예λ₯Ό λ“€μ–΄ Svelte, μ—­μ‹œ 디버깅 마찰둜 인해 이 λ°©ν–₯으둜 λ‚˜μ•„κ°€κ³  μžˆμŠ΅λ‹ˆλ‹€.

#ES6 μ‚¬μš© λΆˆκ°€

htmxλŠ” Internet Explorer 11을 μ§€μ›ν•˜κ³  있으며, λΉŒλ“œ 단계가 μ—†κΈ° λ•Œλ¬Έμ— htmx의 λͺ¨λ“  μ½”λ“œλŠ” IE11κ³Ό ν˜Έν™˜λ˜λŠ” JavaScript둜 μž‘μ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λŠ” ES6λ₯Ό μ‚¬μš©ν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ JavaScriptκ°€ κ½€ μ’‹μ•„μ‘Œλ‹€κ³  말할 λ•Œ, 그듀은 일반적으둜 ES6μ—μ„œ λ„μž…λœ async/await, 읡λͺ… ν•¨μˆ˜, ν•¨μˆ˜ν˜• λ°°μ—΄ λ©”μ„œλ“œ(.map, .forEach)와 같은 μ–Έμ–΄ κΈ°λŠ₯을 λ§ν•˜λŠ”λ°, μ΄λŸ¬ν•œ κΈ°λŠ₯듀은 htmx μ†ŒμŠ€ μ½”λ“œμ—μ„œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

이것은 맀우 μ§œμ¦λ‚˜λŠ” μΌμ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” 큰 μž₯애물이 λ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 멋진 μ–Έμ–΄ κΈ°λŠ₯이 λΆ€μ‘±ν•˜λ‹€κ³  ν•΄μ„œ ν•¨μˆ˜ν˜• νŒ¨λŸ¬λ‹€μž„μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μ—†κ²Œ λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. forEach λ©”μ„œλ“œλ₯Ό μ»€μŠ€ν…€μœΌλ‘œ μž‘μ„±ν•  ν•„μš”κ°€ μ—†μœΌλ©΄ μ’‹κ² μ£ ? λ¬Όλ‘ μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ htmxκ°€ λͺ©ν‘œλ‘œ ν•˜λŠ” λͺ¨λ“  λΈŒλΌμš°μ €κ°€ ES6λ₯Ό 지원할 λ•ŒκΉŒμ§€ ES5에 λͺ‡ 가지 헬퍼 ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜λŠ” 것은 어렡지 μ•ŠμŠ΅λ‹ˆλ‹€. ES6에 μ΅μˆ™ν•˜λ‹€λ©΄ 더 λ‚˜μ€ ES5 μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ μž‘μ„±ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

htmx 2.0μ—μ„œλŠ” IE11 지원이 μ€‘λ‹¨λ˜λ©°, κ·Έλ•ŒλΆ€ν„°λŠ” μ†ŒμŠ€ μ½”λ“œμ— ES6 μ‚¬μš©μ΄ ν—ˆμš©λ  κ²ƒμž…λ‹ˆλ‹€.

#ν•΅μ‹¬μ—μ„œ λͺ¨λ“ˆ μ‚¬μš© λΆˆκ°€

이 점은 λΆ„λͺ…ν•˜μ§€λ§Œ, λ‹€μ‹œ ν•œ 번 μ–ΈκΈ‰ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. htmx μ†ŒμŠ€λŠ” λͺ¨λ“ˆλ‘œ 뢄리할 수 μžˆλ‹€λ©΄ 훨씬 더 깔끔할 κ²ƒμž…λ‹ˆλ‹€. 청결함 외에도 μ½”λ“œ ν’ˆμ§ˆμ— 영ν–₯을 λ―ΈμΉ˜λŠ” λ‹€λ₯Έ μš”μ†Œλ“€μ΄ μžˆμ§€λ§Œ, htmx μ†ŒμŠ€κ°€ 높은 ν’ˆμ§ˆμ„ μœ μ§€ν•˜λŠ” μ΄μœ λŠ” 깔끔함 λ•Œλ¬Έμ΄ μ•„λ‹™λ‹ˆλ‹€.

이둜 인해 htmx둜 νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 맀우 μ–΄λ €μ›Œμ§‘λ‹ˆλ‹€. idiomorph μ•Œκ³ λ¦¬μ¦˜μ΄ htmx 2.0 핡심에 포함될 수 μžˆμ§€λ§Œ, μ‚¬λžŒλ“€μ΄ htmx 없이 DOM λ³€ν™˜ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ³„λ„μ˜ νŒ¨ν‚€μ§€λ‘œ μœ μ§€λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 핡심에 μ—¬λŸ¬ νŒŒμΌμ„ 포함할 수 μžˆλ‹€λ©΄, git μ„œλΈŒλͺ¨λ“ˆκ³Ό 같은 미러링 μŠ€ν‚΄μœΌλ‘œ μ‰½κ²Œ 이λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμ„ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 핡심이 단일 파일둜 κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ idiomorph μ½”λ“œλ„ κ·Έ μ•ˆμ— ν¬ν•¨λ˜μ–΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

#μ΅œμ’… 생각

이 μ—μ„Έμ΄λŠ” β€œμ™œ htmxκ°€ μ§€κΈˆ λ‹Ήμž₯ λΉŒλ“œ 단계가 μ—†λŠ”κ°€β€œλΌλŠ” 제λͺ©μ΄ 더 μ μ ˆν•  κ²ƒμž…λ‹ˆλ‹€. μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄, 상황은 λ³€ν•˜λ©° μ΄λŸ¬ν•œ νŠΈλ ˆμ΄λ“œμ˜€ν”„λŠ” μ–Έμ œλ“ μ§€ μž¬κ²€ν† λ  수 μžˆμŠ΅λ‹ˆλ‹€! ν˜„μž¬ μš°λ¦¬κ°€ 탐ꡬ 쀑인 문제 쀑 ν•˜λ‚˜λŠ” λ¦΄λ¦¬μŠ€μ™€ 관련이 μžˆμŠ΅λ‹ˆλ‹€. htmxκ°€ 릴리슀λ₯Ό ν•  λ•Œ, λͺ‡ 가지 μ…Έ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ dist 디렉토리에 λ―Έλ‹ˆνŒŒμ΄λ˜κ³  μ••μΆ•λœ htmx.js 버전을 μ±„μ›λ‹ˆλ‹€(μ—„λ°€νžˆ λ§ν•˜μžλ©΄, 이것은 μ–΄λ–€ μ˜λ―Έμ—μ„œλŠ” λΉŒλ“œ 단계라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€). μ•žμœΌλ‘œλŠ” 이 슀크립트λ₯Ό ν™•μž₯ν•˜μ—¬ μœ λ‹ˆλ²„μ„€ λͺ¨λ“ˆ μ •μ˜(UMD)λ₯Ό μžλ™μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜λŠ” μƒˆλ‘œμš΄ 배포 μš”κ΅¬ 사항이 생겨 더 λ³΅μž‘ν•œ 섀정이 ν•„μš”ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λˆ„κ°€ μ•Œκ² μŠ΅λ‹ˆκΉŒ!

htmx의 핡심 κ°€μΉ˜λŠ” μ§€λ‚œ 10λ…„ λ™μ•ˆ 점점 더 λ³΅μž‘ν•΄μ§„ JavaScript μŠ€νƒμ΄ 지배해 온 μ›Ή 개발 μƒνƒœκ³„μ—μ„œ 선택을 μ œκ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν”„λ‘ νŠΈμ—”λ“œ JavaScript μ½”λ“œλ² μ΄μŠ€κ°€ κ±°λŒ€ν•˜μ§€ μ•ŠμœΌλ©΄ λ°±μ—”λ“œμ— JavaScriptλ₯Ό 채택해야 ν•œλ‹€λŠ” 압박이 훨씬 μ μ–΄μ§‘λ‹ˆλ‹€. Python, Go, 심지어 NodeJS둜 λ°±μ—”λ“œλ₯Ό μž‘μ„±ν•΄λ„ μƒκ΄€μ—†μŠ΅λ‹ˆλ‹€. htmxμ—λŠ” μ€‘μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ£Όμš” μ–Έμ–΄λ§ˆλ‹€ HTML을 ν¬λ§·νŒ…ν•˜κΈ° μœ„ν•œ μ„±μˆ™ν•œ μ†”λ£¨μ…˜μ΄ 있기 λ§ˆλ ¨μž…λ‹ˆλ‹€. μ΄λŠ” HOWL(Hypermedia On Whatever you’d Like) μ›μΉ™μž…λ‹ˆλ‹€.

λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€ 없이 JavaScriptλ₯Ό μž‘μ„±ν•˜λŠ” 것은 더 이상 NextJSλ‚˜ SvelteKit이 ν•„μš”ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ SPA ν”„λ ˆμž„μ›Œν¬μ˜ λ³΅μž‘μ„±μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 선택 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이 선택은 μ˜€λŠ˜λ‚  htmx κ°œλ°œμ— μ ν•©ν•˜λ©°, μ—¬λŸ¬λΆ„μ˜ 앱에도 적합할 수 μžˆμŠ΅λ‹ˆλ‹€.

</>