프론트엔드 개발에서 사용자가 선택할 수 있는 테마 변경 기능은 UI/UX를 크게 향상시킬 수 있는 중요한 요소입니다. 이번 블로그 포스트에서는 Vue.js와 Tailwind CSS를 활용하여 사용자가 직접 테마를 변경할 수 있는 기능을 구현해보겠습니다.

프로젝트 시작하기

먼저 Vue.js와 Tailwind CSS를 사용할 수 있는 새로운 프로젝트를 생성해야 합니다. Vue CLI를 사용하여 새로운 Vue 프로젝트를 생성하는 방법은 다음과 같습니다.

vue create theme-switcher
cd theme-switcher

프로젝트가 생성되면 Tailwind CSS를 설치합니다. Tailwind CSS의 설치 방법은 다음과 같습니다.

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
tailwind.config.js 파일을 열어 Tailwind의 기본 설정을 수정합니다.
module.exports = {
  content: ['./src/*/.{vue,js,ts,jsx,tsx}'],
  theme: {
    extend: {},
  },
  plugins: [],
}

Tailwind CSS 스타일 적용하기

src/assets/tailwind.css 파일을 생성하고 아래의 Tailwind CSS 기본 스타일을 추가합니다.
@tailwind base;
@tailwind components;
@tailwind utilities;

이제 main.js 파일에서 Tailwind CSS를 import해 주어야 합니다.

import { createApp } from 'vue'
import App from './App.vue'
import './assets/tailwind.css'

createApp(App).mount('#app')

테마 변경 기능 구현하기

이제 본격적으로 테마 변경 기능을 구현해보겠습니다. 먼저 App.vue 파일을 열어 기본적인 레이아웃을 설정합니다.

<template>
  <div :class="theme">
    <header class="p-4">
      <h1 class="text-3xl font-bold">테마 선택기</h1>
      <select @change="changeTheme" class="mt-2">
        <option value="light">Light Theme</option>
        <option value="dark">Dark Theme</option>
      </select>
    </header>
    <main class="p-4">
      <p>테마를 선택하세요!</p>
    </main>
  </div>
</template>

<script>
export default {
  data() {
    return {
      theme: 'light', // 기본 테마
    }
  },
  methods: {
    changeTheme(event) {
      this.theme = event.target.value;
    },
  },
}
</script>

<style scoped>
.light {
  background-color: #ffffff;
  color: #000000;
}

.dark {
  background-color: #000000;
  color: #ffffff;
}
</style>

위의 코드에서 <select> 요소를 사용하여 사용자가 테마를 선택할 수 있도록 하였습니다. changeTheme 메소드를 통해 선택된 테마를 theme 데이터 속성에 저장하고, 이 값에 따라 클래스가 변경됩니다.

테마 저장하기

사용자가 선택한 테마를 로컬 스토리지에 저장하여 페이지를 새로 고침하더라도 선택한 테마가 유지되도록 할 수 있습니다. created 라이프사이클 훅을 사용하여 초기 테마를 설정하고, changeTheme 메소드 안에서 로컬 스토리지에 테마를 저장합니다.

created() {
  const savedTheme = localStorage.getItem('theme');
  if (savedTheme) {
    this.theme = savedTheme;
  }
},
methods: {
  changeTheme(event) {
    this.theme = event.target.value;
    localStorage.setItem('theme', this.theme);
  },
},

추가적인 스타일링

Tailwind CSS의 유틸리티 클래스를 활용하여 각 테마에 맞는 스타일을 추가해보겠습니다. 다음은 테마에 따라 색상이 변경되는 예시입니다.

.light {
  @apply bg-gray-100 text-gray-800;
}

.dark {
  @apply bg-gray-800 text-gray-100;
}

이렇게 하면 Tailwind CSS의 유틸리티 클래스를 사용하여 각 테마에 대한 스타일을 손쉽게 관리할 수 있습니다.

마무리

이번 포스트에서는 Vue.js와 Tailwind CSS를 활용하여 사용자가 선택할 수 있는 테마 변경 기능을 구현했습니다. 로컬 스토리지를 통해 선택된 테마를 저장하고, 페이지 새로 고침 시에도 유지될 수 있도록 하였습니다. 이와 같은 기능은 사용자 경험을 개선하고, 웹 어플리케이션의 접근성을 높이는 데 큰 도움이 됩니다. 여러분도 이 방법을 바탕으로 나만의 테마 변경 기능을 구현해보세요!