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:)는 특정 상태일 때만 스타일을 적용합니다.

실습 과제

  1. 기본 Svelte 컴포넌트를 만들고 스크립트, 마크업, 스타일 섹션을 모두 포함시켜보세요.
  2. $state 룬을 사용하여 반응형 변수를 선언하고 버튼 클릭으로 값을 변경해보세요.
  3. 조건부 렌더링(if 블록)과 반복 렌더링(each 블록)을 사용하는 컴포넌트를 만들어보세요.
  4. 부모-자식 컴포넌트를 만들고 props를 전달해보세요.
  5. 이벤트 핸들러를 사용하여 사용자 입력에 반응하는 간단한 폼을 만들어보세요.
  6. Tailwind CSS를 사용하여 컴포넌트에 스타일을 적용해보세요.

다음 강의 미리보기

다음 강의에서는 Svelte 5의 핵심 기능인 Runes 시스템에 대해 배웁니다. Runes는 Svelte 5에서 도입된 새로운 반응성 시스템으로, 더 명시적이고 강력한 상태 관리 방법을 제공합니다.

다음 강의에서 배울 내용:

  • Runes 소개 및 개념
  • $state를 사용한 상태 관리
  • $derived를 사용한 파생 상태
  • $effect를 사용한 부수 효과
  • $state.raw와 $state.snapshot 활용
  • Svelte 4와 Svelte 5의 반응성 차이점

© 2024 Coding Stairs. All rights reserved.