Vue3, Firebase 프로젝트 - 채팅앱 VSignal

26. [개발] Vuetify로 실시간 채팅앱 VSignal UI 만들기 - Vue3 Firebase 프로젝트

그랜파 개발자 2025. 4. 9. 03:39

Vuetify로 UI 만들기

Vuetify를 사용하여 App Bar(헤더), Drawer(사이드 메뉴), Footer(푸터) 가 포함된 UI를 만들어 봅시다.
더하여 Material Design Icon도 사용합니다.

1. 기본 레이아웃 만들기 (AppLayout.vue)

📌 구성 요소

1. App Bar (헤더)

앱 제목과 네비게이션 메뉴 버튼
우측에는 로그아웃 버튼

2. Drawer (사이드 메뉴)

  • 홈 : 이미 만들어진 1:1 채팅방 리스트
    채팅방을 선택하면 채팅방으로 들어갑니다.
  • 채팅방 만들기 : 새로운 채팅방을 만듭니다.
  • 계정만들기 : 사용자의 계정을 생성합니다.
  • 계정 설정 : 계정 정보 외에 사용자 정보를 설정합니다.
  • 로그인

3. Main Content (메인 컨텐츠 영역)

현재 선택된 화면이 표시됨

간단한 앱 정보 또는 저작권 표시

AppLayout.vue

<!-- src/layouts/AppLayout.vue -->
<script setup>
import { ref } from "vue";

// 사이드 메뉴 열림/닫힘 상태
const drawer = ref(false);

// 동적으로 메뉴 아이템을 반환하는 함수
const GetMenuItems = () => [
  { title: "홈", icon: "mdi-home", route: "/" },
  { title: "채팅방 만들기", icon: "mdi-chat", route: "/chatroom" },
  { title: "계정 만들기", icon: "mdi-account-plus", route: "/account" },
  { title: "계정 설정",  icon: "mdi-cog", route: "/settings" },
  { title: "로그인", icon: "mdi-login", route: "/login" },
];
</script>

<template>
  <v-app>
    <!-- ✅ 헤더 (App Bar) -->
    <v-app-bar color="primary" density="comfortable">
      <v-app-bar-nav-icon @click="drawer = !drawer"></v-app-bar-nav-icon>
      <v-toolbar-title>VSignal - 실시간 채팅</v-toolbar-title>
      <v-spacer></v-spacer>
      <v-btn icon>
        <v-icon>mdi-logout</v-icon>
      </v-btn>
    </v-app-bar>

    <!-- ✅ 사이드 메뉴 (Drawer) -->
    <v-navigation-drawer v-model="drawer" app>
      <v-list>
        <v-list-item
          v-for="item in GetMenuItems()"
          :key="item.title"
          :to="item.route"
          link
        >
          <template v-slot:prepend>
            <v-icon>{{ item.icon }}</v-icon>
          </template>
          <v-list-item-title>{{ item.title }}</v-list-item-title>
        </v-list-item>
      </v-list>
    </v-navigation-drawer>

    <!-- 메인 컨텐츠 -->
    <v-main>
      <v-sheet class="fill-height full-width d-flex align-center justify-center">
        <router-view />
      </v-sheet>
    </v-main>

    <!-- ✅ 푸터 -->
    <v-footer app>
      <v-container class="text-center">
        © 2025 My Chat App - All rights reserved.
      </v-container>
    </v-footer>
  </v-app>
</template>

<style>
/* 전체 화면을 채우기 위한 스타일 */
html, body, #app {
  height: 100%;
  width: 100%;
  min-height: 100%;
  margin: 0;
  padding: 0;
}
</style>
 

✅ 설명
✔ v-app-bar: 헤더 (앱 이름 + 네비게이션 버튼 + 로그아웃)
✔ v-navigation-drawer: 사이드 메뉴 (홈, 채팅방 만들기, 계정만들기, 계정 설정, 로그인)
✔ <router-view />를 추가하여 각 페이지의 콘텐츠가 표시되도록 함
✔ v-footer: 푸터 (앱 정보 표시)

2. App.vue를 전체 앱에 적용

이제 App.vue에서 기본 레이아웃을 적용하자.

<!-- App.vue -->
<script setup>
// 레이아웃 컴포넌트 가져오기
import AppLayout from "@/layouts/AppLayout.vue"; 
</script>

<template>
  <v-app>
    <AppLayout>
      <router-view />
    </AppLayout>
  </v-app>
</template>

3. 라우터 설정 (router/index.js)

라우터를 설정해서 페이지를 이동할 수 있도록 연결하자.

1. 라우터 설정

// src/router/index.js
import { createRouter, createWebHistory } from "vue-router";
import HomeView from "@/views/HomeView.vue";
import ChatRoomView from "@/views/ChatRoomView.vue";
import AccountView from "@/views/AccountView.vue";
import SettingsView from "@/views/SettingsView.vue";
import LoginView from "@/views/LoginView.vue";

const routes = [
  { path: "/", component: HomeView },
  { path: "/chatroom", component: ChatRoomView },
  { path: "/account", component: AccountView },
  { path: "/settings", component: SettingsView },
  { path: "/login", component: LoginView },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

2. main.js에서 router를 등록

라우터를 main.js에서 use하지 않으면 router-view가 동작하지 않습니다.

// src/main.js
import { createApp } from 'vue';
//import './style.css'
import App from './App.vue';
import router from "./router"; // ✅ 라우터 임포트
import 'vuetify/styles';
import { createVuetify } from 'vuetify';
import { aliases, mdi } from 'vuetify/iconsets/mdi';
import '@mdi/font/css/materialdesignicons.css';

const vuetify = createVuetify({
  icons: {
    defaultSet: 'mdi',
    aliases,
    sets: { mdi },
  },
});

const app = createApp(App);
app.use(router); // ✅ 라우터 등록
app.use(vuetify);
app.mount('#app');

4. 실행하기

앱을 실행해봅시다.

npm run dev