본문 바로가기

전체 글

(311)
[Vue.js 2026-09-28] HTML5 드래그 앤 드롭으로 칸반 보드 만들기 - draggable, dragstart/dragover/drop, dataTransfer, 순서 변경, 컴포넌트 분리 할 일(To Do) → 진행 중(Doing) → 완료(Done)처럼 카드를 끌어서 옮기는 칸반 보드는 드래그 앤 드롭 UI의 대표적인 예입니다. 별도의 라이브러리 없이도 브라우저에 내장된 HTML5 Drag and Drop API와 Vue의 이벤트 바인딩, 반응형 배열만으로 충분히 구현할 수 있습니다. 드래그 앤 드롭을 구현하려면 다음 이벤트의 역할을 이해해야 합니다. draggable="true" : 요소를 드래그할 수 있게 만듭니다.dragstart : 드래그를 시작할 때 드래그 대상 요소에서 발생합니다. 무엇을 끌고 있는지 기록합니다.dragover : 드래그 중인 요소가 다른 요소 위를 지나갈 때 계속 발생합니다. event.preventDefault()를 호출해야 drop이 허용됩니다.drage..
[Vue.js 2026-09-28] 라우터 없이 해시 기반 라우팅 구현하기 - hashchange, 동적 컴포넌트, 경로 파라미터, 쿼리, 미니 라우터 플러그인 Vue로 여러 화면을 가진 SPA(Single Page Application)를 만들 때는 보통 공식 라우터인 Vue Router를 사용합니다. 하지만 화면이 몇 개 되지 않는 작은 앱이나 위젯, 또는 라우터가 내부에서 어떻게 동작하는지 이해하고 싶을 때는 라우터를 직접 만들어 보는 것이 아주 좋은 공부가 됩니다. SPA 라우팅의 핵심 원리는 단순합니다. URL이 바뀌면 → 현재 경로를 반응형 상태에 저장하고 → 그 경로에 맞는 컴포넌트를 동적으로 렌더링하는 것입니다. URL의 # 뒤 부분(해시)은 바뀌어도 페이지가 새로 로딩되지 않고 hashchange 이벤트만 발생하기 때문에 가장 쉽게 구현할 수 있습니다. 이번 글에서는 hashchange 이벤트와 로 만드는 가장 단순한 라우팅부터, 라우트 테이블과..
[Vue.js 2026-09-28] useLocalStorage 컴포저블 만들기 - watch로 상태 영속화, 직렬화 옵션, 탭 간 동기화, 상태 공유 다크 모드 설정, 최근 검색어, 작성 중인 글, 장바구니처럼 새로고침해도 유지되어야 하는 상태가 있습니다. 브라우저의 localStorage에 저장하면 되지만, 값을 바꿀 때마다 setItem을 호출하고 처음 로딩할 때 getItem으로 읽어 오는 코드를 컴포넌트마다 반복하는 것은 번거롭습니다. Vue 3의 Composition API를 사용하면 이 로직을 useLocalStorage라는 컴포저블로 한 번만 만들어 두고, const theme = useLocalStorage('theme', 'light')처럼 일반 ref와 똑같이 사용할 수 있습니다. 값을 바꾸면 자동으로 저장되고, 다시 로딩하면 저장된 값이 복원됩니다. 이번 글에서는 watch로 상태를 저장하는 기본 원리부터, 재사용 가능한 컴포저블 ..
[Vue.js 2026-09-28] 페이지네이션(Pagination) 컴포넌트 만들기 - slice 계산, v-model:page, 말줄임 페이지 번호, 페이지 크기 변경, 서버 페이징 게시판, 상품 목록, 관리자 테이블처럼 데이터가 많은 화면에는 거의 항상 페이지네이션(Pagination)이 필요합니다. 한 번에 모든 데이터를 보여 주지 않고 일정 개수씩 나눠 보여 주면서, 사용자가 페이지 번호를 눌러 이동할 수 있게 하는 UI입니다. 페이지네이션을 직접 만들어 보면 computed로 파생 데이터 계산하기, defineModel을 이용한 컴포넌트 v-model, 경계값 처리, watch로 상태 보정하기 등 Vue의 핵심 문법을 자연스럽게 연습할 수 있습니다. 이번 글에서는 배열을 페이지 단위로 자르는 기본 원리부터 시작해서, 재사용 가능한 Pagination 컴포넌트, 페이지가 많을 때 "1 … 4 5 6 … 20"처럼 말줄임으로 번호를 보여 주는 알고리즘, 페이지 크기 변경 처리, ..
[Vue.js 2026-09-28] 검색 자동완성(Autocomplete) 컴포넌트 만들기 - computed 필터, debounce, 키보드 탐색, 하이라이트, 슬롯 검색창에 글자를 입력하면 아래에 추천 검색어가 나타나는 자동완성(Autocomplete)은 거의 모든 서비스에서 볼 수 있는 UI입니다. 간단해 보이지만 직접 만들어 보면 Vue의 여러 핵심 문법이 골고루 필요합니다. 입력값으로 목록을 거르는 computed서버 요청 횟수를 줄이는 watch + debounce와 로딩 상태방향키와 Enter, Esc로 조작하는 키 이벤트 수식어일치하는 글자를 강조하는 하이라이트 (v-html 없이 안전하게)어디서나 재사용할 수 있도록 defineModel, emit, 범위 슬롯으로 컴포넌트화 이번 글에서는 가장 단순한 형태부터 시작해 위 기능을 하나씩 추가하면서 완성도 있는 자동완성 컴포넌트를 만들어 보겠습니다. 1. 기본 자동완성 - computed로 필터링 먼저 전체..
[Vue.js 2026-09-28] 장바구니 만들기로 배우는 computed와 리스트 조작 - 수량 변경, 합계, 할인/배송비, 정렬, 전체 선택 Vue.js의 핵심 문법을 가장 잘 연습할 수 있는 예제 중 하나가 쇼핑몰 장바구니입니다. 장바구니에는 배열에 항목 추가/삭제, 수량 변경, 합계 계산, 할인과 배송비 규칙, 정렬, 체크박스 전체 선택 등 실무에서 자주 만나는 로직이 모두 들어 있기 때문입니다. 이번 글에서는 장바구니를 단계별로 만들면서 반응형 배열 조작과 computed(계산된 속성)를 어떻게 활용하는지 자세히 알아보겠습니다. 특히 "화면에 보이는 값은 상태에서 계산해서 얻는다"는 원칙에 따라, 합계나 할인 금액 같은 파생 데이터를 별도 상태로 저장하지 않고 computed로 만드는 방법에 집중합니다. 1. 상품 담기 - find와 push 장바구니 상태는 { id, name, price, qty } 형태의 객체 배열로 관리합니다. 상..
[Vue.js 2026-09-28] JSON 스키마로 동적 폼 렌더링하기 - v-for, component :is, 필드 컴포넌트, 조건부 필드, 검증 규칙 관리자 화면이나 설문, 설정 페이지처럼 입력 항목이 자주 바뀌는 폼을 매번 템플릿에 하나하나 작성하면 유지보수가 어렵습니다. 이럴 때 많이 사용하는 방법이 스키마 기반 동적 폼(Schema-driven Form)입니다. 폼의 구조(필드 이름, 타입, 라벨, 옵션, 검증 규칙)를 JSON 형태의 스키마 데이터로 정의해 두고, Vue 컴포넌트가 그 스키마를 읽어 알맞은 입력 요소를 자동으로 렌더링하는 방식입니다. 필드를 추가하거나 순서를 바꿀 때 템플릿을 수정할 필요 없이 스키마 데이터만 바꾸면 됩니다. 이번 글에서는 v-for와 v-model로 만드는 가장 단순한 동적 폼에서 시작해서, component :is로 필드 타입별 컴포넌트를 매핑하는 방법, 다른 값에 따라 보였다 숨는 조건부 필드, 스키마에 검..
[Vue.js 2026-09-28] v-bind와 v-on 고급 문법 - 객체 바인딩, 동적 인자, 같은 이름 단축, 다중 핸들러, .prop/.attr 수식어 v-bind(:)와 v-on(@)은 Vue 템플릿에서 가장 많이 쓰는 디렉티브입니다. 대부분은 :src="url", @click="save"처럼 하나의 속성이나 이벤트를 연결하는 형태로 사용하지만, 두 디렉티브에는 알아 두면 코드를 훨씬 간결하게 만들어 주는 고급 문법이 있습니다. 이번 글에서는 객체로 여러 속성을 한 번에 바인딩하는 v-bind="obj", 이벤트를 객체로 연결하는 v-on="{ ... }", 속성/이벤트 이름 자체를 변수로 만드는 동적 인자, Vue 3.4에서 추가된 같은 이름 단축 문법, 하나의 이벤트에 여러 핸들러를 연결하는 방법, 그리고 .prop / .attr / .camel 수식어까지 예제 코드와 실행 결과로 정리해 보겠습니다. 1. v-bind 객체 문법 - 여러 속성을 한..