요즘 Hyper-v 로 레디스, 센티널 구성 테스트를 하고 있어서 

VM 가져오기를 많이 하다보니 파워셀 스크립트를 만들어봤다. 

#  VM 명 
$NewVMName = "redis01"
# 원본 VM 경로 및 설정
$OriginalVmcxPath = "E:\Hyper-V Backup\Ubuntu22.04\Virtual Machines\4E839D3E-9F4F-4006-963B-329D8EE20E41.vmcx"

# 새 VM 구성
$NewVMConfigFolder = "E:\Hyper-V\"
$NewVMPath = "E:\Hyper-V\$NewVMName"
$NewVMVHDPath = "E:\Hyper-V\$NewVMName\Virtual Hard Disks\"

# 가상 머신 구성 폴더 생성
New-Item -ItemType Directory -Force -Path $NewVMPath

Import-VM -Path "$OriginalVmcxPath" `
		  -Copy -GenerateNewId `
		  -VirtualMachinePath "$NewVMPath" `
		  -SmartPagingFilePath "$NewVMPath" `
		  -SnapshotFilePath "$NewVMPath" `
		  -VhdDestinationPath "$NewVMVHDPath"

Rename-VM "Ubuntu22.04" -NewName "$NewVMName"

# 검사점 생성
Checkpoint-VM -Name "$NewVMName" -SnapshotName "Checkpoint-$(Get-Date -Format 'yyyyMMdd-HHmmss')"

 

'Dev' 카테고리의 다른 글

Hyper-v 백업 복사해서 복원하기  (0) 2024.01.15
WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26

Hyper-V 이런 저런 테스트를 하다보면 백업본을 복원하는 경우가 많은데 Powershell 을 이용하면 쉽고 빠르게 VM 복원이 가능하다.

 

Hyper-V 백업

 

 

Powershell 로 E:\Hyper-V\RedisCluster01 ~ E:\Hyper-V\RedisCluster06 으로 복원한다. 

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster01' -VirtualMachinePath 'E:\Hyper-V\RedisCluster01'
Rename-VM "Ubuntu22" -NewName "RedisCluster01"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster02' -VirtualMachinePath 'E:\Hyper-V\RedisCluster02'
Rename-VM "Ubuntu22" -NewName "RedisCluster02"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster03' -VirtualMachinePath 'E:\Hyper-V\RedisCluster03'
Rename-VM "Ubuntu22" -NewName "RedisCluster03"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster04' -VirtualMachinePath 'E:\Hyper-V\RedisCluster04'
Rename-VM "Ubuntu22" -NewName "RedisCluster04"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster05' -VirtualMachinePath 'E:\Hyper-V\RedisCluster05'
Rename-VM "Ubuntu22" -NewName "RedisCluster05"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster06' -VirtualMachinePath 'E:\Hyper-V\RedisCluster06'
Rename-VM "Ubuntu22" -NewName "RedisCluster06"

 

 

 

 

'Dev' 카테고리의 다른 글

Hyper-v VM 가져오기 (복사)  (0) 2024.11.21
WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26

postman 설치

kalva@RT-PC:~$ sudo snap install postman  
\[sudo\] password for kalva:  
postman (v10/stable) 10.15.0 from Postman, Inc. (postman-inc✓) installed

postman 실행

  • The disableGPU setting is set to undefined, Not disabling GPU 에러가 눈에 보인다.
kalva@RT-PC:~$ sudo snap run postman  
The disableGPU setting is set to undefined  
Not disabling GPU  
\[6368:0701/221200.692099:ERROR:ozone\_platform\_x11.cc(248)\] Missing X server or $DISPLAY  
\[6368:0701/221200.692165:ERROR:env.cc(225)\] The platform failed to initialize.  Exiting.  
\[0701/221200.693262:ERROR:scoped\_ptrace\_attach.cc(27)\] ptrace: Operation not permitted (1)  
Segmentation fault

7버전으로 시작하게 설정

sudo snap refresh --channel=v7/stable postman

postman 실행

kalva@RT-PC:~$ sudo snap run postman

'Dev' 카테고리의 다른 글

Hyper-v VM 가져오기 (복사)  (0) 2024.11.21
Hyper-v 백업 복사해서 복원하기  (0) 2024.01.15
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26

Form 입력 데이터 바인딩

  • Form Element
    • 웹 페이지에서 사용자로부터 데이터를 입력받을 수 있는 필드
  • v-model 디렉티브로 양방향 데이터 바인딩 생성 가능
    • v-model 은 내부적으로 서로 다운 속성을 사용하고 서로 다른 입력 요소에 대해 서로 다른 이벤트를 전송함

input type=text

  • 입력받은 텍스트는 value에 저장됨
  • input type=text 에서 v-model은 내부적으로 value 속성을 사용함
  • data() 에 정의된 데이터 키명을 v-model에 넣어주면 모델와 뷰인 input type=text의 value 속성이 서로 양방향으로 데이터 바인딩 설정됨
  • 사용자가 input type=text 객체의 텍스트 입력/변경시 valueModel에 저장된다.

vue-project/src/views/DataBindingInputText.vue

<template>
  <div>
    <input type="text" v-model="valueModel" />
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            valueModel: 'ha ha ha'
        };
    },
}
</script>

inupt type=number

  • 숫자값만 입력받을때 사용

vue-project/src/views/DataBindingInputNumber.vue

<template>
    <div>
      <input type="number" v-model="valueModel" />
    </div>
  </template>
  <script>
  export default{ 
      data(){
          return{
              valueModel: 1000
          };
      },
  }
  </script>

textarea

  • 형태로 사용

vue-project/src/views/DataBindingTextarea.vue

<template>
    <div>
        <textarea v-model="message"></textarea>
    </div>
</template>
<script>
export default{ 
    data(){
        return{
            message: '이것은 메시지'
        };
    },
}
</script>

select

vue-project/src/views/DataBindingSelect.vue

<template>
    <div>
        <select v-model="city">
            <option value="02">서울</option>
            <option value="053">대구</option>
            <option value="051">부산</option>
        </select>
    </div>
</template>
<script>
export default{ 
    data(){
        return{
            city: '02'
        };
    },
}
</script>

input type=checkbox

  • checkbox 는 v-model 이 value 속성이 아닌 checked 속성을 사용해야되서 value 속성에 데이터바인딩을 하려면 v-model이 아닌 v-bind:value 를 사용함

vue-project/src/views/DataBindingCheckbox.vue

<template>
    <div>
      <lable><input type="checkbox" v-model="checked1">{{ checked1 }}</lable>
      <!-- 체크 해제 되었을때 기본값 변경  -->
      <lable><input type="checkbox" v-model="checked2" true-value="yes" false-value="no">{{ checked2 }}</lable>
    </div>
  </template>
  <script>
  export default{ 
      data(){
          return{
            checked1: true,
            checked2: true
          };
      },
  }
  </script>

vue-project/src/views/DataBindingCheckbox2.vue

<!-- 여러개의 체크박스를 사용할때 -->
<template>
    <div>
      <lable><input type="checkbox" value="서울" v-model="checked"> 서울 </lable>
      <lable><input type="checkbox" value="대구" v-model="checked"> 대구 </lable>
      <lable><input type="checkbox" value="부산" v-model="checked"> 부산 </lable>
    </div>
    <br>
    <span>체크한 지역: {{ checked }}</span>
  </template>
  <script>
  export default{ 
      data(){
          return{
            checked: []
          };
      },
  }
  </script>

input type=radio

  • radio 는 v-model 이 value 속성이 아닌 checked 속성을 사용해야되서 value 속성에 데이터바인딩을 하려면 v-model이 아닌 v-bind:value 를 사용함

vue-project/src/views/DataBindingRadio.vue

<template>
    <div>
      <lable><input type="radio" v-bind:value="radioValue1" v-model="picked"> 서울 </lable>
      <lable><input type="radio" v-bind:value="radioValue2" v-model="picked"> 대구 </lable>
      <lable><input type="radio" v-bind:value="radioValue3" v-model="picked"> 부산 </lable>
    </div>
    <br>
    <span>선택한 지역: {{ picked }}</span>
  </template>
  <script>
  export default{ 
      data(){
          return{
            picked: '',
            radioValue1: '서울',
            radioValue2: '부산',
            radioValue3: '제주',
          };
      },
  }
  </script>

속성 (Attribute)

  • v-bind: 디렉티브
    • value 을 제외한 HTML 객채의 속성에 데이터를 바인딩하기 위해 사용
    • v-bind: 디렉티브는 v-bind을 생략하고 : 으로 사용 가능

img 객체의 src

vue-project/src/views/DataBindingAttribue.vue

<template>
    <div>
      <img v-bind:src="imgSrc" />
    </div>
  </template>
  <script>
  export default{ 
      data(){
          return{
            imgSrc: "https://kr.vuejs.org/images/logo.png"
          };
      },
  }
  </script>

button 객체의 disabled

vue-project/src/views/DataBindingButton.vue

<template>
    <div>
      <input type="text" v-model="textValue" />
      <button type="button" v-bind:disabled="textValue==''">Click</button>
    </div>
  </template>
  <script>
  export default{ 
      data(){
          return{
            textValue: '',
          };
      },
  }
  </script>

클래스 바인딩

  • 클래스 바인딩시 특이점
    • class 속성에 클래스명을 입력, 조건에 따라 바인딩할 클래스의 경우 v-bind:css를 이용해서 추가적으로 정의해서 사용할 수 있다.
    • 다른 속성의 경우 하나의 속성만을 이용해서 바인딩 해야하지만 클래스의 경우 기본 클래스와 데이터 바인딩 처리를 하는 클래스를 공전해서 사용할 수 있다.

vue-project/src/views/DataBindingClass.vue

<template>
  <div class="container" v-bind:class="{'active': isAcitve, 'text-red': hasError}">
    Class Binding
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            isAcitve: true,
            hasError: false
        };
    }
}
</script>
<style scoped>
    container {
        width: 100%;
        height: 200px;
    }
    .active {
        background-color: yellow;
        font-weight: blod;
    }
    .text-red {
        color:red;
    }
</style>

vue-project/src/views/DataBindingClass2.vue

<!-- 배열을 사용해서 클래스 바인딩 가능 -->
<template>
    <div class="container" v-bind:class="[activeClass, errorClass]">
      Class Binding
    </div>
  </template>
  <script>
  export default{ 
      data(){
          return{
            activeClass: 'active',
            errorClass: 'text-red'
          };
      }
  }
  </script>
  <style scoped>
      container {
          width: 100%;
          height: 200px;
      }
      .active {
          background-color: yellow;
          font-weight: blod;
      }
      .text-red {
          color:red;
      }
  </style>

인라인 스타일 바인딩

  • 인라인 스타일의 경우 데이터를 오브젝트로 선언해서 바인딩
<template>
    <div v-bind:style="styleObjects">
        인라인 스타일 바인딩
    </div>
</template>
<script>
    export default{ 
        data(){
            return{
                styleObjects: {
                    color: 'red',
                    fontSize: '13px'
                }
            };
        }
    }
</script>

리스트 랜더링 (v-for)

  • v-for="(item, index) in items" 형식으로 사용
    • items는 데이터 배열
    • v-for 를 통해 배열을 하나씩 읽어와서 각 아이템을 item으로, 배열의 현재 index를 index로 반환

vue-project/src/views/DataBindingList.vue

<template>
  <div>
    <table>
      <header>
        <tr>
          <th>제품명</th>
          <th>가격</th>
          <th>카테고리</th>
          <th>배송료</th>
        </tr>
      </header>
      <tbody>
        <tr :key="i" v-for="(prodcut, i) in productList">
          <td>{{ prodcut.product_name }}</td>
          <td>{{ prodcut.price }}</td>
          <td>{{ prodcut.category }}</td>
          <td>{{ prodcut.delivery_price }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>
<script>
export default{ 
    data(){
        return{
          productList: [
            { "product_name":"AAAA", "price":1000, "category":"A", "delivery_price": 100 }, 
            { "product_name":"BBBB", "price":2000, "category":"B", "delivery_price": 100 }, 
            { "product_name":"CCCC", "price":3000, "category":"C", "delivery_price": 100 }, 
            { "product_name":"DDDD", "price":4000, "category":"D", "delivery_price": 100 }, 
          ]
        };
    },
}
</script>

랜더링 문법 (v-if, v-show)

v-if

  • v-if 디렉티브 표현식
<!-- v-else 디렉티브를 사용해서 else if 표현식 사용가능 --> 
<h1 v-if="showFlag">showFlag가 true 이면, 현재 블록이 화면에 보인다.</h1>
<h1 v-else>showFlag가 true가 아니면 현재 블록이 보인다.</h1>

vue-project/src/views/RenderingVIf.vue

<template>
  <div>
    <h1 v-if="type=='A'">A</h1>
    <h1 v-else-if="type=='B'">B</h1>
    <h1 v-else>ETC</h1>
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            type: 'A'
        };
    }
}
</script>

v-show

  • v-show 디렉티브 표현식
<h1 v-show="showFlag">showFlag가 true 이면, 현재 블록이 화면에 보인다.</h1>
  • v-if 와 v-show 의 차이점
    • v-if 는 조건에 만족하면 그순간에 html 블록이 생성되고, 조건에 만족하지 않으면 html 블록은 삭제된다.
      • v-if 는 실제로 해당 블록 전체를 생성했다 삭제하여 v-show 보다 리소스 사용이 많다.
    • v-show 는 조건 만족여부와 관련없이 무조건 html 블록이 생성됨
      • 조건 만족시 css의 display를 이용해서 화면에서 보여진다.
      • 조건 불만족시 화면에서 숨겨진다.
    • html 블록에서 toggle 이 자주 발생하면 v-show 를 사용하고 그렇지 않을 경우 v-if 를 권장

이벤트 처리 (v-on)

  • vue 컴포넌트에서 이벤트 처리시 v-on 디렉티브를 사용
  • v-on 디렉티브는 심볼 @ 로 사용 가능

클릭 이벤트 (v-on:click)

vue-project/src/views/EventClick.vue

<template>
  <div>
    <button type="button" @click="addCounter">Add 1</button>
    <!-- 함수에 파라미터를 전달하고 싶을 때-->
    <button type="button" @click="addCounterNumber(3)">Add 3</button>
    <p>This Counter is : {{ counter }}</p>
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            counter: 0
        };
    },
    methods: {
        addCounter() {
            this.counter = this.counter + 1;
        },
        addCounterNumber(number) {
            this.counter = this.counter + number;
        }
    }
}
</script>

Change 이벤트

  • @change="메소드명" 으로 사용

/home/kalva/vue-project/src/views/EventChange.vue

<template>
  <div>
    <select v-mode="selectedValue" @change="changeSelect">
      <option value="서울">서울</option>
      <option value="대구">대구</option>
      <option value="부산">부산</option>
    </select>
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            selectedValue:''
        };
    },
    methods:{
        changeSelect() {
            alert(this.selectedValue);
        }
    }
}
</script>

Key 이벤트

  • Vue 에서 제공하는 Key 이벤트
    • .enter
    • .up
    • .tab
    • .down
    • .delete (키보드 Del, Backspace 키)
    • .left
    • .esc
    • .right
    • .space
<!-- 엔터키 입력 -->
<input @keyup.enter="submit" />

<!-- Alter + Enter -->
<input @keyup.alt.enter="clear" />

<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

computed, watch

  • computed, watch 둘다 Vue 인스턴스 내의 정의된 데이터 값에 변경이 일어나는지 감시하고, 변경될 때마다 정의된 함수가 실행됨

computed

vue-project/src/views/Computed.vue

  • firstName, lastName 의 값중 하나라도 변경되면 fullName 함수가 자동으로 실행되고 fullName 값이 갱신된다.
    • firstName, lastName 의 초기 지정값도 변경으로 인식한다.
      <template>
      <div>
      <h1>Full Name: {{ fullName }}</h1>
      </div>
      </template>
      <script>
      export default{ 
      data(){
          return{
              firstName: 'AAA',
              lastName: 'BBB'
          };
      },
      computed: {
          fullName() {
              return this.firstName + ' ' + this.lastName;
          }
      }
      }
      </script>

watch

  • watch 는 초기에 할당된 값에서 변경이 일어나야 watch 에서 정의한 함수를 실행한다.
    • firstName, lastName 의 초기 지정값은 변경으로 인식 안한다.

vue-project/src/views/Watch.vue

<template>
  <div>
        <h1>Full Name : {{ fullName }}</h1>
        <button type="button" @click="changeName">변경</button>
  </div>
</template>
<script>
export default{ 
    data(){
        return{
            firstName: '',
            lastName: '',
            fullName: ''
        };
    },
    watch: {
        firstName() {
            this.fullName = this.firstName + ' ' + this.lastName;
        },
        lastName() {
            this.fullName = this.firstName + ' ' + this.lastName;
        }
    },
    methods: {
        changeName() {
            this.firstName = 'CCC';
        }
    }
}
</script>

'Dev' 카테고리의 다른 글

Hyper-v 백업 복사해서 복원하기  (0) 2024.01.15
WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26

데이터 바인딩

  • Vue 는 양방향 데이터 바인딩(Two-way data binding)을 지원함

  • 양방향 데이터 바인딩

    • Model 에서 데이터를 정의한 후 View 와 연결하면 Model과 View 중 어느 한쪽에 변경이 있어났을 때 다른 한쪽에 자동으로 반영되는것
  • 서버로부터 받아온 데이터를 바인딩 하는 경우

    • 데이터가 html tag 안에 텍스트로 바인딩 되는 경우
    • 데이터가 html tag의 속성(atrribute)로 바인딩 되는 경우
    • 데이터가 html의 Form element의 value에 바인딩 되는 경우
    • 다중 데이터가 html의 다중 element를 생성하기 위해서 바인딩 되는 경우

Vue에서 사용되는 데이터 바인딩 문법

  • 데이터를 html에 텍스트로 바인딩 시킬때는 이중 중괄호({{}})를 사용함

문자열 데이터 바인딩

  • 이중 중괄호({{}})를 이용해서 데이터 바인딩
    <h1>Hello, {{title}}!</h1>

raw(원시) HTML 데이터 바인딩

  • 이중 중괄호({{}})를 이용해서 바인딩하면 html 태그가 아닌 문자열, 텍스트로 인식됨
  • v-html 디렉티브를 사용해야 실제 HTML 로 출력된다.

vue-project/src/views/DataBinding.vue

<template>
    <div>
        <div>{{ htmlString }}</div>
        <div v-html="htmlString"></div>
    </div>
</template>
<script>
export default {
    data() {
        return {
            htmlString: '<p style="color:red;">This is a red string.</p>'
        };
    },
}
</script>

vue-project/src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import DataBinding from '../views/DataBinding.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  },
  {
    path: '/databinding',
    name: 'DataBinding',
    component: DataBinding
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

vue-project/src/App.vue

<template>
  <div id="nav">
    <router-link to="/">Home</router-link> |
    <router-link to="/databinding">Data Binding</router-link>
  </div>
  <router-view/>
</template>

브라우저에서 확인

'Dev' 카테고리의 다른 글

WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26
Vue CLI 설치, 프로젝트 생성  (0) 2023.06.25

컴포넌트

  • 컴포넌트
    • View, Data, Code(html, javascript, data) 의 세트
    • Vue 에서 컴포넌트는 페이지 자체 또는 페이지 내의 특정 기능 요소일 수 있음

컴포넌트의 가장 큰 특징

  • 재사용 가능
    • 다른 컴포넌트에서 import 해서 사용가능

src 디렉토리 구조

views 폴더

  • 페이지 화면에 해당되는 vue 컴포넌트 파일 생성

commponents 폴더

  • 다른 vue 파일에서 호출해서 공통으로 사용할 수 있는 vue 컴포넌트 파일 생성

컴포넌트 구조

snippet 기능

  • 특정 코드를 미리 작성하고 등록하여 단축키로 코드를 불러와서 바로 사용할 수 있는 기능

컴포넌트 기본 구조

  • 기본 프로퍼티
    • name, components, data, computed
  • 메소드
    • 뷰 컴포넌트가 생성되고 종료될때까지 발생하는 라이프사이클 훅에 해당함

vue 컴포넌트 개발시 가장 자주 사용하는 기본 코드 구조를 snippet에 등록

<template>
  <div></div>
</template>
<script>
  export default {
    name: '', // 컴포넌트 이름 
    components: {}, // 다른 컴포넌트 사용시 컴포넌트를 import 하고, 배열로 저장
    data() { // html, javascript 에서 사용할 데이터 변수 선언 
      return {
        sampleData: ''
      };
    },
    setup() {}, // 컴포지션 API
    created() {}, // 컴포넌트가 생성되면 실행
    mounted() {}, // template에 정의된 html 코드가 랜더링된 후 실행
    unmounted() {}, // unmount 가 완료된 후 실행
    methods: {} // 컴포넌트 내에서 사용할 메소드 정의 
  } 
</script>
  • <template>: view에 해당하는 html 코드 작성 영역
  • name: 컴포넌트 이름 등록, 컴포넌트 이름은 등록하지 않아도됨
  • components: 외부 컴포넌트 사용시 해당 컴포넌트 import후, 이곳에 배열로 등록해줘야함
  • data
    • 데이터 프로퍼티는 html, javascript 에서 전역 변수로 사요하기 위해 선언하는 데이터
    • 데이터 바인딩을 통해 화면에 해당하는 html과 코드에 해당하는 javascript 간의 양방향 통신이 가능하도록 한다.
    • 데이터 프로퍼티에 정의된 변수는 this를 통해 접근한다.
  • setup: 컴포지션 API를 구현하는 메소드
  • created: 컴포넌트가 생성되면 실행됨
  • mounted: 템플릿에 작성한 HTML 코드가 랜더링된 후 실행됨
  • unmounted: 컴포넌트를 빠져나갈때 실행됨
  • methods
    • 컴포넌트 내에서 사용할 메소드를 정의하는 곳
    • 이곳에 작성된 메소드는 this를 통해서 접근해야함

vscode Snippet 설정

  • 기본설정 -> 사용자 코드 조각 구성
  • vue.json (Vue) 선택

Vue.json 파일에 아래 내용 등록

  • \n(뉴라인), \t(탭)을 잘맞추어서 등록
{
    "Generate Basic Vue Code":{
        "prefix":"vue-start",
        "body": [
            "<template>\n  <div>\n  </div>\n</template>\n<script>\nexport default{ \n\tname:'',\n\tcomponents:{},\n\tdata(){\n\t\treturn{\n\t\t\tsampleData:''\n\t\t};\n\t},\n\tsetup(){},\n\tcreated(){},\n\tmounted(){},\n\tunmounted(){},\n\tmethods:{}\n}\n</script>"
        ],
        "description": "Generate Basic Vue Code"
    }
}

Snippet 사용

  • src/views/About.vue 파일을 열어서 내용 모두 삭제
  • sat 라고 입력하면 vue-start 가 보인다.
  • vue-start 선택시 아래와 같이 자동으로 만들어진다.

Lifecycle Hooks

  • 모든 컴포넌트는 생성될때 초기화 단계를 거침
    • EX) 데이터의 변경사항 감시를 위한 설정, 템플릿 컴파일, 인스턴스를 DOM에 마운트, 데이터가 변경되면 DOM 을 업데이트
  • Lifecyle Hooks 다이어그램

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue Router 설정  (0) 2023.06.26
Vue CLI 설치, 프로젝트 생성  (0) 2023.06.25
# 윈도우 11 WSL2 설치  (0) 2023.06.18

라우팅이란?

  • 클라이언트에서 url 주소에 따라 페이지가 전환 되는것
  • Vue 프로젝트 내부에서 미리 url 주소를 정의하고, 각 주소마다 Vue 페이지를 연결해놓음

Vue-Rounter 설치

  • vue 에서 제공하는 공식 플러그인 vue-router를 이용해 라우팅을 쉽게 구현 가능
kalva@RT-PC:~/vue-project$ vue add router
 WARN  There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes
  • @vue/cli-plugin-router 가 설치됨
    • src 폴더에 router, views 폴더와 파일이 생성됨

App.vue 파일

kalva@RT-PC:~/vue-project$ cat src/App.vue
<template>
  <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </nav>
  <router-view/>
</template>
...

router/index.js 파일

kalva@RT-PC:~/vue-project$ cat src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router
  • routes 배열에 2개의 라우트가 등록되어 있다.
    • Home 컴포넌트
    • About 컴포넌트
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  • path : 브라우저에서 접속하는 url 주소
  • component : 지정된 path 로 접속했을때 보여줄 vue 컴포넌트
    • component: HomeView => import HomeView from '../views/HomeView.vue'
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
  • // route level code-splitting
    • 라우트 레벨에서 코드를 분할하는 방법
  • // this generates a separate chunk (about.[hash].js) for this route
    • 이 라우트에 대한 chunk 파일이 분리되어 생성됨
  • // which is lazy-loaded when the route is visited.
    • 이 라우트에 방문했을때 lazy-load(자연 로드) 됨
  • component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
    • 라우트 레벨에서 코드를 분할한 후 별도의 chunk 파일을 생성하고, 이 라우트를 방문했을때 리소스를 로드함, 컴포넌트 import 시 /* webpackChunkName: "about" */ 라는 주석으로 chunk 파일 이름을 정의해서 chunk 파일은 about 이라는 이름으로 생성된다.
  • 두가지 방식의 차이
    • 첫번째 : 사용자가 해당 path에 접근하지 않더라도 이미 vue 파일을 import
    • 두번째 : path에 접근해야 vue 파일을 import

Lazy Load 적용

Lazy Load

  • 리소스를 컴포넌트 단위로 분리하여 컴포넌트, 라우터 단위로 필요한 것들만 다운 받을 수 있게 하는 방법

Vue 에서 Lazy Load 사용시 주의사항

  • Vue CLI3 부터 prefetch 기능 추가됨
  • prefetch 기능
    • 미래에 사용될수 있는 리소스를 캐시에 저장해서 사용자 접속시 빠르게 리소스 제공
    • 비동기 컴포넌트로 정의된 모든 리소스를 캐시에 담아두는 비용 발생
      • 분리된 chunk 파일 각각에 대한 request 가 발생, 각각의 파일을 다운로드 받아서 캐시에 저장함
    • prefetch 기능은 랜더링 시간을 줄여주는데, 잘못 사용시 랜더링 시간이 늘어남
    • Vue CLI 에서 prefetch 기능은 기본값으로 true 설정, Lazy Load가 적용된 컴포넌트는 모두 prefetch 기능이 적용되어 캐시에 저장됨
    • prefetch 기능 사용시
      • request 요청수 증가됨, 비동기 컴포넌트로 정의돈 모든 리소스를 캐시에 담기위해 Request 요청 수가 많아짐
      • 애플리케이션의 첫화면 접속시 랜더링 속도가 느려질 수 있음
        • 첫 화면에서 사용되는 리소스를 가장 나중에 다운받음, 다른 화면에 대한 리소스를 모두 내려받고 나서야 첫 화면에서 사용되는 리소스를 내려 받음
    • prefetch 기능 미사용시
      • 요청 수 prefetch 사용시보다 줄어듬
      • 라우터가 이동될 때마다 해당 라우터에서 필요한 리소스를 가져옴
        • 한번 가져온 리소스는 다시 요청하지 않음
    • 초기 랜더링은 prefetch 미사용시 더 빠르게 로딩됨
    • prefetch 기능은 다른 화면에서 사용될 리소스를 미리 내려 받아서, 애플리케이션에서 화면 전환시 빠른 성능을 가져온다는 장점을 이용하기 위해서 사용함
      • 필요한 컴포넌트에 대해서 prefetch 기능 적용 권장
    • 라우터를 통해 이동되는 컴포넌트에서 사용되는 리소스가 크지 않을 경우 prefetch 기능을 사용하지 않더라도 사용자 접속 시점에 다운받도 충분히 매끄럽게 동작함

prefetch 기능을 끄는 방법

  • Vue.config.js 파일을 생성하고 다음 코드 추가
vi vue-project/vue.config.js
module.exports={
  chainWebpack: config=>{
    config.plugins.delete('prefetch'); //prefetch 삭제
  }
};

※ vue 가 업데이트 되면서 기본 값이 prefetch를 사용하지 않는것으로 변경됨

prefetch를 사용하고 싶은 경우

  • 라우터에 webpachPrefetch:true를 넣어준다.
component: () => import(/* webpackChunkName: "about"*/ /* webpackPrefetch: true */ '../views/AboutView.vue')

routes/index.js, main.js 파일

  • routes/index.js 의 첫 번째 줄에는 라우팅을 처리하기 위해 vue-router를 import 한다.
# routes/index.js
import { createRouter, createWebHistory } from 'vue-router'
  • 이렇게 정의된 router 는 main.js 에 등록해서 사용함
# main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')
  • import router from './router' 를 통해 router/index.js 파일이 import 됨
  • createApp(App).use(router).mount('#app')
    • createApp(App) 최상위 컴포넌트인 App.vue 로 app를 생성하고, use(router) 코드를 추가하여 App.vue에서 router가 사용될 수 있도록 추가하고 App.vue 를 public 폴더의 index.html 에 정의되어 있는 id="app"인 htmlelement 에 마운트시킴

컴포넌트

  • 조합하여 화면을 구성할 수 있는 블록

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue CLI 설치, 프로젝트 생성  (0) 2023.06.25
# 윈도우 11 WSL2 설치  (0) 2023.06.18

Vue CLI 설치

npm install -g @vue/cli
  • npm install 패키지명 을 통해 NPM 에 등록된 패키지 설치 가능

-g(global)

npm install -g 패키지명
  • -g 옵션 사용시 설치하는 패키지는 모든 프로젝트에서 사용할 수 있는 global 패키지로 등록됨

--save

npm install 패키지명 --save
  • 작업중인 디렉토리 내에 있는 ./nonde_modules 에 패키지 설치
  • package.jon 파일의 dependencies 객체에 설치한 패키지 정보 추가
  • ./node_modules
    • 설치되는 모든 패키지가 설치되는 디렉토리
    • 사용하고 있는 모든 패키지 확인 가능
  • package.jon 을 공유하여 "npm install" 명령어로 프로젝트 디렉토리에 없는 패키지를 한번에 설치 가능
    • 코드 레피지토리(ex github)에 패키지 파일 업로드 필요 없음

Vue 프로젝트 생성

vue create vue-procject 

# Default ([Vue 3] 을 선택하고 엔터 
Vue CLI v5.0.8
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint)
  Default ([Vue 2] babel, eslint)
  Manually select features

Vue 프로젝트 실행

cd vue-project 
npm run serve

Vue 프로젝트 파일 구조

  • node_modules : npm 으로 설치된 패키지 파일들이 모여 있는 디렉토리
  • public : webpack 을 통해 관리되지 않는 정적 리소스가 모여 있는 디렉토리
  • src/assets : 이미지, css, 폰트 등을 관리하는 디렉토리
  • src/components : Vue 컴포넌트 파일이 모여 있는 디렉토리
  • App.vue : 최상위(Root) 컴포넌트
  • main.js : 가장 먼저 실행되는 자바스크립트 파일, Vue 인스턴스를 생성하는 역할
  • .gitnore : github에 업로드시 제외할 파일 설정
  • babel.config.js : Babel 설정 파일
  • package-lock.json : 설치된 package의 dependency 정보를 관리하는 파일
  • package.json : 프로젝트에 필요한 package를 정의하고 관리하는 파일
  • README.md : 프로젝트 정보를 기록하는 파일

package.js 파일

kalva@RT-PC:~/vue-project$ cat package.json
{
  "name": "vue-project",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.8.3",
    "vue": "^3.2.13"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.12.16",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/vue3-essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "@babel/eslint-parser"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}
  • name : 프로젝트 이름
  • version : 프로젝트 버전
  • private : true 로 설정시 프로젝트를 npm 으로 올릴수 없다.
    • 실수로 프로젝트를 npm 에 올리더라도 private: true 인 경우 배포를 막을 수 있다.
  • scripts : 프로젝트 실행과 관련된 명령어 등록
    • 개발자가 정의한 script는 npm run 명령어 사용
    • npm 에서 제공되는 명령어는 npm 명령어 사용
  • dependencies : 사용중인 패키지 정보
  • devDependencies : 개발시에만 필요한 패캐지 정보
  • eslnitConfig : ESLint 는 일괄성 있게 코드를 작성하고 버그를 회피할 목적으로 ECMAScript/Javascript 코드에서 발견된 패턴을 개발자에게 알려주는 플러그인
    • 구문 분석을 위해서 bael-eslint 를 파서로 사용
  • browserslist : 전 세계 사용 통계 속에서 상위 1%이상 사용된 브라우저, 각 브라우저의 최신 버전 2개를 지원

패키지 설치시 dependencies, devDependencies, eslintConfig 등은 자동으로 등록됨, name, version, private 등은 사용자가 직접 등록

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26
# 윈도우 11 WSL2 설치  (0) 2023.06.18

+ Recent posts