λΌμ°νΈ κΈ°λ° λ° μ»΄ν¬λνΈ κΈ°λ° μ κ·Ό λ°©μμ ν¬ν¨ν κ³ κΈ μλ°μ€ν¬λ¦½νΈ μ½λ λΆν κΈ°μ μ μ΅ν μ±λ₯κ³Ό μ¬μ©μ κ²½νμ κ°μ νμΈμ.
μλ°μ€ν¬λ¦½νΈ μ½λ λΆν μ¬ν: λΌμ°νΈ κΈ°λ° λ μ»΄ν¬λνΈ κΈ°λ°
νλ μΉ κ°λ°μ μΈκ³μμ λΉ λ₯΄κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νλ κ²μ λ§€μ° μ€μν©λλ€. μ΄λ₯Ό λ¬μ±νκΈ° μν κ°λ ₯ν κΈ°μ μ€ νλκ° μ½λ λΆν (code splitting)μ λλ€. μ½λ λΆν μ μ¬μ©νλ©΄ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ λ μμ μ²ν¬λ‘ λλμ΄ νμ¬ νμ΄μ§λ μ»΄ν¬λνΈμ νμν μ½λλ§ λ‘λν μ μμ΅λλ€. μ΄λ μ΄κΈ° λ‘λ μκ°μ μ€μ΄κ³ μ±λ₯μ κ°μ νλ©° μ λ°μ μΈ μ¬μ©μ κ²½νμ ν₯μμν΅λλ€.
μ΄ κΈμμλ κ³ κΈ μ½λ λΆν μ λ΅, νΉν λΌμ°νΈ κΈ°λ° λ° μ»΄ν¬λνΈ κΈ°λ° μ κ·Ό λ°©μμ λν΄ μμΈν μμλ΄ λλ€. μ°λ¦¬λ μ΄λ€μ μ₯λ¨μ κ³Ό 리μ‘νΈ(React), μ΅κ·€λ¬(Angular), λ·°(Vue.js)μ κ°μ μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ νλ μμν¬μμ ν¨κ³Όμ μΌλ‘ ꡬννλ λ°©λ²μ μ΄ν΄λ³Ό κ²μ λλ€. λν, μ μΈκ³ μ¬μ©μλ₯Ό μν κ³ λ € μ¬νμ νꡬνμ¬ μμΉμ κ΄κ³μμ΄ μ κ·Όμ±κ³Ό μ΅μ μ μ±λ₯μ 보μ₯ν κ²μ λλ€.
μ½λ λΆν μ΄ μ€μν μ΄μ
μΈλΆ μ¬νμΌλ‘ λ€μ΄κ°κΈ° μ μ, μ½λ λΆν μ΄ μ κ·Έλ κ² μ€μνμ§ λ€μ νλ² κ°μ‘°ν΄ λ³΄κ² μ΅λλ€:
- μ΄κΈ° λ‘λ μκ° λ¨μΆ: μ²μμ νμν μ½λλ§ λ‘λν¨μΌλ‘μ¨ μ¬μ©μλ μ ν리μΌμ΄μ κ³Ό λ 빨리 μνΈμμ©ν μ μμ΅λλ€. μλ§μ‘΄(Amazon)μ΄λ μ리λ°λ°(Alibaba)μ κ°μ λκ·λͺ¨ μ μ μκ±°λ μ¬μ΄νΈλ₯Ό μμν΄ λ³΄μΈμ. λͺ¨λ μ ν νμ΄μ§μ κΈ°λ₯μ λν λͺ¨λ μλ°μ€ν¬λ¦½νΈλ₯Ό ν λ²μ λ‘λνλ κ²μ μμ²λκ² λ릴 κ²μ λλ€. μ½λ λΆν μ μ¬μ©μκ° μ μνκ² μ ν κ²μμ μμν μ μλλ‘ λ³΄μ₯ν©λλ€.
- μ±λ₯ κ°μ : λ²λ€μ΄ μμμ§λ©΄ νμ±νκ³ μ€νν μ½λκ° μ€μ΄λ€μ΄ λ°νμ μ±λ₯κ³Ό λ°μμ±μ΄ ν₯μλ©λλ€. μ΄λ νΉν μ μ¬μ κΈ°κΈ°λ λμνμ΄ μ νλ λ€νΈμν¬μμ λλλ¬μ§λλ€.
- ν₯μλ μ¬μ©μ κ²½ν: λ λΉ λ₯΄κ³ λ°μμ±μ΄ μ’μ μ ν리μΌμ΄μ μ λ λμ μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ Έ μ°Έμ¬λμ λ§μ‘±λλ₯Ό λμ λλ€. μ΄λ μ¬μ©μμ μμΉμ μκ΄μμ΄ λ³΄νΈμ μ λλ€.
- ν¨μ¨μ μΈ λ¦¬μμ€ νμ©: μ½λ λΆν μ ν΅ν΄ λΈλΌμ°μ λ κ°λ³ μ²ν¬λ₯Ό μΊμν μ μμΌλ―λ‘, μ΄ν λ°©λ¬Έμ΄λ μ ν리μΌμ΄μ λ΄ νμ μ μΊμλ μ½λλ₯Ό νμ©νμ¬ μ±λ₯μ λμ± ν₯μμν¬ μ μμ΅λλ€. κΈλ‘λ² λ΄μ€ μΉμ¬μ΄νΈλ₯Ό μκ°ν΄ 보μΈμ. μ€ν¬μΈ λ λΉμ¦λμ€μ κ°μ νΉμ μΉμ μ μ½λλ μ¬μ©μκ° ν΄λΉ μΉμ μΌλ‘ μ΄λν λλ§ λ‘λλ μ μμ΅λλ€.
λΌμ°νΈ κΈ°λ° μ½λ λΆν
λΌμ°νΈ κΈ°λ° μ½λ λΆν μ μ ν리μΌμ΄μ μ μ½λλ₯Ό λ€λ₯Έ λΌμ°νΈλ νμ΄μ§λ₯Ό κΈ°μ€μΌλ‘ λΆν νλ κ²μ ν¬ν¨ν©λλ€. μ΄λ μΌλ°μ μ΄κ³ λΉκ΅μ κ°λ¨ν μ κ·Ό λ°©μμ λλ€. μ¬μ©μκ° νΉμ λΌμ°νΈλ‘ μ΄λν λ ν΄λΉ λΌμ°νΈμ νμν μλ°μ€ν¬λ¦½νΈλ§ λ‘λλ©λλ€.
ꡬν
λΌμ°νΈ κΈ°λ° μ½λ λΆν μ ꡬ체μ μΈ κ΅¬ν λ°©λ²μ μ¬μ© μ€μΈ νλ μμν¬μ λ°λΌ λ€λ¦ λλ€.
리μ‘νΈ (React)
리μ‘νΈμμλ λΌμ°νΈλ₯Ό μ§μ° λ‘λ©νκΈ° μν΄ λ¦¬μ‘νΈ μ체μμ μ 곡νλ React.lazy
μ Suspense
μ»΄ν¬λνΈλ₯Ό μ¬μ©ν μ μμ΅λλ€.
import React, { Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = React.lazy(() => import('./Home'));
const About = React.lazy(() => import('./About'));
const Products = React.lazy(() => import('./Products'));
function App() {
return (
Loading...
μ΄ μμ μμ Home
, About
, Products
μ»΄ν¬λνΈλ μ§μ° λ‘λ©λ©λλ€. Suspense
μ»΄ν¬λνΈλ μ»΄ν¬λνΈκ° λ‘λλλ λμ λ체 UI(μ΄ κ²½μ°, "Loading...")λ₯Ό μ 곡ν©λλ€.
μμ μλ리μ€: κΈλ‘λ² μμ λ―Έλμ΄ νλ«νΌμ μμν΄ λ³΄μΈμ. μ¬μ©μκ° μ²μ λ‘κ·ΈμΈνλ©΄ λ΄μ€ νΌλ(Home)λ‘ μ΄λν©λλ€. μ¬μ©μ νλ‘ν(About)μ΄λ λ§μΌνλ μ΄μ€(Products)μ κ°μ κΈ°λ₯μ μ½λλ μ¬μ©μκ° ν΄λΉ μΉμ μΌλ‘ μ΄λν λλ§ λ‘λλμ΄ μ΄κΈ° λ‘λ μκ°μ κ°μ ν©λλ€.
μ΅κ·€λ¬ (Angular)
μ΅κ·€λ¬λ λΌμ°ν° ꡬμ±μ ν΅ν΄ λͺ¨λμ μ§μ° λ‘λ©μ μ§μν©λλ€. loadChildren
μμ±μ μ¬μ©νμ¬ νμμ λ°λΌ λ‘λλμ΄μΌ ν λͺ¨λμ μ§μ ν μ μμ΅λλ€.
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },
{ path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },
{ path: 'products', loadChildren: () => import('./products/products.module').then(m => m.ProductsModule) },
{ path: '', redirectTo: '/home', pathMatch: 'full' },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
μ΄ μμ μμ HomeModule
, AboutModule
, ProductsModule
μ μ¬μ©μκ° κ°κ°μ λΌμ°νΈλ‘ μ΄λν λ μ§μ° λ‘λ©λ©λλ€.
μμ μλ리μ€: λ€κ΅μ κΈ°μ μ λ΄λΆ μΉ ν¬νΈμ μκ°ν΄ 보μΈμ. λ€λ₯Έ λΆμ(μ: HR, μ¬λ¬΄, λ§μΌν )λ μ체 λͺ¨λμ κ°μ§κ³ μμ΅λλ€. μ½λ λΆν μ μ§μλ€μ΄ μνΈμμ©νλ λΆμμ μ½λλ§ λ€μ΄λ‘λνλλ‘ νμ¬ λ‘λ© κ³Όμ μ κ°μνν©λλ€.
λ·° (Vue.js)
λ·°λ λΌμ°ν° ꡬμ±μμ λμ μν¬νΈ(dynamic import)λ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈμ μ§μ° λ‘λ©μ μ§μν©λλ€.
// router.js
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')
},
{
path: '/about',
name: 'About',
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
},
{
path: '/products',
name: 'Products',
component: () => import(/* webpackChunkName: "products" */ '../views/Products.vue')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
μ¬κΈ°μ Home.vue
, About.vue
, Products.vue
μ»΄ν¬λνΈλ κ°κ°μ λΌμ°νΈκ° λ°©λ¬Έλ λ μ§μ° λ‘λ©λ©λλ€. webpackChunkName
μ£Όμμ μΉν©μ΄ κ° μ»΄ν¬λνΈμ λν΄ λ³λμ μ²ν¬λ₯Ό μμ±νλλ‘ λμ΅λλ€.
μμ μλ리μ€: κΈλ‘λ² μ¨λΌμΈ κ΅μ‘ νλ«νΌμ μμν΄ λ³΄μΈμ. κ°μ’ λͺ¨λ(μ: μν, μμ¬, κ³Όν)μ νμλ€μ΄ λ±λ‘ν λ νμμ λ°λΌ λ‘λλ μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ μ΄κΈ° λ€μ΄λ‘λ ν¬κΈ°λ₯Ό μ΅μννκ³ μ¬μ©μ κ²½νμ μ΅μ νν©λλ€.
λΌμ°νΈ κΈ°λ° μ½λ λΆν μ μ₯μ
- κ°λ¨ν ꡬν: μ€μ νκ³ μ΄ν΄νκΈ° λΉκ΅μ μ½μ΅λλ€.
- λͺ νν κ΄μ¬μ¬ λΆλ¦¬: λ§μ μΉ μ ν리μΌμ΄μ μ ꡬ쑰μ μ λ§μ΅λλ€.
- μ΄κΈ° λ‘λ μκ° κ°μ : μ²μμ λ‘λλλ μ½λμ μμ ν¬κ² μ€μ λλ€.
λΌμ°νΈ κΈ°λ° μ½λ λΆν μ λ¨μ
- μ€λ³΅ κ°λ₯μ±: 곡μ μ»΄ν¬λνΈλ μμ‘΄μ±μ΄ μ¬λ¬ λΌμ°νΈ μ²ν¬μ ν¬ν¨λμ΄ μ½λ μ€λ³΅μ μ λ°ν μ μμ΅λλ€.
- μΈλΆνμ νκ³: μ¬λ¬ λΌμ°νΈμμ 곡μ λλ 볡μ‘ν μ»΄ν¬λνΈκ° μλ μ ν리μΌμ΄μ μλ μ΄μμ μ΄μ§ μμ μ μμ΅λλ€.
μ»΄ν¬λνΈ κΈ°λ° μ½λ λΆν
μ»΄ν¬λνΈ κΈ°λ° μ½λ λΆν μ μ ν리μΌμ΄μ μ μ½λλ₯Ό μ 체 λΌμ°νΈκ° μλ κ°λ³ μ»΄ν¬λνΈλ₯Ό κΈ°μ€μΌλ‘ λΆν νλ κ²μ λλ€. μ΄λ₯Ό ν΅ν΄ μ½λ λ‘λ©μ λν΄ λ μΈλΆνλ μ κ·Όμ΄ κ°λ₯νλ©°, νΉμ μ»΄ν¬λνΈκ° νμν λ ν΄λΉ μ»΄ν¬λνΈμ νμν μ½λλ§ λ‘λν μ μμ΅λλ€.
ꡬν
μ»΄ν¬λνΈ κΈ°λ° μ½λ λΆν μ λΌμ°νΈ κΈ°λ° λΆν λ³΄λ€ λ 볡μ‘νμ§λ§, λ ν° μ μ°μ±κ³Ό μ΅μ ν μ μ¬λ ₯μ μ 곡ν©λλ€. λ€μ λ§νμ§λ§, ꡬν λ°©λ²μ νλ μμν¬μ λ°λΌ λ€λ¦ λλ€.
리μ‘νΈ (React)
리μ‘νΈμμλ React.lazy
μ Suspense
λ₯Ό μ¬μ©νμ¬ λΌμ°νΈλ λ€λ₯Έ μ»΄ν¬λνΈ λ΄μ κ°λ³ μ»΄ν¬λνΈλ₯Ό μ§μ° λ‘λ©ν μ μμ΅λλ€.
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function MyPage() {
return (
Welcome to My Page
Loading Component... }>