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' 카테고리의 다른 글

WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26

WSL2 에 Rocky Linux 8 설치

PS E:\Hyper-V> wsl --import Redis72 E:\Hyper-V\Redis72 E:\Hyper-V\Rocky-8-Container-Base.latest.x86_64.tar.xz --version 2


PS E:\Hyper-V> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
  Redis72         Stopped         2
  PostgreSQL14    Stopped         2

PS E:\Hyper-V> wsl -d Redis72

Redis 7.2 설치

-- 저장소 설치 
[root@RT-PC Hyper-V]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
[root@RT-PC Hyper-V]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

-- redis 모듈 검색 
[root@RT-PC Hyper-V]# dnf module list redis
Rocky Linux 8 - AppStream
Name                 Stream                  Profiles                  Summary
redis                5 [d]                   common [d]                Redis persistent key-value database
redis                6                       common [d]                Redis persistent key-value database

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                 Stream                  Profiles                  Summary
redis                remi-5.0                common [d]                Redis persistent key-value database
redis                remi-6.0                common [d]                Redis persistent key-value database
redis                remi-6.2                common [d]                Redis persistent key-value database
redis                remi-7.0                common [d]                Redis persistent key-value database
redis                remi-7.2                common [d]                Redis persistent key-value database

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

-- 7.2 버전 설치 
[root@RT-PC Hyper-V]# dnf module reset redis
[root@RT-PC Hyper-V]# dnf module install redis:remi-7.2

-- redis 서비스 사용 설정 
[root@RT-PC ~]# systemctl enable redis
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.

-- redis 서비스 시작 
[root@RT-PC ~]# systemctl start redis
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

-- systemctl 사용 설정 
[root@RT-PC ~]# echo "[boot]
systemd=true" | tee /etc/wsl.conf

-- Redis72 를 재기동한다. 
[root@RT-PC ~]# exit
logout

PS E:\Hyper-V> wsl -t Redis72
작업을 완료했습니다.

PS E:\Hyper-V> wsl -d Redis72

-- redis 서비스 상태확인 
[root@RT-PC Hyper-V]# systemctl status redis
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Sat 2023-12-09 12:21:56 KST; 53s ago
 Main PID: 49 (redis-server)
   Status: "Ready to accept connections"
    Tasks: 5 (limit: 26213)
   Memory: 11.8M
   CGroup: /system.slice/redis.service
           └─49 /usr/bin/redis-server 127.0.0.1:6379

Dec 09 12:21:56 RT-PC systemd[1]: Starting Redis persistent key-value database...
Dec 09 12:21:56 RT-PC systemd[1]: Started Redis persistent key-value database.

-- redis 접속 
[root@RT-PC Hyper-V]# redis-cli
127.0.0.1:6379>

테스트를 위해서 wsl2 사용 설정 필요

wsl 에 rocky linux 8 설치

-- wsl 에 Rocky Linux 8 설치 
PS C:\Users\kalva> wsl --import PostgreSQL14 E:\Hyper-V\PostgreSQL14 E:\Hyper-V\Rocky-8-Container-Base.latest.x86_64.tar.xz --version 2
가져오기가 진행 중입니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.
작업을 완료했습니다.

-- 설치된 Rocky Linux 8 설치
PS C:\Users\kalva> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
  PostgreSQL14    Stopped         2

-- 설치된 Rocky Linux 8 접속
PS C:\Users\kalva> wsl -d PostgreSQL14

-- 리눅스 버전 확인
[root@RT-PC kalva]# cat /etc/redhat-release
Rocky Linux release 8.8 (Green Obsidian)

-- 시스템 정보 확인
[root@RT-PC kalva]# uname -a
Linux RT-PC 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

-- sudo passwd 설치 
[root@RT-PC kalva]# dnf install -y sudo passwd

-- postgres 유저 추가, 패스워드 변경 
[root@RT-PC kalva]# useradd postgres
[root@RT-PC kalva]# passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

-- postgres 유저가 sudo 를 사용할 수 있게 추가 
[root@RT-PC kalva]# visudo
# %wheel        ALL=(ALL)       NOPASSWD: ALL 아래에 postgres 유저 추가 
postgres        ALL=(ALL)       NOPASSWD: ALL

[root@RT-PC kalva]# su - postgres
[postgres@RT-PC ~]$ sudo -i
[root@RT-PC ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@RT-PC ~]# exit
logout

-- systemd 사용 설정 
[postgres@RT-PC ~]$ echo "[boot]
systemd=true" | sudo tee /etc/wsl.conf
[boot]
systemd=true

-- systemd procps 설치 
[postgres@RT-PC ~]$ sudo dnf install -y systemd procps

-- OS 로케일 확인 
[postgres@RT-PC ~]$ locale -a
C
C.utf8
POSIX

-- glibc-locale-source 설치 
[postgres@RT-PC ~]$ sudo dnf install -y glibc-locale-source

-- ko_KR.utf8 locale 생성 
[postgres@RT-PC ~]$ sudo localedef -f UTF-8 -i ko_KR ko_KR.utf8

-- locale 설정 .bash_profile 파일에 LANG 설정 추가 
[postgres@RT-PC ~]$ vi .bash_profile 
export LANG=ko_KR.utf8

[postgres@RT-PC ~]$ exit
logout
[root@RT-PC ~]# exit
logout

--PostgreSQL14 재기동 
PS C:\Users\kalva> wsl -t PostgreSQL14
작업을 완료했습니다.
PS C:\Users\kalva> wsl -d PostgreSQL14
[postgres@RT-PC ~]$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[postgres@RT-PC ~]$ sudo dnf -qy module disable postgresql
[postgres@RT-PC ~]$ sudo dnf install -y postgresql14-server
[postgres@RT-PC ~]$ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
[postgres@RT-PC ~]$ sudo systemctl enable postgresql-14
[postgres@RT-PC ~]$ sudo systemctl start postgresql-14

[postgres@RT-PC ~]$ ps x
    PID TTY      STAT   TIME COMMAND
     34 ?        Ss     0:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
     38 ?        Ss     0:00 postgres: logger
     43 ?        Ss     0:00 postgres: checkpointer
     44 ?        Ss     0:00 postgres: background writer
     45 ?        Ss     0:00 postgres: walwriter
     46 ?        Ss     0:00 postgres: autovacuum launcher
     47 ?        Ss     0:00 postgres: stats collector
     48 ?        Ss     0:00 postgres: logical replication launcher
     91 pts/0    S      0:00 -bash
    180 pts/0    R+     0:00 ps x

[postgres@RT-PC ~]$ psql
psql (14.9)
Type "help" for help.

postgres=# select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 14.9 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-18), 64-bit
(1 row)

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 |
 template0 | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

문뜩 상세 옵션이 궁금해서 정리

 

--apply-log-only
  - Redo Log 적용단계만 수행되고 다른 Cash Reecovery 단계는 무시된다. 
    로그만을 적용하고 데이터베이스를 실제로 복원하지 않는다. 
    Commit 되지 않은 트랜잭션의 롤백단계 방지용
  - 증분 백업시에 사용

--backup
  - --target-dir 에 지정한 디렉토리에 데이터베이스를 백업한다. 

--backup-lock-retry-count=
  - 메타데이터 락을 획득하려는 시도 횟수 

--backup-lock-timeout=
  - 메타데이터 락을 획득하려는 시도시의 제한 시간(초)

--binlog-info (OFF | ON | LOCKLESS | AUTO)
  - xtrabackup 이 binlog 로그 좌표를 검색하는 방법 지정 
  - OFF : binlog 정보 검색 없이 백업한다. 
          LOCK BINLOG FOR BACKUP 명령어 실행안함 
  - ON : binlog 정보 검색 활성화
         가능한 경우 LOCK BINLOG FOR BACKUP 명령어를 실행하여 binlog-lock의 공유 장금을 적용하여 일관성을 보장한다. 
  - LOCKLES : 락을 최소화하여 테이블 잠금없이 binlog 정보를 백업한다.
              LOCK BINLOG FOR BACKUP 명령어 실행안함 
              xtrabackup_binlog_info 파일 생성안함 
  - AUTO : 기본값 
           백업 대상서버의 have_backup_safe_binlog_info 서버 변수값에 따라 자동으로 ON, LOCKLESS로 전환된다. 
           have_backup_safe_binlog_info 변수가 나타내는 정보는 MySQL 서버의 현재 상태에 따라 동적으로 변경된다. 

--check-privileges
  - 백업을 수행하기전에 백업을 수행하기 위한 권한이 있는지 확인한다.

--close-files
  - xtrabackup은 테이블스페이스를 열때 일반적으로 DDL 작업을 올바르게 관리하기 위해 파일 핸들을 닫지 않는다. 
    테이블스페이스 수가 너무 많아 제한에 맞지 않을 경우 더 이상 액세스할 수 없으면 파일 핸들을 닫도록 이 옵션을 사용할 수 있다.
  - 옵션 사용시 일관성 없는 백업을 생성할 수 있다. (주의)

--compact
  - 보조 인덱스(Secondary Index) 페이지를 건너뛰어 백업 파일의 크기를 최적화하는 옵션이다. 
    주요 인덱스(primary index)는 백업 파일에 유지되지만, 보조 인덱스(Secondary Index)는 필요한 경우에만 유지되고 그렇지 않으면 생략된다. 

--compress
  - 지정된 압축 알고리즘을 사용하여 트랜잭션 로그 파일, 메타데이터 파일을 포함한 모든 출력 데이터를 압축한다.
  - quicklz 알고리즘만 지원하고 있다. 
    결과 파일은 qpress 아카이브 형식을 갖는다.
  - xtrabackup 에서 생성된 모든 \*.qp 파일은 기본적으로 단일 파일 qpress 아카이브이며 qpress 파일 아카이버로 추출하고 압축을 풀 수 있다. 

--compress-chunk-size=
  - 압축 스레드의 작업 버퍼 크기(바이트), 기본값 64K

--compress-threads=
  - 병렬 데이터 압축을 위해 사용하는 스레드 수 지정, 기본값 1 
  - 병력 압축(--compress-threads)은 병렬 백업 (--parallel)와 함께 사용할 수 있다. 
    ex) --parallel=4 --compress --compress-threads=2
        4개의 스레드로 병렬 압축 백업, 압축 스레드로 2개의 스레드를 사용한다. 

--copy-back
  - 백업된 데이터를 실제 데이터 디렉토리로 복원
  - 데이터 디렉토리에 비워져 있어야함
    데이터가 있을 경우 덮어쓰여질 수 있다. 
    
--core-file
  -  xtrabackup이 비정상 종료될 때 발생한 Core Dump를 저장하는 경로를 지정하는 옵션

--databases=
  - 백업 대상 데이터베이스 및 테이블 목록을 지정
  - "databasename1[.table_name1] databasename2[.table_name2] . . .". 형식으로 사용 

--databases-exclude=name
  - 백업시 제외할 데이터베이스명 지정
  - --databases 옵션보다 우선순위가 높다. 

--databases-file=
  - 백업대상 데이터베이스, 테이블의 파일 경로 지정 
  
--datadir=DIRECTORY
  - 백업할 MySQL 서버의 datadir 과 동일하게 지정
  - my.cnf 가 있을 경우 해당 디렉토리에서 읽어야됨 
    - 별도의 경로 지정시 별도로 지정해야됨 
  - --copy-back, --move-back 옵션과 같이 사용하면 xtrabackup 은 --datadir 디렉토리를 참조한다. 
  - 백업을 위해 datadir의 파일시스템 수준에서 READ 및 EXECUTE 권한이 필요함 

--debug-sleep-before-unlock
  - xtrabackup 테스트에서 사용되는 디버그 전용 옵션 
  
--decompress
  - --compress 옵션을 사용하여 백업받은 .qp 확장자의 파일의 압축 해제 
  - --parallel 옵션 사용시 여러 파일을 동시 처리 가능 
  - 압축해제를 위해 qpress 유틸티가 필요하며, 액세스할수 있는 경로에 있어함 
  - 압축 파일을 삭제하기 위해서는 --remove-original 옵션을 사용해야함 
    - xtrabackup 은 압축 파일을 자동으로 삭제 하지 않는다. 

--decrypt
  - --encrypt 옵션을 사용하여 백업한 백업에서 .xbcrypt 확장자 파일을 복호화한다.
  - --parallel 옵션 사용시 여러 파일을 동시 처리 가능 
  - 압축 파일을 삭제하기 위해서는 --remove-original 옵션을 사용해야함 
    - xtrabackup 은 압축 파일을 자동으로 삭제 하지 않는

--defaults-extra-file=[MY.CNF]
  - xtrabackup에서 MySQL 서버와의 통신에 필요한 추가 설정을 지정하는데 사용
  - ex) xtrabackup.cnf 파일에 아래와 같이 설정 
    [client]
    user=username
    password=password
    host=localhost
    port=3306
    - /path/to/xtrabackup.cnf 파일에 저장된 설정을 사용하여 MySQL 서버에 연결하여 백업을 처리한다. 
    xtrabackup --backup --defaults-extra-file=/path/to/xtrabackup.cnf --target-dir=/path/to/backup_directory


--defaults-file=[MY.CNF]
  - my.cnf 파일의 경로를 지정하여 해당 파일에 저장된 설정을 참조한다. 

--defaults-group=GROUP-NAME
  - my.cnf 파일에서 읽어야하는 그룹을 설정 
  - --default-group 옵션은 mysqld_multi 배포에서 사용한다.

--defaults-group-suffix=
  - my.cnf 파일에서 그룹 이름에 접미사를 추가하는 방식을 사용한다. 
    - concat(group, suffix)

--dump-innodb-buffer-pool
  - InnoDB 버퍼풀의 상태를 파일로 덤프하는데 사용 (기본 OFF)

--dump-innodb-buffer-pool-timeout
  - InnoDB 버퍼풀 덤프가 완료되었는지 확인하기 위해 innodb_buffer_pool_dump_status 값을 모니터링 해야하는 시간(초) (기본 10초)

--dump-innodb-buffer-pool-pct
  - InnoDB 버프풀을 덤프할때 사용할 버퍼풀의 비율 
  
--encrypt=ENCRYPTION_ALGORITHM
  - xtrabackup 으로 백업시 지정한 알고리즘으로 압축 

--encrypt-key=ENCRYPTION_KEY
  - --encrypt 옵션을 사용할때 지정한 ENCRYPTION_KEY를 사용하도록 설정 

--encrypt-key-file=ENCRYPTION_KEY_FILE
  - --encrypt 옵션을 사용할때 지정한 ENCRYPTION_KEY_FILE 에 저장된 암호화 키를 사용하도록 설정 

--encrypt-threads=
  - 병렬 암호화/복호화에 사용될 스레드수를 지정
  
--encrypt-chunk-size=
  - 암호호 스레드에 대한 작업 버퍼의 크기 지정(바이트 단위)
  - 암호화 사용시 xbcloud/xbstream 청크 크기를 조정하려면 --encrypt-chunk-size, --read-buffer-size 변수를 모두 조정해야한다. 

--export
  - 테이블을 내보내기 위한 파일을 만든다. 

--extra-lsndir=DIRECTORY
  - 백업시에 이 디렉토리에 xtrabackup_checkpoints, xtrabackup_info 파일의 복사본을 저장한다.

--force-non-empty-directories
  - --copy-back, --move-back 옵션 사용시 대상 디렉토리가 비어있지 않을 경우에도 처리한다.
  - xtrabackup 은 백업을 수생할때 타켓 디렉토리가 비어 있는지 확인하고 처리하는데 --force-non-empty-directories 옵션 지정시 디렉토리가 비어 있지 않아도 백업을 수행한다. 

--ftwrl-wait-timeout=SECONDS
  - xtrabackup 이 실행하기전에 FLUSH TABLES WITH READ LOCK을 차단하는 쿼리를 기다려야 하는 시간(초)를 지정한다. 
  - 제한 시간이 만료된 후에도 여전히 그러한 쿼리가 있는 경우 xtrabackup은 오류와 함께 종료된다. 
  - 기본값은 0이며, 이 경우 쿼리가 완료될 때까지 기다리지 않고 즉시 FLUSH TABLES WITH READ LOCK을 시작한다. 
  
--ftwrl-wait-threshold=SECONDS
  - FLUSH TABLES WITH READ LOCK를 차단하는 장기 실행 쿼리를 식별하기 위한 최소 임계값 (기본값 60초)
  - FLUSH TABLES WITH READ LOCK은 이러한 장기 실행 쿼리가 있을 경우 시작되지 않습니다. 
  - --ftwrl-wait-timeout이 0인 경우 이 옵션은 효과가 없습니다.
  - FLUSH TABLES WITH READ LOCK을 실행 하기 전에 –ftwrl-wait-timeout 설정 만큼 기다렸는데도 –-ftwrl-wait-threshold(기본값 60초)에 설정된 시간 보다 더 오래 실행되는 쿼리가 있으면 백업을 취소시켜 lock 대기로 인한 이슈를 최소화 시킨다.

--ftwrl-wait-query-type=all|update
  - 전역 잠금을 실행하기 전에 완료할 수 있는 쿼리 유형을 정의 
    - xtrabackup은 백업중에 데이터가 변경되지 않도록 전역 잠금을 건다. 
      실행 과정에서 명령문을 만나면 명령문이 완료될 때까지 기다렸다가 전역 잠금을 건다.
  - ALL : 전역 잠금을 실행하기 전에 모든 쿼리가 완료될 때까지 대기 (기본값)
  - SELECT : 전역 잠금을 실행하기 전에 SELECT 문이 완료될 때까지 대기
  - UPDATE : 전역 잠금을 실행하기 전에 UPDATE 문이 완료될 때까지 대기 

--galera-info
  - 백업시의 로컬 노드 상태를 포함하는 xtrabackup_galera_info 파일을 생성한다.
  - Percona XtraDB Cluster 백업할때 사용하는 옵션
  - 백업 잠금을 사용하여 백업을 하는 경우 아무런 효과가 없다. 

--generate-new-master-key
 - copy-back 작업을 할때 새 마스터 키를 생성한다.

--history=name
  - PERCONA_SCHEMA.xtrabackup_history 테이블에서 백업 기록을 추적하도록 하는 옵션 

--incremental
  - 증분 백업시 사용하는 옵션 
  - --incremental-lsn, --incremental-basedir 옵션 지정가능 
  - 두 옵션 모두 지정하지 않으면 백업 기본 디렉토리에 백업 

--incremental-basedir=DIRECTORY
  - 증분 백업시 기본 전체 백업이 저장되는 디렉토리 

--incremental-dir=DIRECTORY
  - 중분 백업시에 전체 백업과 증분 백업을 결합하여 새로운 전채 백업을 저장하는 디렉토리 

--incremental-force-scan
  - 증분 백업을 생성할 때 전체 변경된 페이지 비트맵 데이터를 사용할 수 있는 경우에도 백업에 사용할 인스턴스의 데이터 페이지에 대한 전체 스캔을 강제로 수행한다.

--incremental-history-name=name
  - 중분백업의 기반이 되는 PERCONA_SCHEMA.xtrabackup_history 테이블에 저장되는 백업 시리즈의 이름 지정 

--innodb-checksum-algorithm=name
  - InnoDB 가 페이지 체크섬을 계산하는데 사용하는 알고리즘
  - 사용가능한 알고리즘 
    - CRC32, INNODB, NONE, STRICT_CRC32, STRICT_INNODB, STRICT_NONE

--incremental-history-uuid=UUID
- 중분백업의 기반이 되는 PERCONA_SCHEMA.xtrabackup_history 테이블에 저장되는 백업 시리즈에 UUID 를 지정한다.

--incremental-lsn=LSN
  - 증분백업시에 --incremental-basedir을 지정하는 대신 LSN 을 지정 

--innodb-log-arch-dir=DIRECTORY
  - archived log 디렉토리를 지정 
  - --prepare 옵션과 함께 사용함 
  
--innodb-undo-directory=name
  - undo tablespace 의 경로 

--innodb-undo-tablespace=
  - 사용할 undo tablespace 수 
  
--keyring-file-data=FILENAME
  - 키랑 파일의 경로, --xtrabackup-plugin-dir 옵션과 같이 사용 

--kill-long-queries-timeout=
  - xtrabackup이 FLUSH TABLES WITH READ LOCK 을 시작하고 이를 차단하는 실행중인 쿼리를 종료하는 사이에 대기하는 시간(초) 
  - 기본값은 0초로 쿼리 종료를 하지 않는다. 
  - --kill-long-queries-timeout=60 60초동안 실행 중인 쿼리가 있으면 해당 쿼리를 중단하고 백업을 실행한다. 

--kill-long-query-type=select|all
  - FLUSH TABLES WITH READ LOCK을 차단하는 쿼리를 종료할때 대상 쿼리 유형 지정
  - 기본값 : select 

--lock-ddl
  - 백업시 서버에서 모든 DDL 작업을 차단 

--lock-ddl-per-table
  - xtrabackup이 복사를 시작하기 전과 백업이 완료될 때까지 각 테이블에 대한 DDL을 잠근다. 
  
--lock-ddl-timeout
  - 지정한 시간내에 LOCK TABLES FOR BACKUP 이 되지 않을 경우 백업을 중단한다. 

--log-bin[=name]
  - 로그 시퀀스의 기본 이름 

--log-copy-interval=
  - 로그 복사 스레드 확인 사이의 시간 간격을 밀리초 단위로 지정(기본값 1초)
  
--login-path=
  - 로그인 파일에서 이경로를 읽는다. 

--move-back
  - 백업의 모든 파일을 백업디렉토리에서 원래 위치로 이동

--no-backup-locks
  - FLUSH TABLES WITH READ LOCK 대신 백업 잠금을 사용할지 여부를 설정 
  - 백업 잠금은 서버에서 지원해야 옵션이 적용됨 
  - 기본적으로 활성화되어 있어 --no-backup-locks를 사용하여 옵션을 비활성화한다. 

--no-defaults
  - xtrabackup이 MySQL 설정 파일 (예: my.cnf)의 기본값을 사용하지 않도록하는 옵션

--no-lock
  - InnoDB 테이블을 백업하는 동안 잠금을 설정하지 않도록 하는 옵션 
    - 백업중에 다른 트랜잭션이나 쿼리 실행가능 

--no-version-check
  - xtrabakcup --backup 시 자동 버전확인 비활성화

--open-files-limit=
  - 백업 작업 중에 열린 파일의 제한 설정
    - 백업 작업 중에 동시에 열 수 있는 InnoDB 데이터 파일의 수를 제한

--parallel=
  - 병렬 작업에 사용할 스레드 수 (기본값 1)

--password=PASSWORD
  - 데이터베이스에 연결할 때 사용할 비밀번호 

--prepare
  - 백업본으로 복구 수행 

--print-defaults
  - xtrabackup 실행 시 현재 설정값을 표시
  - xtrabackup이 어떤 설정값을 사용하는지 확인하고 디버깅할 때 유용함
 
--print-param
  - 데이터 파일을 원래 위치로 다시 복사하여 복원할 수 있는 매개 변수를 xtrabackup에서 출력한다. 

--read-buffer-size[=#]
  - 읽기 버퍼 크기 설정 (기본값 10MB)
  - 이 옵션으로 xbcloud/xbstream 청크 크기를 기본값인 10MB에서 조정가능 
  - 암호화를 사용할 때 xbcloud/xbstream 청크 크기를 조정하려면 --encrypt-chunk-size 변수와 --read-buffer-size 변수를 모두 조정해야함 

--rebuild-indexes
  - --prepare 시 로그 적용후 InnoDB 테이블에서 보조 인덱스를 재구축

--rebuild-threads=
  - 백업에서 인덱스를 재구성할 스레드 수를 정의. --prepare 및 --rebuild-index와 함께만 사용한다. 

--redo-log-version=
  - 백업의 redo log 파일의 버전 지정, --prepare 와 함께 사용 

--reencrypt-for-server-id=
  - 복제 복제본이나 Galera 노드와 같이 암호화된 백업을 가져온 서버 인스턴스와 다른 server_id로 서버 인스턴스를 시작할 수 있다.
  - xtrabackup이 새 server_id를 기반으로 ID를 가진 새 마스터 키를 생성하여 키링 파일에 저장한 후 테이블스페이스 헤더 내의 테이블스페이스 키를 다시 암호화한다. 

--remove-original
 - 복호화 및 압축 해제 후 .qp, .xbcrypt 및 .qp.xbcrypt 파일 삭제 

--rsync
  - rsync를 사용하여 InnoDB가 아닌 모든 파일을 복사한다. 
  - --stream과 함께 사용할 수 없다. 

--safe-slave-backup
  - FLUSH TABLES WITH READ LOCK 을 실행하기전에 replica SQL thread 를 중지하고 SHOW STATUS 의 Slave_open_temp_tables가 0이 될때까지 백업 시작을 대기한다. 
  - 열려 있는 임시 테이블이 없으면 백업이 수행되고, 열려 있는 임시 테이블이 없을 때까지 SQL 스레드가 시작되고 중지된다. 
  - --safe-slave-backup-timeout 초 후에 Slave_open_temp_tables가 0이 되지 않으면 백업이 실패한다.
  - 백업이 완료되면 replica SQL thread 가 다시 시작된다.
  - 이 옵션은 임시 테이블 복제를 처리하기 위해 구현되었으며 행 기반 복제에서는 필요하지 않다.
  
--safe-slave-backup-timeout=SECONDS
  - Slave_open_temp_tables가 0이 될 때까지 기다려야 하는 시간(초) (기본값 300초)
  
--secure-auth
  - 클라이언트가 이전(4.1.1 이전) 프로토콜을 사용하는 경우 서버에 대한 클라이언트 연결을 거부한다.
  - 기본적 활성화. 비활성화하려면 --skip-secure-auth 를 사용 

--server-id=
  - 백업 중인 서버 인스턴스

--server-public-key-path=name
  - PEM 형식의 public RSA 키 파일 경로

--skip-tables-compatibility-check
  - 엔진 호환성 경고를 비활성화 


--slave-info
  - 복제본 서버를 백업할때 유용한 옵션
  - 소스 서버의 binlog position 을 출력한다. 
  - xtrabackup_slave_info 파일에 CHANGE MASTER 명령으로 binlog position 을 기록한다. 
    - 백업으로 복제 서버를 시작하고 xtrabackup_slave_info 파일에 저장된 binlog position 으로 CHANGE MASTER 명령을 실행하여 이 소스에 대한 새 복제본을 설정할 수 있다. 

--ssl
  - ssl 연결을 활성화 한다. 

--ssl-ca
  - 신뢰할 수 있는 SSL CA 목록이 포함된 파일의 경로 지정 

--ssl-capath
  - PEM 형식의 신뢰할 수 있는 SSL CA 인증서가 포함된 디렉터리 경로지정 

--ssl-cert
  - PEM 형식의 X509 인증서가 포함된 파일의 경로지정 
  
--ssl-cipher
  - 연결 암호화에 사용할 수 있는 암호화 목록

--ssl-crl
  - 인증서 해지 목록이 포함된 파일의 경로

--ssl-crlpath
  - 인증서 해지 목록 파일이 포함된 디렉터리의 경로

--ssl-key
  - PEM 형식의 X509 키가 포함된 파일의 경로
  
--ssl-mode
  - ssl 모드 지정 

--ssl-verify-server-cert
  - 서버에 연결할 때 사용되는 호스트 이름에 대해 서버 인증서 일반 이름 값을 확인
  
--stats
  - xtrabackup이 지정된 데이터 파일을 스캔하고 인덱스 통계를 출력
  
--stream=name
  - 모든 백업 파일을 지정된 형식의 표준 출력으로 스트리밍. 현재 지원되는 형식은 xbstream, tar
  
--tables=name
  - 부분백업시사용 이름이 일치하는 테이블만 백업 

--tables-compatibility-check
  - 엔진 호환성 경고 활성화

--tables-exclude=name
  - 백업에서 제외할 테이블명

--tables-file=name
  - 백업 대상 테이블을 특정 파일에서 읽어올 때 사용, 파일명 지정 

--target-dir=DIRECTORY
  - 백업을 저장할 디렉토리 지정 
  - 디렉터리가 존재하지 않으면 디렉터리를 생성한다.
    - 디렉터리가 존재하고 비어 있으면 백업성공
    - 파일이 있을 경우 운영 체제 오류 17가 발생하고 백업 실패 
  - 백업을 수행하려면 --target-dir 값으로 제공하는 디렉터리에 대한 파일 시스템 수준의 READ, WRITE 및 EXECUTE 권한이 필요하다. 

--throttle=
  - 초당 복사되는 청크 수를 제한합니다. 청크 크기는 10MB
  - 대역폭을 10MB/s로 제한하려면 옵션을 1: --throttle=1로 설정한다. 

--tls-version=name
  - tls 버전 지정 (TLSv1, TLSv1.1, TLSv1.2)

--to-archived-lsn=LSN
  - 로그를 적용할 LSN을 지정, --prepare 옵션과 함께 사용 

--transition-key
  - 옵션 사용시 키링 볼트 서버에 엑세스 하지 않고도 백업 처리 가능
    -  xtrabackup은 지정된 암호문에서 AES 암호화 키를 가져와 백업 중인 테이블 공간의 테이블 공간 키를 암호화하는데 사용한다. 

--user=USERNAME
  - MySQL DB 계정 지정   

--version
  - xtrabackup 버전 출력 

--xtrabackup-plugin-dir=DIRNAME
  - 키링 플러그인이 포함된 디렉터리의 절대 경로

'MySQL' 카테고리의 다른 글

CPU 사용률 높은 Thread (세션) 확인  (0) 2022.10.05
lock session 찾기  (0) 2022.10.01
auto_increment 값 모니터링  (0) 2022.09.28
Query Cache  (0) 2022.09.24
Index Hint  (0) 2022.09.22

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 백업 복사해서 복원하기  (0) 2024.01.15
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (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

+ Recent posts