Alpine.js
Alpine.js
경량 JavaScript 프레임워크. HTML 속성으로 반응형 동작.
Alpine.js
경량 JavaScript 프레임워크. HTML 속성으로 반응형 동작.
Alpine.js는 Vue.js의 반응성 시스템에서 영감을 받은 초경량 JavaScript 프레임워크입니다. 번들 크기가 15KB 미만(gzip 압축 시 약 7KB)으로, CDN에서 스크립트 하나만 추가하면 바로 사용할 수 있습니다. "JavaScript 버전의 Tailwind CSS"라고 불리며, HTML 마크업 안에서 직접 동작을 선언하는 방식을 채택합니다.
2019년 Caleb Porzio가 만들었으며, Laravel Livewire와 함께 사용되면서 주목받았습니다. jQuery를 대체할 현대적 도구로 포지셔닝되어, 빌드 단계 없이 간단한 인터랙션을 추가하고 싶은 개발자들에게 인기를 얻었습니다. 현재 GitHub 스타 25,000개 이상을 보유하고 있습니다.
Alpine.js는 x-data로 컴포넌트 상태를 정의하고, x-bind, x-on, x-show, x-if 같은 디렉티브로 DOM을 조작합니다. Vue.js와 문법이 유사해서 Vue 경험자는 즉시 적응할 수 있으며, 반응성 시스템이 내장되어 상태 변경 시 자동으로 UI가 업데이트됩니다.
실무에서는 드롭다운, 모달, 탭, 아코디언 같은 간단한 UI 컴포넌트에 주로 사용됩니다. 서버 사이드 렌더링 페이지에 약간의 인터랙션을 추가하거나, React/Vue를 사용하기에는 과한 소규모 프로젝트에서 빛을 발합니다.
<!-- Alpine.js 기본 사용법 -->
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<!-- 토글 버튼 예제 -->
<div x-data="{ open: false }">
<button @click="open = !open">
메뉴 열기
</button>
<div x-show="open" x-transition>
<p>드롭다운 콘텐츠</p>
</div>
</div>
<!-- 카운터 예제 -->
<div x-data="{ count: 0 }">
<button @click="count++">+1</button>
<span x-text="count"></span>
<button @click="count--">-1</button>
</div>
<!-- API 데이터 가져오기 -->
<div x-data="{ users: [] }" x-init="users = await (await fetch('/api/users')).json()">
<template x-for="user in users" :key="user.id">
<div x-text="user.name"></div>
</template>
</div>
"이 랜딩 페이지는 간단한 모달이랑 아코디언만 필요한데, React 쓰기엔 좀 과한 것 같아요. Alpine.js로 빠르게 구현하면 빌드 단계도 없고 CDN 하나로 끝나니까 유지보수도 편할 것 같습니다."
"Alpine.js는 '작은 Vue'라고 불립니다. x-data로 상태를 정의하고, x-show, x-if로 조건부 렌더링을 하죠. 번들러 설정 없이 HTML에 바로 쓸 수 있어서, 서버 렌더링 페이지에 인터랙션 추가할 때 자주 사용했습니다."
"이 부분 x-show 대신 x-if를 쓰면 좋겠어요. x-show는 CSS display로 숨기는 거라 DOM에 남아있고, x-if는 아예 DOM에서 제거하거든요. 대량의 리스트에서는 x-if가 성능상 유리합니다."
Alpine.js는 간단한 인터랙션용입니다. 복잡한 상태 관리, 라우팅, 코드 스플리팅이 필요하면 React, Vue, Next.js를 선택하세요.
Alpine의 상태는 x-data가 선언된 요소와 그 자식들에서만 접근 가능합니다. 형제나 부모 요소에서는 접근할 수 없습니다.
컴포넌트별로 x-data를 분리하고, 글로벌 상태가 필요하면 Alpine.store()를 사용하세요. 재사용 로직은 Alpine.data()로 등록합니다.