Front-end/Vue

๐Ÿš€ Vue์˜ Lazy Loading: ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋น„๋ฒ• ๋Œ€๊ณต๊ฐœ! ๐Ÿ”„

xeunnie 2025. 2. 19. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿš€ Vue์˜ Lazy Loading: ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋น„๋ฒ• ๋Œ€๊ณต๊ฐœ! ๐Ÿ”„

 

Vue.js๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ์ค‘ **Lazy Loading(์ง€์—ฐ ๋กœ๋”ฉ)**์€ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ํŠนํžˆ Vue ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ, Lazy Loading์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋Œ€ํญ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ Vue์—์„œ Lazy Loading์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ์˜ ํŒ๊นŒ์ง€ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐ŸŒŸ

 

๐ŸŒŸ Lazy Loading์ด๋ž€?

 

Lazy Loading์€ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์ค‘์—, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

โ€ข ๊ธฐ๋ณธ ๊ฐœ๋…:

์ดˆ๊ธฐ ํ™”๋ฉด์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ ๋กœ๋“œํ•œ๋‹ค๋Š” ๋œป์ด์—์š”.

โ€ข ์žฅ์ :

โ€ข ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

โ€ข ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง‘๋‹ˆ๋‹ค.

โ€ข ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

 

๐Ÿ’ก Vue์—์„œ Lazy Loading์„ ์™œ ์จ์•ผ ํ• ๊นŒ?

 

Vue ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋œ ์ปดํฌ๋„ŒํŠธ์™€ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ ์  ์ปค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์„ ํ•œ๊บผ๋ฒˆ์— ๋กœ๋“œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”:

1. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜

ํ•œ ๋ฒˆ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ ธ์š”.

2. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋กœ๋“œ

์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์ €ํ•˜

ํ™”๋ฉด์ด ๋А๋ฆฌ๊ฒŒ ๋กœ๋“œ๋˜๋ฉด ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ Vue์—์„œ Lazy Loading ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

Vue์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ Lazy Loading์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)**์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํ•„์š”ํ•  ๋•Œ๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

 

1๏ธโƒฃ Vue Router์™€ ํ•จ๊ป˜ Lazy Loading

 

Vue Router์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ Lazy Loading์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

import { createRouter, createWebHistory } from 'vue-router';

 

const routes = [

  {

    path: '/',

    name: 'Home',

    component: () => import('./views/Home.vue') // ๋™์  import

  },

  {

    path: '/about',

    name: 'About',

    component: () => import('./views/About.vue') // Lazy Loading

  }

];

 

const router = createRouter({

  history: createWebHistory(),

  routes

});

 

export default router;

 

โ€ข () => import('./views/About.vue'):

์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Vite)๊ฐ€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

2๏ธโƒฃ Vue ์ปดํฌ๋„ŒํŠธ์—์„œ Lazy Loading

 

Vue ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ Lazy Loading์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ํฐ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํŠน์ • ํ™”๋ฉด์—์„œ๋งŒ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์ œ: ๋™์  ์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ

 

<template>

  <div>

    <h1>Welcome to Vue Lazy Loading</h1>

    <Suspense>

      <template #default>

        <LazyComponent />

      </template>

      <template #fallback>

        <div>Loading Component...</div>

      </template>

    </Suspense>

  </div>

</template>

 

<script>

const LazyComponent = defineAsyncComponent(() =>

  import('./components/LazyComponent.vue')

);

 

export default {

  components: {

    LazyComponent

  }

};

</script>

 

โ€ข defineAsyncComponent:

Vue์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

โ€ข Suspense์™€ fallback:

๋กœ๋“œ ์ค‘์—๋Š” fallback์— ์ •์˜๋œ ๋กœ๋”ฉ UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

3๏ธโƒฃ ์ด๋ฏธ์ง€ Lazy Loading

 

Vue์—์„œ๋Š” v-lazy directive๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฏธ์ง€๋„ Lazy Loadingํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

<template>

  <div>

    <img v-lazy="imageSrc" alt="Lazy Loaded Image" />

  </div>

</template>

 

<script>

import { defineComponent } from 'vue';

import VueLazyload from 'vue-lazyload';

 

export default defineComponent({

  data() {

    return {

      imageSrc: 'https://example.com/image.jpg'

    };

  }

});

</script>

 

Vue Lazyload ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

 

npm install vue-lazyload

 

์„ค์ •

 

import { createApp } from 'vue';

import App from './App.vue';

import VueLazyload from 'vue-lazyload';

 

const app = createApp(App);

app.use(VueLazyload);

app.mount('#app');

 

๐Ÿ“Š ์‹ค๋ฌด์—์„œ์˜ Lazy Loading ํŒ

1. ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ ์šฉํ•˜์„ธ์š”:

โ€ข ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ Lazy Loadingํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์–ด์š”.

โ€ข ์ดˆ๊ธฐ ํ™”๋ฉด์— ์ค‘์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” Lazy Loadingํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

2. ๋กœ๋”ฉ ์ค‘ UI๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”:

โ€ข Lazy Loading ์ค‘ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜์„ธ์š”:

โ€ข Webpack, Vite์˜ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ Lazy Loaded ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

4. ์บ์‹ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”:

โ€ข Lazy Loading๋œ ํŒŒ์ผ์€ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ™œ์šฉํ•ด ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐ŸŽฏ Lazy Loading์˜ ์žฅ์  ์š”์•ฝ

โ€ข ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  โฉ

โ€ข ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๐Ÿ“‰

โ€ข ๋„คํŠธ์›Œํฌ ํšจ์œจ์„ฑ ํ–ฅ์ƒ ๐ŸŒ

โ€ข ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ๊ฐœ์„  ๐ŸŒŸ

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น!๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•

'Front-end > Vue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vue.js์—์„œ watch ํ†บ์•„๋ณด๊ธฐ!  (0) 2024.08.12