002: Svelte 컴포넌트 기초
Svelte 컴포넌트 구조
Svelte 컴포넌트는 세 가지 주요 섹션으로 구성됩니다: 스크립트, 마크업, 스타일. 각 섹션은 특정 역할을 담당하며, 모든 섹션은 선택적입니다.
실시간 예제:
기본 컴포넌트
Svelte 5는 웹 애플리케이션을 구축하기 위한 컴포넌트 기반 프레임워크입니다. 이 예제는 Svelte의 가장 기본적인 컴포넌트 구조를 보여줍니다.
주요 특징:
$state
룬(rune)을 사용한 반응형 상태 관리- 중괄호
{}
를 사용한 변수 보간법 bind:value
를 통한 양방향 데이터 바인딩
Hello world!
컴포넌트 코드:
<script lang="ts"> // 기본 컴포넌트 예제 let name = $state<string>('world'); </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">기본 컴포넌트</h3> <h1 class="text-sky-600">Hello {name}!</h1> <div class="mt-4"> <label for="name-change-input" class="block text-white mb-2">이름 변경:</label> <input id="name-change-input" type="text" bind:value={name} class="bg-slate-800 text-white border border-slate-600 p-2 rounded" /> </div> </div>
실시간 예제:
컴포넌트 구조 예제
Svelte 5 컴포넌트는 다양한 요소로 구성됩니다. 이 예제는 완전한 컴포넌트 구조를 보여줍니다.
주요 구성 요소:
- 임포트: 다른 컴포넌트나 유틸리티 함수를 가져옵니다.
- 상태 관리:
$state
룬으로 반응형 상태를 정의합니다. - 파생된 상태:
$derived
룬으로 다른 상태에서 계산된 값을 정의합니다. - 라이프사이클 훅:
onMount
와 같은 함수로 컴포넌트 생명주기에 연결합니다. - 이벤트 핸들러: 사용자 상호작용에 응답하는 함수를 정의합니다.
- 자식 컴포넌트: 다른 컴포넌트를 포함하고 속성을 전달합니다.
컴포넌트 구조 데모
카운트: 0, 두 배: 0
자식 컴포넌트:
현재 카운트: 0
자식 컴포넌트 설명:
Svelte 5에서는 $props
룬을 사용하여 부모 컴포넌트로부터 속성을 받습니다.
이 컴포넌트는 message
속성을 받으며, 기본값으로 "기본 메시지"를 사용합니다.
TypeScript를 사용하여 props의 타입을 명시적으로 정의할 수 있습니다.
자식 컴포넌트 코드:
<script lang="ts"> // 자식 컴포넌트 예제 let { message = "기본 메시지" } = $props<{message?: string}>(); </script> <div class="p-3 border border-slate-600 rounded bg-slate-800"> <p class="text-sm text-gray-400 mb-1">자식 컴포넌트:</p> <p class="text-white">{message}</p> </div>
이 예제는 전체 컴포넌트 구조의 주요 요소를 보여줍니다:
- 임포트 (ChildComponent, onMount)
- 상태 관리 (count)
- 파생된 값 (count의 두 배)
- 라이프사이클 (onMount)
- 이벤트 핸들러 (증가 버튼)
- 자식 컴포넌트와의 통신 (메시지 전달)
컴포넌트 코드:
<script lang="ts"> // 컴포넌트 구조 예제 import { onMount } from 'svelte'; import ChildComponent from './ChildComponent.svelte'; let count = $state<number>(0); let doubledCount = $derived<number>(count * 2); // 라이프사이클 예제 onMount(() => { console.log('컴포넌트가 마운트되었습니다'); }); function increment(): void { count += 1; } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">컴포넌트 구조 예제</h3> <div class="bg-slate-800 p-4 rounded"> <h1 class="text-xl text-sky-500">컴포넌트 구조 데모</h1> <p class="text-white mt-2">카운트: {count}, 두 배: {doubledCount}</p> <button onclick={increment} class="bg-sky-600 text-white py-2 px-4 rounded mt-3 hover:bg-sky-500" > 증가 </button> <!-- 자식 컴포넌트 사용 --> <div class="mt-4"> <ChildComponent message={`현재 카운트: ${count}`} /> </div> </div> </div>
반응성
Svelte의 핵심 기능 중 하나는 반응성입니다. 변수가 변경되면 DOM이 자동으로 업데이트됩니다. Svelte 5에서는 $state 룬을 사용하여 반응형 변수를 선언합니다.
실시간 예제:
반응성 예제
Svelte 5의 핵심 기능 중 하나는 반응성(reactivity)입니다. 상태가 변경되면 UI가 자동으로 업데이트됩니다.
이 예제는 다음과 같은 반응성 특징을 보여줍니다:
$state
룬을 사용한 반응형 변수 선언- 상태 변경 시 자동 UI 업데이트
- 간단한 상태 변경 함수 구현
- 템플릿에서 상태 값 사용
Svelte 5에서는 $state
룬을 사용하여 반응형 상태를 선언합니다. 이전 버전의 let count = 0
와 달리, 타입스크립트 타입 지정도 가능합니다.
버튼을 클릭할 때마다 카운터가 증가합니다.
컴포넌트 코드:
<script lang="ts"> // 반응성 예제 let count = $state<number>(0); function increment(): void { count += 1; } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">반응성 예제</h3> <button onclick={increment} class="bg-orange-600 text-white border-none py-2 px-4 rounded cursor-pointer text-base mr-2 mb-2 hover:bg-orange-500" > 클릭 횟수: {count} </button> <p class="text-gray-200">버튼을 클릭할 때마다 카운터가 증가합니다.</p> </div>
Props
컴포넌트는 props를 통해 데이터를 받을 수 있습니다. Svelte 5에서는 $props 룬을 사용하여 props를 정의합니다.
실시간 예제:
Props 예제
Svelte 5에서는 컴포넌트 간에 데이터를 전달하기 위해 props를 사용합니다. 이 예제는 props의 개념을 시뮬레이션합니다.
주요 특징:
- 입력 필드를 통한 props 값 변경
- 상태 변수를 사용한 반응형 데이터 관리
- 실시간으로 업데이트되는 출력 결과
실제 컴포넌트 간 통신에서는 $props
룬을 사용하여 부모로부터 속성을 받습니다.
Hello, visitor!
컴포넌트 코드:
<script lang="ts"> // Props 예제 let greeting = $state<string>('Hello'); let propsName = $state<string>('visitor'); </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">Props 예제</h3> <div class="mb-4"> <div class="flex items-center mb-4"> <label for="greeting-input" class="mr-2 min-w-20 text-gray-200">인사말:</label> <input id="greeting-input" type="text" bind:value={greeting} class="bg-slate-800 text-white border border-slate-600 p-2 rounded text-base" /> </div> <div class="flex items-center mb-4"> <label for="name-input" class="mr-2 min-w-20 text-gray-200">이름:</label> <input id="name-input" type="text" bind:value={propsName} class="bg-slate-800 text-white border border-slate-600 p-2 rounded text-base" /> </div> </div> <div class="bg-slate-800 p-4 rounded"> <h1 class="m-0 text-xl text-sky-500">{greeting}, {propsName}!</h1> </div> </div>
이벤트 처리
Svelte는 DOM 이벤트를 쉽게 처리할 수 있는 방법을 제공합니다. onclick, onmouseover, oninput 등의 이벤트 핸들러를 사용할 수 있습니다.
실시간 예제:
이벤트 처리 예제
Svelte 5에서는 DOM 이벤트를 처리하는 여러 방법을 제공합니다.
이 예제는 다음과 같은 이벤트 처리 방식을 보여줍니다:
onclick
속성에 함수 참조 전달하기- 인라인 화살표 함수를 사용한 이벤트 처리
- 이벤트 핸들러 내에서 상태 변경 및 사용자 상호작용
Svelte는 on:click
디렉티브도 지원하지만, 이 예제에서는 onclick
속성을 사용합니다.
컴포넌트 코드:
<script lang="ts"> // 이벤트 처리 예제 function handleClick(): void { alert('버튼이 클릭되었습니다!'); } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">이벤트 처리 예제</h3> <button onclick={handleClick} class="bg-orange-600 text-white border-none py-2 px-4 rounded cursor-pointer text-base mr-2 mb-2 hover:bg-orange-500" > 클릭하세요 </button> <button onclick={() => alert('인라인 핸들러!')} class="bg-orange-600 text-white border-none py-2 px-4 rounded cursor-pointer text-base mr-2 mb-2 hover:bg-orange-500" > 또 클릭하세요 </button> </div>
조건부 렌더링 (if 블록)
Svelte는 조건부로 콘텐츠를 렌더링하기 위한 if 블록을 제공합니다. 이를 통해 특정 조건이 충족될 때만 UI 요소를 표시할 수 있습니다.
실시간 예제:
조건부 렌더링 예제
Svelte 5에서는 {#if}
블록을 사용하여 조건부 렌더링을 구현할 수 있습니다.
이 예제는 다음과 같은 기능을 보여줍니다:
- 불리언 상태 변수를 사용한 조건부 렌더링
- 버튼 클릭으로 상태 토글하기
- 조건부 텍스트 표시 (삼항 연산자 사용)
- 트랜지션 효과를 적용한 조건부 콘텐츠
컴포넌트 코드:
<script lang="ts"> // 조건부 렌더링 예제 let showContent = $state<boolean>(false); function toggleContent(): void { showContent = !showContent; } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">조건부 렌더링 예제</h3> <button onclick={toggleContent} class="bg-orange-600 text-white border-none py-2 px-4 rounded cursor-pointer text-base hover:bg-orange-500" > {showContent ? '내용 숨기기' : '내용 보기'} </button> {#if showContent} <div class="mt-4 p-4 bg-slate-800 rounded transition-all duration-300 ease-in-out"> <p class="text-white">조건부로 렌더링된 내용입니다.</p> <p class="text-white mt-2">이 내용은 버튼을 클릭할 때만 표시됩니다.</p> </div> {/if} </div>
반복 렌더링 (each 블록)
Svelte의 each 블록을 사용하면 배열이나 객체의 각 항목에 대해 마크업을 반복할 수 있습니다. 각 항목에 고유한 키를 제공하면 효율적인 DOM 업데이트가 가능합니다.
실시간 예제:
반복 렌더링 예제
Svelte 5에서는 {#each}
블록을 사용하여 배열이나 반복 가능한 데이터를 렌더링할 수 있습니다.
이 예제는 다음과 같은 기능을 보여줍니다:
- 배열 데이터의 반복 렌더링
- 고유 키(key)를 사용한 효율적인 DOM 업데이트
- 배열 상태 변경 및 반응형 업데이트
- 불변성(immutability)을 유지하는 배열 업데이트 패턴
버튼을 클릭하면 새 아이템이 추가되고 목록이 자동으로 업데이트됩니다.
- 사과 ID: 1
- 바나나 ID: 2
- 오렌지 ID: 3
컴포넌트 코드:
<script lang="ts"> // 반복 렌더링 예제 type Item = { id: number; name: string; }; let items = $state<Item[]>([ { id: 1, name: '사과' }, { id: 2, name: '바나나' }, { id: 3, name: '오렌지' } ]); function addItem(): void { const id = items.length + 1; items = [...items, { id, name: `아이템 ${id}` }]; } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">반복 렌더링 예제</h3> <button onclick={addItem} class="bg-orange-600 text-white border-none py-2 px-4 rounded cursor-pointer text-base hover:bg-orange-500" > 아이템 추가 </button> <ul class="mt-4 space-y-2"> {#each items as item (item.id)} <li class="p-2 bg-slate-800 rounded text-white flex justify-between items-center"> <span>{item.name}</span> <span class="text-xs text-gray-400">ID: {item.id}</span> </li> {/each} </ul> </div>
HTML 태그 및 속성 바인딩
Svelte는 HTML 요소의 속성과 값을 바인딩하는 강력한 방법을 제공합니다. 이를 통해 폼 요소, 스타일, 클래스 등을 동적으로 제어할 수 있습니다.
실시간 예제:
HTML 속성 바인딩 예제
Svelte 5에서는 bind:value
, bind:checked
와 같은 디렉티브를 사용하여 HTML 요소의 속성과 상태를 양방향으로 바인딩할 수 있습니다.
이 예제는 다음과 같은 바인딩 기법을 보여줍니다:
bind:value
- 입력 필드와 상태 변수 연결bind:checked
- 체크박스와 불리언 상태 연결- 동적 클래스 바인딩 - 선택된 색상에 따라 버튼 스타일 변경
- 조건부 속성 -
disabled
속성을 상태에 따라 설정
입력된 값:
컴포넌트 코드:
<script lang="ts"> // HTML 속성 바인딩 예제 let inputValue = $state<string>(""); let isDisabled = $state<boolean>(false); let bgColor = $state<string>("bg-orange-600"); </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">HTML 속성 바인딩 예제</h3> <div class="space-y-4"> <div> <label for="input-value" class="block text-white mb-2">입력값:</label> <input id="input-value" bind:value={inputValue} class="p-2 rounded bg-slate-800 text-white border border-slate-600 w-full" placeholder="텍스트를 입력하세요" /> <p class="mt-2 text-white">입력된 값: {inputValue}</p> </div> <div> <label class="flex items-center text-white"> <input type="checkbox" bind:checked={isDisabled} class="mr-2" /> 버튼 비활성화 </label> </div> <div> <label for="button-color" class="block text-white mb-2">버튼 색상:</label> <select id="button-color" bind:value={bgColor} class="p-2 rounded bg-slate-800 text-white border border-slate-600" > <option value="bg-orange-600">주황색</option> <option value="bg-blue-600">파란색</option> <option value="bg-green-600">초록색</option> <option value="bg-red-600">빨간색</option> </select> </div> <button disabled={isDisabled} class="{bgColor} text-white py-2 px-4 rounded hover:opacity-90 disabled:opacity-50 disabled:cursor-not-allowed" > 스타일이 적용된 버튼 </button> </div> </div>
Tailwind CSS 클래스 설명:
클래스 | 설명 |
---|---|
space-y-4 | 자식 요소들 사이에 세로 간격(margin-top)을 1rem(16px)만큼 추가합니다. |
bg-slate-700 | 배경색을 zinc-700 색상(어두운 회색)으로 설정합니다. |
bg-slate-800 | 배경색을 zinc-800 색상(더 어두운 회색)으로 설정합니다. |
p-4 | 모든 방향(padding)에 1rem(16px)의 여백을 추가합니다. |
p-2 | 모든 방향(padding)에 0.5rem(8px)의 여백을 추가합니다. |
p-3 | 모든 방향(padding)에 0.75rem(12px)의 여백을 추가합니다. |
rounded | 요소에 기본 둥근 모서리(border-radius)를 적용합니다. |
text-white | 텍스트 색상을 흰색으로 설정합니다. |
text-sky-400 | 텍스트 색상을 주황색(orange-400)으로 설정합니다. |
text-gray-300 | 텍스트 색상을 밝은 회색(gray-300)으로 설정합니다. |
text-lg | 텍스트 크기를 크게(large) 설정합니다. |
text-sm | 텍스트 크기를 작게(small) 설정합니다. |
text-xs | 텍스트 크기를 매우 작게(extra small) 설정합니다. |
mb-2 | 아래쪽 여백(margin-bottom)을 0.5rem(8px)만큼 추가합니다. |
mt-2 | 위쪽 여백(margin-top)을 0.5rem(8px)만큼 추가합니다. |
mt-4 | 위쪽 여백(margin-top)을 1rem(16px)만큼 추가합니다. |
mr-2 | 오른쪽 여백(margin-right)을 0.5rem(8px)만큼 추가합니다. |
block | 요소를 블록 레벨 요소로 표시합니다(width: 100%). |
flex | 요소를 플렉스 컨테이너로 설정합니다. |
items-center | 플렉스 컨테이너 내의 항목들을 세로 중앙에 정렬합니다. |
w-full | 요소의 너비를 100%로 설정합니다. |
border | 요소에 테두리를 추가합니다. |
border-slate-600 | 테두리 색상을 zinc-600(어두운 회색)으로 설정합니다. |
border-t | 위쪽 테두리만 추가합니다. |
pt-4 | 위쪽 패딩(padding-top)을 1rem(16px)만큼 추가합니다. |
hover:opacity-90 | 마우스 오버 시 불투명도를 90%로 설정합니다. |
disabled:opacity-50 | 비활성화된 요소의 불투명도를 50%로 설정합니다. |
disabled:cursor-not-allowed | 비활성화된 요소의 커서를 not-allowed로 설정합니다. |
overflow-x-auto | 가로 방향으로 내용이 넘칠 경우 스크롤바를 표시합니다. |
* 버튼 색상 클래스(bg-orange-600, bg-blue-600 등)는 각각 해당 색상의 배경색을 설정합니다.
* py-2는 위아래 패딩(padding-top, padding-bottom)을 0.5rem(8px)만큼 추가합니다.
* px-4는 좌우 패딩(padding-left, padding-right)을 1rem(16px)만큼 추가합니다.
스타일링
Svelte는 컴포넌트 범위의 CSS를 제공하여 스타일 충돌을 방지합니다. 또한 Tailwind CSS와 같은 유틸리티 클래스 라이브러리와 함께 사용하면 더욱 효율적인 스타일링이 가능합니다.
실시간 예제:
Tailwind CSS 스타일링 예제
Tailwind CSS 스타일링 예제
색상 선택:
선택된 색상: orange
호버 효과와 트랜지션
호버 시 확대 효과
컴포넌트 코드:
<script lang="ts"> // 스타일링 예제 let selectedColor = $state<string>("orange"); // 색상 옵션 const colorOptions = [ { name: "주황색", value: "orange", bg: "bg-orange-600", text: "text-sky-600", }, { name: "파란색", value: "blue", bg: "bg-blue-600", text: "text-blue-600", }, { name: "초록색", value: "green", bg: "bg-green-600", text: "text-green-600", }, { name: "빨간색", value: "red", bg: "bg-red-600", text: "text-red-600", }, ]; // 현재 선택된 색상 클래스 가져오기 function getColorClass(type: "bg" | "text"): string { const colorOption = colorOptions.find((c) => c.value === selectedColor); return colorOption ? type === "bg" ? colorOption.bg : colorOption.text : ""; } </script> <div class="bg-slate-700 p-4 rounded"> <h3 class="text-lg text-sky-400 mb-2">Tailwind CSS 스타일링 예제</h3> <div class="bg-slate-800 p-4 rounded"> <!-- Tailwind CSS를 사용한 스타일링 --> <div class="space-y-4"> <h2 class={getColorClass("text") + " text-xl font-bold"}> Tailwind CSS 스타일링 예제 </h2> <div class="space-y-2"> <p class="text-gray-200">색상 선택:</p> <div class="flex gap-2 flex-wrap"> {#each colorOptions as color} <button class={`${color.bg} text-white px-3 py-1 rounded ${selectedColor === color.value ? "ring-2 ring-white" : ""}`} onclick={() => (selectedColor = color.value)} > {color.name} </button> {/each} </div> </div> <div class={`p-4 rounded-lg shadow-md ${getColorClass("bg")} bg-opacity-20 border border-gray-300`} > <p class="text-white"> 선택된 색상: <span class={getColorClass("text")}>{selectedColor}</span> </p> </div> <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div class="p-4 bg-slate-800 rounded-lg hover:shadow-lg transition-all duration-300 transform hover:-translate-y-1" > <p class="text-white">호버 효과와 트랜지션</p> </div> <div class="p-4 bg-slate-800 rounded-lg hover:scale-105 transition-transform" > <p class="text-white">호버 시 확대 효과</p> </div> </div> </div> </div> </div>
Tailwind CSS 클래스 설명:
레이아웃 관련 클래스
space-y-4 | 자식 요소들 사이에 세로 간격(margin-top)을 1rem(16px)만큼 추가합니다. |
space-y-2 | 자식 요소들 사이에 세로 간격(margin-top)을 0.5rem(8px)만큼 추가합니다. |
flex | 요소를 플렉스 컨테이너로 설정합니다. |
gap-2 | 플렉스나 그리드 항목 사이의 간격을 0.5rem(8px)으로 설정합니다. |
flex-wrap | 플렉스 항목이 컨테이너를 넘어갈 경우 다음 줄로 넘어가도록 합니다. |
grid | 요소를 그리드 컨테이너로 설정합니다. |
grid-cols-1 | 그리드 열을 1개로 설정합니다. |
md:grid-cols-2 | 중간 크기(md) 화면 이상에서 그리드 열을 2개로 설정합니다. |
gap-4 | 그리드 항목 사이의 간격을 1rem(16px)으로 설정합니다. |
스타일링 관련 클래스
bg-slate-700 | 배경색을 zinc-700 색상(어두운 회색)으로 설정합니다. |
bg-slate-800 | 배경색을 zinc-800 색상(더 어두운 회색)으로 설정합니다. |
bg-opacity-20 | 배경색의 불투명도를 20%로 설정합니다. |
text-white | 텍스트 색상을 흰색으로 설정합니다. |
text-gray-200 | 텍스트 색상을 밝은 회색(gray-200)으로 설정합니다. |
text-gray-300 | 텍스트 색상을 밝은 회색(gray-300)으로 설정합니다. |
text-sky-400 | 텍스트 색상을 주황색(orange-400)으로 설정합니다. |
text-xl | 텍스트 크기를 매우 크게(extra large) 설정합니다. |
text-lg | 텍스트 크기를 크게(large) 설정합니다. |
text-sm | 텍스트 크기를 작게(small) 설정합니다. |
text-xs | 텍스트 크기를 매우 작게(extra small) 설정합니다. |
font-bold | 텍스트를 굵게(bold) 표시합니다. |
여백 및 테두리 관련 클래스
gap-2 | 플렉스나 그리드 항목 사이의 간격을 0.5rem(8px)으로 설정합니다. |
md:grid-cols-2 | 중간 크기(md) 화면 이상에서 그리드 열을 2개로 설정합니다. |
gap-4 | 그리드 항목 사이의 간격을 1rem(16px)으로 설정합니다. |
text-sm | 텍스트 크기를 작게(small) 설정합니다. |
p-4 | 모든 방향(padding)에 1rem(16px)의 여백을 추가합니다. |
p-3 | 모든 방향(padding)에 0.75rem(12px)의 여백을 추가합니다. |
px-3 | 좌우 패딩(padding-left, padding-right)을 0.75rem(12px)만큼 추가합니다. |
py-1 | 위아래 패딩(padding-top, padding-bottom)을 0.25rem(4px)만큼 추가합니다. |
mb-2 | 아래쪽 여백(margin-bottom)을 0.5rem(8px)만큼 추가합니다. |
mt-4 | 위쪽 여백(margin-top)을 1rem(16px)만큼 추가합니다. |
border | 요소에 테두리를 추가합니다. |
border-gray-300 | 테두리 색상을 gray-300(밝은 회색)으로 설정합니다. |
border-slate-600 | 테두리 색상을 zinc-600(어두운 회색)으로 설정합니다. |
border-t | 위쪽 테두리만 추가합니다. |
rounded | 요소에 기본 둥근 모서리(border-radius)를 적용합니다. |
rounded-lg | 요소에 더 큰(large) 둥근 모서리를 적용합니다. |
shadow-md | 중간 크기의 그림자 효과를 추가합니다. |
transition-transform | 변형(transform) 속성에만 트랜지션 효과를 적용합니다. |
max-h-60 | 요소의 최대 높이를 15rem(240px)으로 제한합니다. |
효과 관련 클래스
shadow-md | 중간 크기의 그림자 효과를 추가합니다. |
hover:shadow-lg | 마우스 오버 시 큰 그림자 효과를 적용합니다. |
transition-all | 모든 CSS 속성에 트랜지션 효과를 적용합니다. |
transition-shadow | 그림자 속성에만 트랜지션 효과를 적용합니다. |
transition-transform | 변형(transform) 속성에만 트랜지션 효과를 적용합니다. |
duration-300 | 트랜지션 지속 시간을 300ms로 설정합니다. |
hover:-translate-y-1 | 마우스 오버 시 요소를 위로 0.25rem(4px) 이동시킵니다. |
hover:scale-105 | 마우스 오버 시 요소 크기를 5% 확대합니다. |
ring-2 | 요소 주위에 2px 두께의 링(테두리)을 추가합니다. |
ring-white | 링(테두리) 색상을 흰색으로 설정합니다. |
* Tailwind CSS는 유틸리티 우선 CSS 프레임워크로, 미리 정의된 클래스를 조합하여 스타일을 적용합니다.
* 반응형 접두사(md:)는 특정 화면 크기 이상에서만 스타일을 적용합니다. (md = 768px 이상)
* 상태 접두사(hover:)는 특정 상태일 때만 스타일을 적용합니다.
실습 과제
- 기본 Svelte 컴포넌트를 만들고 스크립트, 마크업, 스타일 섹션을 모두 포함시켜보세요.
- $state 룬을 사용하여 반응형 변수를 선언하고 버튼 클릭으로 값을 변경해보세요.
- 조건부 렌더링(if 블록)과 반복 렌더링(each 블록)을 사용하는 컴포넌트를 만들어보세요.
- 부모-자식 컴포넌트를 만들고 props를 전달해보세요.
- 이벤트 핸들러를 사용하여 사용자 입력에 반응하는 간단한 폼을 만들어보세요.
- Tailwind CSS를 사용하여 컴포넌트에 스타일을 적용해보세요.
다음 강의 미리보기
다음 강의에서는 Svelte 5의 핵심 기능인 Runes 시스템에 대해 배웁니다. Runes는 Svelte 5에서 도입된 새로운 반응성 시스템으로, 더 명시적이고 강력한 상태 관리 방법을 제공합니다.
다음 강의에서 배울 내용:
- Runes 소개 및 개념
- $state를 사용한 상태 관리
- $derived를 사용한 파생 상태
- $effect를 사용한 부수 효과
- $state.raw와 $state.snapshot 활용
- Svelte 4와 Svelte 5의 반응성 차이점