htmx란 무엇이며 내 웹사이트를 어떻게 단순화할 수 있나요?

빠른 탐색

핵심 요약

  • htmx는 HTML 속성을 통해 일반적인 기능을 구현하여 HTTP 요청 처리를 간소화하는 JavaScript 라이브러리입니다.
  • 웹 애플리케이션에 htmx를 손쉽게 추가하려면 CDN에서 제공하는 스크립트 링크를 활용하면 됩니다.
  • htmx를 사용하면 JavaScript 코드를 작성하지 않고도 페이지네이션, 폼 유효성 검사, 인라인 편집 등 다양한 상호작용 기능을 구현할 수 있습니다.

최근 웹 개발 분야에서 htmx에 대한 관심이 높아지고 있습니다. 그렇다면 이 새로운 기술은 정확히 무엇일까요? htmx는 생각보다 훨씬 간단하지만, 그 유용성은 충분히 주목할 만합니다.

htmx란 무엇인가?

htmx는 특정 기능에 집중하는 소규모 JavaScript 라이브러리입니다. HTML 속성을 통해 일반적인 JavaScript 기능을 사용할 수 있도록 지원합니다. 간단한 예를 들어보겠습니다.

<a href="https://wilku.top/about" hx-get="https://wilku.top/about">소개</a>

위 코드는 ‘hx-get’이라는 사용자 정의 HTML 속성을 사용한 예시입니다. 이 링크를 클릭하면 htmx 라이브러리가 AJAX 요청을 보내고, 전체 브라우저를 새로 고침 없이 해당 페이지를 로드합니다.

htmx는 요청 전송과 관련하여 다음과 같은 추가적인 기능을 제공합니다.

htmx는 CSS 애니메이션과 WebSocket과 같은 기술도 지원하지만, 주요 목표는 HTTP 요청 처리를 단순화하는 것입니다.

간단한 웹 애플리케이션에서 htmx 활용하기

htmx는 전체 애플리케이션의 동작보다는 웹 애플리케이션이나 웹사이트 내의 특정 기능을 처리하는 데 적합합니다.

이 라이브러리의 가장 큰 장점 중 하나는 쉽게 시작할 수 있다는 점입니다. 라이브러리 복사본을 다운로드하여 설치할 수도 있지만, 종속성이 없으므로 CDN에서 제공하는 스크립트 링크를 추가하는 것만으로도 충분합니다.

<script
  src="https://unpkg.com/[email protected]"
  integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
  crossorigin="anonymous"></script>

로컬 개발 및 테스트 환경에서는 Apache와 같은 웹 서버를 구성해야 합니다. ‘file:’ 프로토콜은 AJAX 요청을 허용하지 않으므로 정적 파일을 사용할 경우에도 웹 서버가 필요합니다.

무한 스크롤 예시

무한 스크롤은 트위터와 같은 사이트에서 피드에 자주 사용되는 기술입니다. 목록의 맨 아래에 도달하면 추가 항목을 로드하여 계속해서 내용을 읽을 수 있도록 합니다.

이 기능을 구현하려면 페이지 스크롤 위치를 감지하고, 페이지를 새로 고치지 않고 새 항목을 로드하는 JavaScript 코드가 필요합니다. 하지만 htmx를 사용하면 이 모든 작업을 간단하게 처리할 수 있습니다.

다음은 각 게시물에 이미지가 포함된 게시물 목록의 마크업 예시입니다.

<ol>
    <li><img src="http://placekitten.com/420/300" /></li>
    <li><img src="http://placekitten.com/400/320" /></li>
    <li><img src="http://placekitten.com/440/300" /></li>
    <li><img src="http://placekitten.com/420/340" /></li>
    <li><img src="http://placekitten.com/300/200" /></li>
</ol>

이러한 항목이 ‘Feed1.html’ 파일에 있고, 추가 항목이 ‘Feed2.html’ 등에 있다고 가정해 보겠습니다. 각 페이지에는 스크롤 가능한 항목의 작은 하위 집합이 표시됩니다.

‘다음 페이지’ 링크를 사용하여 페이지를 탐색할 수도 있지만, 무한 스크롤을 더욱 쉽게 구현할 수 있습니다. 마지막 항목을 다음과 같이 변경합니다.

<li hx-trigger="revealed" hx-get="feed2.html" hx-select="li" hx-swap="afterend">
    <img src="http://placekitten.com/300/200" />
</li>

이 네 가지 속성을 마지막 목록 항목에 추가하면 무한 스크롤 기능이 구현됩니다. 각 속성이 의미하는 바는 다음과 같습니다.

속성 의미
hx-trigger revealed 이 요소가 화면에 처음 나타날 때…
hx-get Feed2.html … Feed2.html에 GET 요청을 전송하고…
hx-select li … 응답에서 li 요소를 선택하고…
hx-swap afterend … 이 요소 뒤에 추가합니다.

목록의 아래쪽으로 스크롤하면 새 콘텐츠가 자동으로 로드되는 것을 확인할 수 있습니다. 스크롤바를 주의 깊게 살펴보거나 브라우저의 개발자 도구를 사용하여 확인할 수 있습니다.

간단한 정적 페이지 설정에서는 ‘Feed2.html’ 페이지에 ‘hx-get’ 속성이 ‘Feed3.html’로 설정된 마지막 항목이 포함되어 있습니다. 또한 htmx가 스크롤 이벤트에 대한 리스너를 추가하는 방법도 확인해 보세요.

htmx의 다른 잠재적 활용

htmx는 다음과 같은 다양한 일반적인 상호 작용을 구현하는 데 사용할 수 있습니다.

  • 페이지네이션: 사용자가 페이지네이션 링크를 클릭하면 항목을 로드하고 교체합니다.
  • 폼 유효성 검사: 폼 제출 시 검증 메시지나 폼의 하위 집합으로 교체합니다.
  • 진행률 표시줄: 서버 응답에 따라 진행률 표시줄 값을 주기적으로 업데이트합니다.
  • 인라인 편집: 해당 요소의 값을 포함하는 텍스트 영역으로 요소를 교체합니다.

위의 각 예는 표준 JavaScript를 사용하여 구현할 수 있지만, htmx를 사용하면 프로세스를 훨씬 쉽게 만들 수 있습니다.

htmx의 장점과 단점

장점

htmx는 많은 웹 애플리케이션과 웹사이트에서 일반적인 상호작용을 크게 단순화할 수 있습니다. 이를 통해 디자이너와 프런트엔드 개발자들은 JavaScript를 배우지 않고도 기능을 추가할 수 있습니다.

일반적인 동작을 추상화함으로써 htmx는 프로젝트 전체 또는 프로젝트 간에 일관성을 유지할 수 있도록 합니다. 무한 스크롤은 구현 주체와 관계없이 모든 페이지에서 동일한 방식으로 작동합니다.

명령적(어떻게) 접근 방식이 아닌 선언적(무엇) 접근 방식을 강조하므로, htmx 기능은 일반적으로 이해하고 추론하기가 더 쉽습니다.

단점

htmx를 사용하면 많은 경우에 JavaScript를 사용하지 않고 작업을 수행할 수 있지만, 모든 문제를 해결할 수 있는 것은 아닙니다! 특정 비즈니스 로직이나 하위 수준의 기능을 처리하려면 여전히 코드를 작성해야 합니다.

htmx는 많은 작업을 처리하므로 동작을 사용자 정의하는 데 제약이 있을 수 있습니다. 이는 대부분의 경우 긍정적인 부분이지만, 어느 정도의 제어권을 포기해야 할 수도 있다는 점을 염두에 두어야 합니다.

htmx를 사용하면 JavaScript 코드를 작성하지 않을 수 있지만, 백그라운드에서는 여전히 JavaScript 코드가 실행된다는 점을 알아야 합니다. 모든 링크에서 ‘href’ 속성 대신 ‘hx-get’ 속성을 사용하는 것이 매력적일 수 있지만, 이는 결국 JavaScript에 대한 의존성을 발생시킵니다. 코드가 어떤 이유로든 실행되지 않으면 사용자에게는 아무 기능도 수행하지 않는 링크가 남게 됩니다. 따라서 점진적 개선을 적용하는 것이 중요합니다.