arrow_back

StatefulSet를 사용하여 Kubernetes에서 MongoDB 데이터베이스 실행하기

가입 로그인
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

StatefulSet를 사용하여 Kubernetes에서 MongoDB 데이터베이스 실행하기

Lab 1시간 universal_currency_alt 크레딧 5개 show_chart 중급
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

이 실습은 파트너인 MongoDB와 공동 개발한 것으로 계정 프로필에서 제품 업데이트, 공지사항, 혜택을 수신하는 데 동의하신 경우 귀하의 개인 정보가 실습 스폰서인 MongoDB에 공유될 수 있습니다.

GSP022

Google Cloud 사용자 주도형 실습

개요

Kubernetes는 오픈소스 컨테이너 조정 도구로 컨테이너화된 애플리케이션을 실행하면서 생기는 복잡한 문제를 해결하는 데 도움이 됩니다. 다양한 맞춤설정과 통합 옵션을 제공하는 Google Cloud 컴퓨팅 서비스인 Kubernetes Engine을 사용하여 Kubernetes 애플리케이션을 실행할 수 있습니다. 이 실습에서는 StatefulSet를 사용하여 MongoDB 데이터베이스를 설정하는 방법을 알아보며 Kubernetes를 실제로 이용해 봅니다. 스테이트풀(Stateful) 애플리케이션(데이터베이스)을 스테이트리스(Stateless) 서비스(컨테이너)에서 실행한다는 것이 모순처럼 들릴 수도 있습니다. 하지만 이 실습을 통해 그렇지 않음을 금방 알게 될 것입니다. 실제로 몇 가지 오픈소스 도구를 사용해 보면 Kubernetes와 스테이트리스 서비스가 어떻게 연동될 수 있는지 알 수 있습니다.

과정 내용

이 실습에서는 다음에 관해 학습합니다.

  • Kubernetes 클러스터, 헤드리스 서비스, StatefulSet를 배포하는 방법
  • Kubernetes 클러스터를 MongoDB 복제본 세트에 연결하는 방법
  • MongoDB 복제본 세트 인스턴스를 축소 및 확장하는 방법
  • 환경을 정리하고 위의 서비스를 종료하는 방법

기본 요건

이 실습은 고급 레벨 실습입니다. Kubernetes 또는 컨테이너화된 애플리케이션에 관한 기본 지식을 갖추고 실습에 참여하는 것이 좋습니다. Google Cloud Shell/SDK 및 MongoDB를 사용해 본 경험도 있으면 좋습니다. 이러한 서비스에 관해 더 빨리 습득하려면 다음 실습을 확인하세요.

준비가 됐으면 아래로 스크롤하여 실습 환경을 설정하세요.

설정

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.

    • Google 콘솔 열기 버튼
    • 남은 시간
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보
    • 필요한 경우 실습 진행을 위한 기타 정보
  2. Google 콘솔 열기를 클릭합니다. 실습에서 리소스가 가동된 후 로그인 페이지가 표시된 다른 탭이 열립니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 실습 세부정보 패널에서 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다. 다음을 클릭합니다.

  4. 실습 세부정보 패널에서 비밀번호를 복사하여 시작 대화상자에 붙여넣습니다. 다음을 클릭합니다.

    중요: 왼쪽 패널에 표시된 사용자 인증 정보를 사용해야 합니다. Google Cloud Skills Boost 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  5. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의합니다.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
    • 무료 평가판을 신청하지 않습니다.

잠시 후 Cloud 콘솔이 이 탭에서 열립니다.

참고: 왼쪽 상단에 있는 탐색 메뉴를 클릭하면 Google Cloud 제품 및 서비스 목록이 있는 메뉴를 볼 수 있습니다. 탐색 메뉴 아이콘

Cloud Shell 활성화

Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.

  1. Google Cloud 콘솔 상단에서 Cloud Shell 활성화 Cloud Shell 활성화 아이콘를 클릭합니다.

연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.

  1. (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
gcloud auth list
  1. 승인을 클릭합니다.

  2. 다음과 비슷한 결과가 출력됩니다.

출력:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
gcloud config list project

출력:

[core] project = <project_ID>

출력 예시:

[core] project = qwiklabs-gcp-44776a13dea667a6 참고: gcloud 전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.

작업 1. 컴퓨팅 영역 설정

이 실습에서는 gcloud 명령줄 도구를 사용하여 서비스를 프로비저닝합니다.

  • 실습에 사용할 Kubernetes 클러스터를 생성하려면 먼저 클러스터 내의 가상 머신이 모두 동일한 리전에 생성되도록 컴퓨팅 영역을 설정해야 합니다. gcloud config set 명령어를 사용하면 컴퓨팅 영역을 설정할 수 있습니다. Cloud Shell에서 다음을 실행하여 영역을 (으)로 설정합니다.
gcloud config set compute/zone {{{project_0.default_zone | ZONE}}} 참고: 리전 및 영역 가이드에서 리전 및 영역에 관해 자세히 알아보세요.

작업 2. 새 클러스터 만들기

영역을 설정했으므로 이제 새 컨테이너 클러스터를 만들겠습니다.

  • 다음 명령어를 실행하여 이름이 hello-world인 클러스터를 인스턴스화합니다.
gcloud container clusters create hello-world --num-nodes=2

이 명령어는 2개의 노드 또는 가상 머신이 있는 새 클러스터를 만듭니다. 추가 플래그를 통해 이 명령어를 구성하여 노드 수, 기본 권한 및 기타 변수를 변경할 수 있습니다. gcloud container clusters create 참조 문서에서 자세히 알아보세요.

클러스터를 시작하는 데 몇 분 정도 걸릴 수 있습니다. 실행되고 나면 다음과 비슷한 결과가 표시됩니다.

NAME Location MATER_VERSION MASTER_IP ... hello-world {{{project_0.default_zone | ZONE}}} 1.9.7-gke.3 35.184.131.251 ...

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

새 클러스터 만들기

작업 3. 설정

클러스터가 실행되면 클러스터를 MongoDB에 통합합니다. 여기에서는 복제본 세트를 사용하여 데이터의 가용성을 높이고 데이터가 중복되도록 하겠습니다. 이는 프로덕션 애플리케이션을 실행하는 데 필요한 전제조건입니다.

설정을 완료하려면 다음을 진행해야 합니다.

  1. 다음 명령어를 실행하여 GitHub 저장소에서 MongoDB/Kubernetes 복제본 세트를 클론합니다.
gsutil -m cp -r gs://spls/gsp022/mongo-k8s-sidecar .
  1. 클론이 완료되면 다음 명령어를 사용하여 StatefulSet 디렉토리로 이동합니다.
cd ./mongo-k8s-sidecar/example/StatefulSet/

파일이 다운로드되었고 올바른 디렉토리에 있음을 확인했으면 Kubernetes StorageClass를 만들겠습니다.

StorageClass 만들기

StorageClass는 데이터베이스 노드에 사용할 스토리지의 종류를 Kubernetes에 알립니다. Google Cloud에서는 SSD, 하드 디스크 등 다양한 스토리지 옵션을 사용할 수 있습니다.

ls 명령어를 실행하여 StatefulSet 디렉토리 내부를 확인해 보면 Azure와 Google Cloud의 SSD 및 HDD 구성 파일이 있습니다.

  1. 다음 명령어를 실행하여 googlecloud_ssd.yaml 파일을 살펴봅니다.
cat googlecloud_ssd.yaml

출력:

kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: fast provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd

위의 구성을 통해 SSD 볼륨에 백업되는 'fast'라는 이름의 새 StorageClass를 만듭니다.

  1. 다음 명령어를 실행하여 StorageClass를 배포합니다.
kubectl apply -f googlecloud_ssd.yaml

StorageClass가 구성되었으므로 이제 StatefulSet가 자동 생성될 볼륨을 요청할 수 있습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

StorageClass 만들기

작업 4. 헤드리스 서비스 및 StatefulSet 배포

파일 찾기 및 검사하기

  1. 헤드리스 서비스 및 StatefulSet가 무엇인지에 관해 본격적으로 알아보기 전에 이 둘을 저장하고 있는 구성 파일(mongo-statefulset.yaml)을 열어 보겠습니다.
nano mongo-statefulset.yaml

다음과 같은 결과가 표시됩니다(헤드리스 서비스 및 StatefulSet 콘텐츠를 가리키는 포인터는 제외).

apiVersion: v1 <----------- Headless Service configuration kind: Service metadata: name: mongo labels: name: mongo spec: ports: - port: 27017 targetPort: 27017 clusterIP: None selector: role: mongo --- apiVersion: apps/v1 <------- StatefulSet configuration kind: StatefulSet metadata: name: mongo spec: serviceName: "mongo" replicas: 3 selector: matchLabels: role: mongo template: metadata: labels: role: mongo environment: test spec: terminationGracePeriodSeconds: 10 containers: - name: mongo image: mongo command: - mongod - "--replSet" - rs0 - "--smallfiles" - "--noprealloc" ports: - containerPort: 27017 volumeMounts: - name: mongo-persistent-storage mountPath: /data/db - name: mongo-sidecar image: cvallance/mongo-k8s-sidecar env: - name: MONGO_SIDECAR_POD_LABELS value: "role=mongo,environment=test" volumeClaimTemplates: - metadata: name: mongo-persistent-storage annotations: volume.beta.kubernetes.io/storage-class: "fast" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 50Gi
  1. 파일에서 다음 플래그를 삭제합니다(49줄 및 50줄).
- "--smallfiles" - "--noprealloc"
  1. 파일의 이 섹션이 다음과 같이 표시되는지 확인합니다.
containers: - name: mongo image: mongo command: - mongod - "--replSet" - rs0 ports: - containerPort: 27017 volumeMounts: - name: mongo-persistent-storage mountPath: /data/db
  1. Ctrl+X > Y > Enter 키를 눌러 nano 편집기를 닫습니다.

헤드리스 서비스: 개요

mongo-statefulset.yaml의 첫 번째 섹션은 headless service를 나타냅니다. Kubernetes 용어에서 서비스는 특정 포드에 액세스하기 위한 정책이나 규칙을 나타냅니다. 한 마디로 헤드리스 서비스는 부하 분산을 규정하지 않는 서비스입니다. 이 서비스는 StatefulSet와 결합하여 포드에 액세스하기 위한 개별 DNS를 제공하며 그렇기 때문에 모든 MongoDB 노드에 개별적으로 연결할 방법이 됩니다. yaml 파일에서 clusterIP 필드가 None으로 설정되어 있음을 확인하여 헤드리스 서비스임을 알 수 있습니다.

StatefulSet: 개요

StatefulSet 구성은 mongo-statefulset.yaml의 두 번째 섹션입니다. 애플리케이션에서 가장 중요한 부분으로, MongoDB를 실행하는 워크로드이자 Kubernetes 리소스를 조정하는 부분입니다. yaml 파일을 참조하면 첫 번째 섹션에서 StatefulSet 개체에 관해 설명하고 있음을 확인할 수 있습니다. 다음으로 메타데이터 섹션으로 이동하면 라벨 및 복제본 수가 지정되어 있음을 알 수 있습니다.

그 다음은 포드 사양입니다. terminationGracePeriodSeconds는 복제본의 수를 줄일 때 포드를 정상적으로 종료하기 위해 사용합니다. 그 다음에는 두 컨테이너의 구성이 표시됩니다. 첫 번째 컨테이너는 복제본 세트 이름을 구성하는 명령줄 플래그를 통해 MongoDB를 실행하고 MongoDB가 데이터를 저장하는 위치인 /data/db에 영구 저장소 볼륨을 마운트합니다. 두 번째 컨테이너는 사이드카를 실행합니다. 이 사이드카 컨테이너는 MongoDB 복제본 세트를 자동으로 구성합니다. 앞서 언급한 것처럼 '사이드카'는 주 컨테이너가 작업하는 데 도움을 주는 보조 컨테이너입니다.

마지막으로 volumeClaimTemplates가 있습니다. 이는 전에 생성한 StorageClass를 호출하여 볼륨을 프로비저닝하며 MongoDB 복제본당 100GB 디스크를 프로비저닝합니다.

헤드리스 서비스 및 StatefulSet 배포

헤드리스 서비스와 StatefulSet가 무엇인지에 관해 기본적인 내용을 이해했으니 이제 이를 배포해 보겠습니다.

  • 이 두 가지는 mongo-statefulset.yaml에 패키징되어 있으므로 둘 다 다음 명령어로 실행할 수 있습니다.
kubectl apply -f mongo-statefulset.yaml

다음과 같은 출력이 표시됩니다.

service/mongo created statefulset.apps/mongo created

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

헤드리스 서비스 및 StatefulSet 배포하기

작업 5. MongoDB 복제본 세트에 연결

클러스터를 실행하고 복제본 세트를 배포했으므로 이제 복제본 세트에 연결할 수 있습니다.

MongoDB 복제본 세트 배포가 완료될 때까지 대기하기

Kubernetes StatefulSet은 각 포드를 순차적으로 배포합니다. 이를 위해 MongoDB 복제본 세트 멤버가 완전히 부팅되고 백업 디스크를 만들 때까지 대기한 후 다음 멤버를 시작합니다.

  • 다음 명령어를 실행하여 세 멤버가 모두 작동 중인지 확인합니다.
kubectl get statefulset

결과: 세 멤버가 모두 작동 중입니다.

NAME READY AGE mongo 3/3 103s

MongoDB 복제본 세트 시작 및 보기

이제 클러스터에 3개의 포드가 있어야 합니다. 이 포드는 MongoDB 복제본 세트의 세 노드에 해당합니다.

  1. 확인하려면 다음 명령어를 실행합니다.
kubectl get pods

출력:

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 3m mongo-1 2/2 Running 0 3m mongo-2 2/2 Running 0 3m
  1. 세 멤버가 모두 생성될 때까지 기다린 후 다음 단계를 진행합니다.

  2. 첫 번째 복제본 세트 멤버에 연결합니다.

kubectl exec -ti mongo-0 -- mongosh

이제 REPL 환경이 MongoDB에 연결되었습니다.

  1. rs.initiate() 명령어를 실행하여 기본 구성을 사용해 복제본 세트를 인스턴스화하겠습니다.
rs.initiate()
  1. 복제본 세트 구성을 인쇄합니다. rs.conf() 명령어를 실행하면 됩니다.
rs.conf()

복제본 세트 rs0의 현재 멤버에 관한 세부정보가 출력됩니다. 이 실습에서는 하나의 멤버만 확인됩니다. 모든 멤버에 관한 세부정보를 얻으려면 nodeport부하 분산기 같은 추가 서비스를 통해 복제본 세트를 노출해야 합니다.

rs0:OTHER> rs.conf() { "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "localhost:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5c526b6501fa2d29fc65c48c") } }
  1. 'exit'를 입력하고 Enter 키를 눌러 REPL을 종료합니다.

작업 6. MongoDB 복제본 세트 확장

Kubernetes 및 StatefulSet의 큰 장점은 단일 명령어를 사용해 MongoDB 복제본의 수를 늘리고 줄일 수 있다는 점입니다.

  1. 복제본 세트 멤버의 개수를 3개에서 5개로 늘리려면 다음 명령어를 실행합니다.
kubectl scale --replicas=5 statefulset mongo

몇 분 안에 MongoDB 포드가 5개로 늘어납니다.

  1. 이를 확인하려면 다음 명령어를 실행합니다.
kubectl get pods

다음과 비슷한 결과가 출력됩니다.

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 41m mongo-1 2/2 Running 0 39m mongo-2 2/2 Running 0 37m mongo-3 2/2 Running 0 4m mongo-4 2/2 Running 0 2m
  1. 복제본 세트 멤버의 수를 5개에서 다시 3개로 줄이려면 다음 명령어를 실행합니다.
kubectl scale --replicas=3 statefulset mongo

몇 초 안에 MongoDB 포드가 3개로 줄어듭니다.

  1. 확인하려면 다음 명령어를 실행합니다.
kubectl get pods

다음과 비슷한 결과가 출력됩니다.

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 41m mongo-1 2/2 Running 0 39m mongo-2 2/2 Running 0 37m

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

MongoDB 복제본 세트 확장하기

작업 7. MongoDB 복제본 세트 사용

헤드리스 서비스가 지원하는 StatefulSet의 각 포드에는 안정된 DNS 이름이 있습니다. 템플릿은 <pod-name>.<service-name>의 형식을 따릅니다.

즉, MongoDB 복제본 세트의 DNS 이름은 다음과 같습니다.

mongo-0.mongo mongo-1.mongo mongo-2.mongo

이러한 이름은 앱의 연결 문자열 URI에 바로 사용할 수 있습니다.

데이터베이스의 사용은 이 실습의 범위에 포함되지 않지만, 데이터베이스를 사용하는 경우 연결 문자열 URI는 다음과 같습니다.

"mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo:27017/dbname_?"

작업 8. 삭제

실습 환경에서 작업하고 있기 때문에 실습을 끝내면 사용자를 대신하여 모든 리소스와 프로젝트가 삭제 및 폐기됩니다. 하지만 사용자의 환경에서 비용을 절감하고 클라우드를 효율적으로 사용할 수 있도록 리소스를 직접 삭제하는 방법을 소개하고자 합니다.

배포된 리소스를 삭제하려면 다음 명령을 실행하여 StatefulSet, 헤드리스 서비스, 프로비저닝된 볼륨을 삭제하세요.

  1. StatefulSet 삭제:
kubectl delete statefulset mongo
  1. 서비스 삭제:
kubectl delete svc mongo
  1. 볼륨 삭제:
kubectl delete pvc -l role=mongo
  1. 마지막으로, 테스트 클러스터 삭제:
gcloud container clusters delete "hello-world"
  1. Y 키를 누른 다음 Enter 키를 눌러 계속해서 테스트 클러스터를 삭제합니다.

수고하셨습니다

Kubernetes Engine은 Google Cloud에서 컨테이너를 실행하는 강력하고 유연한 방법을 제공합니다. StatefulSet를 사용하면 Kubernetes에서 데이터베이스와 같은 스테이트풀(Stateful) 워크로드를 실행할 수 있습니다. 학습한 내용은 다음과 같습니다.

  • Kubernetes StatefulSet를 사용하여 MongoDB 복제본 세트 만들기
  • MongoDB 복제본 세트에 연결하기
  • 복제본 세트 확장하기

퀘스트 완료하기

이 사용자 주도형 실습은 Cloud Architecture 퀘스트의 일부입니다. 퀘스트는 연관성이 있는 여러 실습을 하나의 학습 과정으로 구성한 것입니다. 퀘스트를 완료하면 배지를 얻고 수료를 인증할 수 있습니다. 배지를 공개하고 온라인 이력서 또는 소셜 미디어 계정에 연결할 수 있습니다. 이 실습을 포함한 퀘스트에 등록하여 즉시 수료 크레딧을 받으세요. 참여할 수 있는 모든 퀘스트는 Google Cloud Skills Boost 카탈로그를 참조하세요.

다음 실습 참여하기

다음 실습을 활용하여 퀘스트를 계속 진행하거나 다음 추천 항목을 확인하세요.

다음 단계/자세히 알아보기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2023년 10월 9일

실습 최종 테스트: 2023년 10월 9일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.