Linux 기반 Azure 가상 머신에서 Oracle Data Guard 구현

적용 대상: ✔️ Linux VM

Azure CLI를 사용하여 명령줄 또는 스크립트에서 Azure 리소스를 만들고 관리할 수 있습니다. 이 문서에서는 Azure CLI를 사용하여 Azure Marketplace 이미지에서 Oracle Database 19c 릴리스 3 데이터베이스를 배포하는 방법을 설명합니다. 그런 다음 이 문서는 Azure VM(가상 머신)에서 Data Guard를 설치하고 구성하는 방법을 단계별로 보여 줍니다. 환경을 보호하기 위해 공개적으로 액세스할 수 있는 포트는 없으며 Azure Bastion 인스턴스는 Oracle VM에 대한 액세스를 제공합니다.

시작하기 전에 Azure CLI가 설치되어 있는지 확인합니다. 자세한 내용은 Azure CLI 설치 가이드를 참조하세요.

환경 준비

가정

Oracle Data Guard를 설치하려면 동일한 가용성 집합에서 두 개의 Azure VM을 만들어야 합니다.

  • 기본 VM(OracleVM1)에 실행 중인 Oracle 인스턴스가 있습니다.
  • 대기 VM(OracleVM2)에는 Oracle 소프트웨어만 설치되어 있습니다.

VM을 만드는 데 사용하는 Azure Marketplace 이미지는 Oracle:oracle-database-19-3:oracle-database-19-0904:latest입니다.

참고 항목

EOL(수명 종료)에 도달했으며 Red Hat에서 더 이상 지원되지 않는 버전에 유의하세요. EOL 또는 그 이후의 업로드된 이미지는 합리적인 비즈니스 활동을 기반으로 지원됩니다. 자세한 내용은 제품 수명 주기에 대한 Red Hat 웹 페이지를 참조하세요.

Azure에 로그인

az login 명령을 사용하여 Azure 구독에 로그인하고 화면의 지시를 따릅니다.

az login

환경 변수 설정

환경에 대한 LOCATION 변수를 조정합니다.

LOCATION=eastus
RESOURCE_GROUP="Oracle-Lab"
VM_USERNAME="azureuser"
VM_PASSWORD="OracleLab123"
VNET_NAME="${RESOURCE_GROUP}VNet"

Azure Bastion 확장 사용

Azure CLI에 Azure Bastion 확장을 포함합니다.

az extension add \
  --name bastion

리소스 그룹 만들기

az group create 명령을 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

두 개의 서브넷이 있는 가상 네트워크 만들기

모든 컴퓨팅 서비스를 연결할 가상 네트워크를 만듭니다. 하나의 서브넷은 공용 액세스로부터 데이터베이스를 보호하는 데 도움이 되는 Azure 서비스인 Azure Bastion을 호스트합니다. 두 번째 서브넷은 두 개의 Oracle 데이터베이스 VM을 호스트합니다.

또한 모든 서비스가 공개적으로 노출되는 포트를 결정하기 위해 참조할 네트워크 보안 그룹을 만듭니다. 포트 443만 노출됩니다. Azure Bastion 서비스는 해당 서비스 인스턴스를 만들 때 이 포트를 자동으로 엽니다.

az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --name $VNET_NAME \
  --address-prefix "10.0.0.0/16"
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name AzureBastionSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.0.0/24
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --name OracleSubnet \
  --vnet-name $VNET_NAME \
  --address-prefixes 10.0.1.0/24
az network nsg create \
  --name OracleVM-NSG \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

가용성 집합 만들기

가용성 집합 만들기는 선택 사항이지만 만드는 것이 좋습니다. 자세한 내용은 Azure 가용성 집합에 대한 지침을 참조하세요.

az vm availability-set create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVMAvailabilitySet \
  --platform-fault-domain-count 2 \
  --platform-update-domain-count 2

두 개의 가상 머신 만들기

az vm create 명령을 사용하여 두 개의 VM을 만듭니다. 다음 예제에서는 OracleVM1OracleVM2라는 VM을 만듭니다.

OracleVM1 만들기(기본):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM1 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

OracleVM2 만들기(대기):

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name OracleVM2 \
  --availability-set OracleVMAvailabilitySet \
  --image Oracle:oracle-database-19-3:oracle-database-19-0904:latest \
  --size Standard_DS1_v2 \
  --authentication-type password \
  --admin-username $VM_USERNAME \
  --admin-password $VM_PASSWORD \
  --vnet-name $VNET_NAME \
  --subnet OracleSubnet \
  --nsg OracleVM-NSG \
  --os-disk-size-gb 32

Azure Bastion 서비스 인스턴스 만들기

Azure Bastion은 가상 네트워크 내에서 호스트되는 모든 서비스에 보안 터널을 제공합니다. Oracle 데이터베이스에 대한 직접 액세스를 제거하는 점프 상자 역할을 합니다.

Azure Bastion 서비스에 액세스할 공용 IP 주소를 만듭니다.

az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name OracleLabBastionPublicIP \
  --sku Standard

Azure Bastion 서비스 인스턴스를 만듭니다.

az network bastion create \
  --location $LOCATION \
  --name OracleLabBastion \
  --public-ip-address OracleLabBastionPublicIP \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --sku basic

가상 머신에 연결

이제 Azure Portal에서 Azure Bastion 서비스를 사용하여 OracleVM1에 액세스합니다.

창 위쪽의 검색 상자에 OracleVM1을 입력합니다. 결과 목록에서 OracleVM1을 선택하여 해당 VM을 엽니다.

Diagram showing the search box and the results for the first Oracle VM.

창 위쪽에서 연결>Bastion을 선택합니다.

Diagram showing the selections for connecting via Azure Bastion.

사용자 이름 및 암호를 입력한 다음, 연결 단추를 선택합니다.

Diagram showing how to enter credentials to connect via Azure Bastion.

Oracle 소프트웨어가 Azure Marketplace 이미지에서 이미 설치된 가상 머신에 대한 보안 연결로 새 탭이 열립니다.

Diagram showing a connection via Azure Bastion in a browser.

OracleVM1(기본) 구성

방화벽을 비활성화합니다.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

oracle 사용자 암호를 설정합니다.

sudo passwd oracle

azureuser 암호(OracleLab123)를 입력합니다.

oracle 사용자 암호를 OracleLab123으로 변경합니다. (다시 입력하여 확인합니다.)

OracleVM1(기본)에서 데이터베이스 만들기

Oracle 소프트웨어는 Azure Marketplace 이미지에 이미 설치되어 있으므로 다음 단계에서 데이터베이스를 설치합니다.

Oracle superuser로 전환합니다.

sudo su - oracle

데이터베이스를 만듭니다.

dbca -silent \
   -createDatabase \
   -datafileDestination /u01/app/oracle/cdb1 \
   -templateName General_Purpose.dbc \
   -gdbname cdb1 \
   -sid cdb1 \
   -responseFile NO_VALUE \
   -characterSet AL32UTF8 \
   -sysPassword OracleLab123 \
   -systemPassword OracleLab123 \
   -createAsContainerDatabase true \
   -numberOfPDBs 1 \
   -pdbName pdb1 \
   -pdbAdminPassword OracleLab123 \
   -databaseType MULTIPURPOSE \
   -automaticMemoryManagement false \
   -storageType FS

출력은 다음 응답과 유사하게 나타납니다.

Copying database files
1% complete
2% complete
8% complete
13% complete
19% complete
27% complete
Creating and starting Oracle instance
29% complete
32% complete
33% complete
34% complete
38% complete
42% complete
43% complete
45% complete
Completing Database Creation
48% complete
51% complete
53% complete
62% complete
70% complete
72% complete
Creating Pluggable Databases
78% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/cdb1/cdb1.log" for further details.

ORACLE_SIDORACLE_HOME 변수를 설정합니다.

$ ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
$ ORACLE_SID=cdb1; export ORACLE_SID

필요에 따라 ORACLE_HOMEORACLE_SID/home/oracle/.bashrc 파일에 추가하여 후속 로그인을 위해 이러한 설정을 저장할 수 있습니다.

# add oracle home
export ORACLE_HOME= /u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

Data Guard 구성

myVM1(기본)에서 보관 로그 모드 사용

로그 모드 사용:

sqlplus / as sysdba
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------
NOARCHIVELOG
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;

강제 로깅을 사용하도록 설정하고 하나 이상의 로그 파일이 있는지 확인합니다.

SQL> ALTER DATABASE FORCE LOGGING;
SQL> ALTER SYSTEM SWITCH LOGFILE;

대기 다시 실행 로그를 만들어 다음과 같이 주 데이터베이스 다시 실행 로그와 동일한 크기와 수량을 설정합니다.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo01.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo02.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo03.log') SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/cdb1/standby_redo04.log') SIZE 200M;

플래시백을 설정(복구가 훨씬 쉬워짐)하고 STANDBY_FILE_MANAGEMENTAUTO로 설정합니다. 그런 다음 SQL*Plus를 끝냅니다.

SQL> ALTER SYSTEM SET db_recovery_file_dest_size=50G scope=both sid='*';
SQL> ALTER SYSTEM SET db_recovery_file_dest='/u01/app/oracle/cdb1' scope=both sid='*';
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
SQL> EXIT;

OracleVM1(기본)에서 서비스 설정

$ORACLE_HOME/network/admin 폴더에 있는 tnsnames.ora 파일을 편집하거나 만듭니다.

다음 항목을 추가합니다.

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

$ORACLE_HOME/network/admin 폴더에 있는 listener.ora 파일을 편집하거나 만듭니다.

다음 항목을 추가합니다.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

Data Guard Broker를 사용하도록 설정합니다.

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> CREATE pfile FROM spfile;
SQL> EXIT;

매개 변수 파일을 대기 서버에 복사합니다.

scp -p $ORACLE_HOME/dbs/initcdb1.ora oracle@OracleVM2:$ORACLE_HOME/dbs/

수신기를 시작합니다.

 lsnrctl stop
 lsnrctl start

OracleVM2(대기)에서 서비스 설정

Azure Portal로 돌아갑니다. OracleVM2를 검색한 다음, 결과 목록에서 리소스를 선택합니다.

Screenshot of the search box and the results for the second Oracle VM.

창 위쪽에서 연결>Bastion을 선택합니다.

Diagram showing selections for connecting through Azure Bastion.

사용자 이름 및 암호를 입력한 다음, 연결 단추를 선택합니다.

Screenshot of entering username and password credentials to connect via Azure Bastion.

OracleVM2(대기)에서 방화벽 사용 안 함

sudo systemctl stop firewalld
sudo systemctl disable firewalld

OracleVM1에 대한 환경 구성

oracle 사용자 암호를 설정합니다.

sudo passwd oracle

azureuser 암호(OracleLab123)를 입력합니다.

oracle 사용자 암호를 OracleLab123으로 변경합니다. (다시 입력하여 확인합니다.)

oracle 슈퍼 사용자로 전환합니다.

$ sudo su – oracle

ORACLE_SIDORACLE_HOME 변수를 설정합니다.

ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=cdb1; export ORACLE_SID

필요에 따라 ORACLE_HOMEORACLE_SID/home/oracle/.bashrc 파일에 추가하여 후속 로그인을 위해 이러한 설정을 저장할 수 있습니다.

# add oracle home
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# add oracle sid
export ORACLE_SID=cdb1

$ORACLE_HOME/network/admin 폴더에 있는 tnsnames.ora 파일을 편집하거나 만듭니다.

다음 항목을 추가합니다.

cdb1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )
cdb1_stby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = cdb1)
    )
  )

$ORACLE_HOME/network/admin 폴더에 있는 listener.ora 파일을 편집하거나 만듭니다.

다음 항목을 추가합니다.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = OracleVM2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = cdb1_DGMGRL)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = cdb1)
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle

수신기를 시작합니다.

 lsnrctl stop
 lsnrctl start

OracleVM2(대기)로 데이터베이스 복원

다음 콘텐츠로 매개 변수 파일 /tmp/initcdb1_stby.ora를 만듭니다.

*.db_name='cdb1'

폴더를 만듭니다.

$ mkdir -p /u01/app/oracle/cdb1
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
$ mkdir -p /u01/app/oracle/oradata/cdb1/pdb1
$ mkdir -p /u01/app/oracle/fast_recovery_area/cdb1
$ mkdir -p /u01/app/oracle/admin/cdb1/adump

암호 파일을 만듭니다.

$ orapwd file=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwcdb1 password=OracleLab123 entries=10 force=y

OracleVM2에서 데이터베이스를 시작합니다.

 export ORACLE_SID=cdb1
 sqlplus / as sysdba
SQL> CREATE spfile from pfile;
SQL> STARTUP NOMOUNT PFILE='/tmp/initcdb1_stby.ora';
SQL> EXIT;

Oracle RMAN(Recovery Manager) 도구를 사용하여 데이터베이스를 복원합니다.

$ rman TARGET sys/OracleLab123@cdb1 AUXILIARY sys/OracleLab123@cdb1_stby

RMAN에서 다음 명령을 실행합니다.

DUPLICATE TARGET DATABASE
  FOR STANDBY
  FROM ACTIVE DATABASE
  DORECOVER
  SPFILE
    SET db_unique_name='CDB1_STBY' COMMENT 'Is standby'
  NOFILENAMECHECK;

명령이 완료되면 다음과 유사한 메시지가 표시됩니다.

media recovery complete, elapsed time: 00:00:00
Finished recover at 29-JUN-22
Finished Duplicate Db at 29-JUN-22

RMAN을 끝냅니다.

RMAN> EXIT;

Data Guard Broker를 사용하도록 설정합니다.

sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
SQL> EXIT;

OracleVM1(기본)에서 Data Guard Broker 구성

Data Guard Manager를 시작하고 SYS 및 암호를 사용하여 로그인합니다. (OS 인증을 사용하지 마세요.)

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS cdb1 CONNECT IDENTIFIER IS cdb1;
Configuration "my_dg_config" created with primary database "cdb1"
DGMGRL> ADD DATABASE cdb1_stby AS CONNECT IDENTIFIER IS cdb1_stby MAINTAINED AS PHYSICAL;
Database "cdb1_stby" added
DGMGRL> ENABLE CONFIGURATION;
Enabled.

구성을 검토합니다.

DGMGRL> SHOW CONFIGURATION;
Configuration - my_dg_config
  Protection Mode: MaxPerformance
  Members:
  cdb1      - Primary database
  cdb1_stby - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS   (status updated 26 seconds ago)

Oracle Data Guard 설정이 완료되었습니다. 다음 섹션에서는 연결 및 전환을 테스트하는 방법을 보여 줍니다.

클라이언트 컴퓨터에서 데이터베이스 연결

클라이언트 컴퓨터에서 tnsnames.ora 파일을 업데이트합니다. 이 파일은 일반적으로 $ORACLE_HOME/network/admin에 있습니다.

cdb1=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM1)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1)
    )
  )
cdb1_stby=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=OracleVM2)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=cdb1_stby)
    )
  )

SQL*Plus를 시작합니다.

$ sqlplus sys/OraPasswd1@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

Data Guard 구성 테스트

OracleVM1(기본)에서 데이터베이스 전환

기본에서 대기로 전환합니다(cdb1에서 cdb1_stby로).

$ dgmgrl sys/OracleLab123@cdb1
DGMGRL for Linux: Version 19.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1_stby;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1_stby"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1_stby" is opening...
Operation requires start up of instance "cdb1" on database "cdb1"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1_stby"
DGMGRL>

이제 대기 데이터베이스에 연결할 수 있습니다. SQL*Plus를 시작합니다.

$ sqlplus sys/OracleLab123@cdb1_stby
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

OracleVM2(대기)에서 데이터베이스 전환

전환하려면 OracleVM2에서 다음 코드를 실행합니다.

$ dgmgrl sys/OracleLab123@cdb1_stby
DGMGRL for Linux: Version 190.0.0.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> SWITCHOVER TO cdb1;
Performing switchover NOW, please wait...
Operation requires a connection to instance "cdb1" on database "cdb1"
Connecting to instance "cdb1"...
Connected as SYSDBA.
New primary database "cdb1" is opening...
Operation requires start up of instance "cdb1" on database "cdb1_stby"
Starting instance "cdb1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "cdb1"

다시 한번, 주 데이터베이스에 연결할 수 있어야 합니다. SQL*Plus를 시작합니다.

$ sqlplus sys/OracleLab123@cdb1
SQL*Plus: Release 19.0.0.0 Production on Wed May 10 14:18:31 2022
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL>

Oracle Linux에서 Data Guard의 설치 및 구성을 완료했습니다.

가상 머신 삭제

더 이상 VM이 필요하지 않은 경우 다음 명령을 사용하여 리소스 그룹, VM 및 관련된 모든 리소스를 제거할 수 있습니다.

az group delete --name $RESOURCE_GROUP

다음 단계