이 페이지에서는 Artifact Registry 가상 저장소를 만드는 방법을 설명합니다.
가상 저장소는 하나 이상의 업스트림 저장소에서 동일한 형식으로 아티팩트를 다운로드, 설치, 배포하기 위한 단일 액세스 포인트로 사용됩니다. 업스트림 저장소는 Artifact Registry 표준 또는 원격 저장소일 수 있습니다.
다른 저장소 모드는 다음과 같습니다.
- 표준: 기본 저장소 모드입니다. 비공개 패키지와 같은 아티팩트를 표준 저장소에 직접 업로드하거나 게시합니다. 개별 표준 저장소에서 직접 다운로드할 수도 있지만 가상 저장소를 사용해서 저장소 그룹에 액세스하면 도구 구성이 간소화됩니다.
- 원격(언어 패키지 저장소만): Maven Central 또는 PyPI와 같은 공개 저장소의 아티팩트에 대한 풀스루 캐시입니다. 외부 종속 항목을 더 세부적으로 제어할 수 있도록 공개 저장소에 대한 프록시로 작동합니다.
가상 저장소의 작동 방식에 대한 자세한 내용은 가상 저장소 개요를 참조하세요.
시작하기 전에
Artifact Registry API 사용 설정 및 최신 버전의 Google Cloud CLI 설치를 포함하여 Artifact Registry를 사용 설정합니다.
필요한 역할
저장소를 관리하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.
-
가상 저장소를 만들고 개별 저장소에 대한 액세스 권한 부여: Google Cloud 프로젝트의 Artifact Registry 관리자(
roles/artifactregistry.admin
) - 프로젝트 수준에서 저장소에 대한 액세스 권한 부여: Google Cloud 프로젝트의 프로젝트 IAM 관리자(
roles/resourcemanager.projectIamAdmin
) - 폴더 수준에서 저장소에 대한 액세스 권한 부여: 폴더의 폴더 관리자(
roles/resourcemanager.folderAdmin
) - 조직 수준에서 저장소에 대한 액세스 권한 부여: Google Cloud 조직의 조직 관리자(
roles/resourcemanager.organizationAdmin
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
업스트림 저장소가 다른 프로젝트에 있으면 업스트림 저장소가 있는 프로젝트의 관리자에게 해당 저장소에 대한 액세스를 관리할 수 있는 권한이 있어야 합니다.
업스트림 저장소 만들기
가상 저장소를 설정하려면 먼저 가상 저장소에 제공하려는 업스트림 저장소를 만듭니다.
가상 저장소를 만들려는 것과 동일한 Google Cloud 리전에 업스트림 저장소를 만듭니다.
가상 저장소는 Artifact Registry 서비스 에이전트를 사용하여 업스트림 저장소에 인증을 수행합니다. 업스트림 저장소에 대해 읽기 액세스를 서비스 에이전트에 부여해야 합니다.
프로젝트 수준에서 Artifact Registry 서비스 에이전트에 대해 읽기 역할을 Artifact Registry에 부여할 수 있으므로, 개별 업스트림 저장소에 대해 액세스를 부여할 필요가 없습니다.
업스트림 저장소가 있는 각 프로젝트에서 다음 명령어를 실행합니다.
gcloud projects add-iam-policy-binding UPSTREAM_PROJECT_ID \ --member serviceAccount:service-VIRTUAL-REPO-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \ --role roles/artifactregistry.reader
장소
- UPSTREAM_PROJECT_ID는 업스트림 저장소가 있는 Google Cloud 프로젝트의 ID입니다.
- VIRTUAL_REPO_PROJECT_NUMBER는 가상 저장소에 대한 Google Cloud 프로젝트의 프로젝트 번호입니다.
또는 서비스 수준에 보다 좁은 범위의 역할을 부여하려면 커스텀 역할에
artifactregistry.repositories.readViaVirtualRepository
권한을 추가한 후 서비스 에이전트에 이 역할을 부여합니다.권한 부여에 대한 자세한 내용은 액세스 제어 문서를 참조하세요.
가상 저장소 만들기
저장소를 만들 때는 다음 설정을 구성해야 하며 이 설정은 저장소가 생성된 후에는 변경할 수 없습니다.
- 아티팩트 형식
- 선택한 형식으로 여러 모드를 사용할 수 있는 경우 저장소 모드
- 저장소 위치
- Google 소유 및 Google 관리 키 또는 고객 관리 암호화 키로 암호화. Artifact Registry는 기본적으로 Google 소유 및 Google 관리 키를 사용합니다.
Artifact Registry는 CMEK가 리소스를 암호화하도록 요구하거나 CMEK 보호에 사용할 수 있는 Cloud KMS 키를 제한하는 조직 정책 제약조건을 적용합니다.
Google Cloud 콘솔을 사용하여 원격 저장소 만들기
Google Cloud 콘솔에서 저장소 페이지를 엽니다.
저장소 만들기를 클릭합니다.
저장소 이름을 지정합니다. 프로젝트의 저장소 위치마다 저장소 이름이 고유해야 합니다.
저장소 형식을 선택합니다.
저장소 모드에서 가상을 선택합니다.
가상 저장소 업스트림에서 업스트림 추가를 클릭하여 업스트림 저장소를 추가합니다.
- 업스트림 저장소는 표준, 원격 또는 가상 저장소일 수 있습니다.
- 업스트림 저장소는 가상 저장소와 동일한 위치에 있어야 하지만 다른 Google Cloud 프로젝트에 있을 수 있습니다.
- 업스트림 저장소는 가상 저장소와 동일한 아티팩트 형식이어야 합니다.
각 업스트림 저장소의 우선순위와 정책 이름을 지정합니다. 우선순위가 높은 값이 낮은 값보다 우선 적용됩니다. 기존 값 사이에 우선순위가 있는 업스트림 저장소를 유연하게 추가할 수 있도록 우선순위 값 사이에 공간을 남겨둡니다.
위치 유형에서 저장소의 위치를 선택합니다.
위치 유형(리전 또는 멀티 리전)을 선택합니다. 선택 사항이 반영되도록 위치 목록이 변경됩니다.
리전 또는 멀티 리전 목록에서 위치를 선택합니다.
위치 유형 및 지원되는 위치에 대한 자세한 내용은 저장소 위치를 참조하세요.
저장소에 대한 설명을 추가합니다. 설명은 저장소의 용도와 저장소에 포함된 아티팩트의 종류를 식별하는 데 도움이 됩니다.
저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.
라벨을 사용하여 저장소를 구성하려면 라벨 추가를 클릭하고 라벨의 키-값 쌍을 입력합니다. 저장소를 만든 후 라벨을 추가, 수정 또는 삭제할 수 있습니다.
암호화 섹션에서 저장소의 암호화 메커니즘을 선택합니다.
- Google 관리 키 - Google 소유 및 Google 관리 키로 저장소 콘텐츠를 암호화합니다.
- 고객 관리 키 - Cloud Key Management Service를 통해 제어하는 키로 저장소 콘텐츠를 암호화합니다. 키 설정 안내는 저장소의 CMEK 설정을 참조하세요.
만들기를 클릭합니다.
Artifact Registry는 저장소를 만들고 이를 저장소 목록에 추가합니다.
저장소를 만든 후:
- 저장소에 대한 액세스 권한을 부여합니다.
저장소 인증을 위해 Docker, 패키지 관리자, 기타 타사 클라이언트를 구성합니다.
gcloud CLI를 사용하여 가상 저장소 만들기
가상 저장소를 만들려면 정책 파일에 업스트림 저장소를 정의한 후 정책 파일을 사용하여 저장소를 만듭니다.
다음 설정에 따라 JSON 형식으로 업스트림 정책 파일을 만듭니다.
[{ "id" : "POLICY_ID", "repository" : "UPSTREAM_REPOSITORY_RESOURCE_NAME", "priority" : PRIORITY }, {...}]
POLICY_ID
는 정책의 이름입니다. 정책의 각 업스트림 저장소에는 고유한 정책 ID가 있어야 합니다.UPSTREAM_REPO_RESOURCE_NAME
은 다음 형식의 업스트림 저장소 이름입니다.projects/PROJECT_ID/locations/LOCATION/repositories/REPOSITORY
- 업스트림 저장소는 표준, 원격 또는 가상 저장소일 수 있습니다.
- 업스트림 저장소는 가상 저장소와 동일한 위치에 있어야 하지만 다른 Google Cloud 프로젝트에 있을 수 있습니다.
- 업스트림 저장소는 가상 저장소와 동일한 아티팩트 형식이어야 합니다.
PRIORITY
는 업스트림 저장소의 우선순위를 나타내는 정수입니다. 우선순위가 높은 값이 낮은 값보다 우선 적용됩니다.
다음 예시는 4개의 업스트림 저장소가 있는
policies.json
이라는 정책 파일을 보여줍니다.upstream1
의priority
값이 가장 높으므로, Artifact Registry가 이를 먼저 검색합니다.upstream-test
는priority
값이 가장 낮으므로 Artifact Registry가 이를 마지막으로 검색합니다.upstream2
와upstream3
의 우선순위는 동일합니다. 저장소의 요청 패키지 우선순위가 같으면 Artifact Registry는 둘 중 하나의 저장소에서 패키지를 제공할 수 있습니다.[{ "id" : "upstream1", "repository" : "projects/myproject/locations/us-west1/repositories/python-repo1", "priority" : 100 }, { "id" : "upstream2", "repository" : "projects/myproject/locations/us-west1/repositories/python-repo2", "priority" : 80 }, { "id" : "upstream3", "repository" : "projects/myproject/locations/us-west1/repositories/python-repo2", "priority" : 80 }, { "id" : "upstream-test", "repository" : "projects/myproject/locations/us-west1/repositories/python-test-repo", "priority" : 20 }]
이 예시에서는 우선순위 값 사이에 공간을 남겨둡니다. 이러한 공간을 이용하여 기존 값 사이에 우선순위가 있는 업스트림 저장소를 유연하게 추가할 수 있습니다. 예를 들어 우선순위가
70
인upstream-3
저장소를 추가하여 Artifact Registry가upstream-test
이전에 이를 검색하도록 할 수 있습니다.나중에 업스트림 저장소 설정을 변경하고 이전 변경 내역을 추적하기 위해 재사용할 수 있도록 소스 제어 시스템에 업스트림 정책 파일을 저장하는 것이 좋습니다.
업스트림 정책 파일이 있는 디렉터리에서 다음 명령어를 실행하여 가상 저장소를 만듭니다.
gcloud artifacts repositories create VIRTUAL-REPOSITORY-NAME \ --project=PROJECT_ID \ --repository-format=FORMAT \ --mode=virtual-repository \ --location=LOCATION \ --description="DESCRIPTION" \ --upstream-policy-file=UPSTREAM_POLICY_FILE
다음을 바꿉니다.
VIRTUAL-REPOSITORY-NAME
은 가상 저장소의 이름입니다.PROJECT_ID
는 가상 저장소를 만들 프로젝트의 ID입니다. 이 플래그를 생략하면 현재 프로젝트 또는 기본 프로젝트가 사용됩니다.FORMAT
은 저장소의 형식입니다. 사용할 수 있는 값은 다음과 같습니다.apt
(비공개 미리보기)docker
maven
npm
python
yum
(비공개 미리보기)
LOCATION
은 저장소의 리전 또는 멀티 리전 위치입니다. 기본값을 설정하는 경우 이 플래그를 생략할 수 있습니다. 지원되는 위치 목록을 보려면 다음 명령어를 실행합니다.gcloud artifacts locations list
DESCRIPTION
은 선택사항으로, 저장소의 설명입니다. 저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.UPSTREAM_POLICY_FILE
은 업스트림 파일의 경로입니다.
예를 들어 다음 명령어는
policies.json
의 설정을 사용해서us-west1
리전에 있는 Python 패키지에 대해virtual-repo
라는 가상 저장소를 만듭니다.gcloud artifacts repositories create virtual-repo \ --repository-format=python \ --mode=virtual-repository \ --location=us-west1 \ --description="Python virtual repository" \ --upstream-policy-file=policies.json
Artifact Registry는 가상 저장소를 만듭니다.
Terraform을 사용하여 가상 저장소 만들기
google_artifact_registry_repository 리소스를 사용하여 저장소를 만듭니다.
terraform-provider-google
버전 5.0.0
이상이 필요합니다.
Google Cloud에서 Terraform을 처음 사용하는 경우 HashiCorp 웹사이트의 시작하기 - Google Cloud 페이지를 참조하세요.
다음 예시에서는 제공업체, Terraform 리소스 이름이 my-repo
인 가상 저장소, Terraform 리소스 이름이 my-repo-upstream
인 업스트림 저장소를 정의합니다.
Docker
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
location = "UPSTREAM_LOCATION"
repository_id = "UPSTREAM_REPOSITORY_ID"
description = "UPSTREAM_REPOSITORY_DESCRIPTION"
format = "docker"
}
resource "google_artifact_registry_repository" "my-repo" {
depends_on = []
location = "LOCATION"
repository_id = "REPOSITORY_ID"
description = "VIRTUAL_REPOSITORY_DESCRIPTION"
format = "docker"
kms_key_name = "KEY"
mode = "VIRTUAL_REPOSITORY"
virtual_repository_config {
upstream_policies {
id = "UPSTREAM_REPOSITORY_ID"
repository = google_artifact_registry_repository.my-repo-upstream.id
priority = PRIORITY
}
}
}
장소
- PROJECT-ID는 Google Cloud 프로젝트 ID입니다.
- UPSTREAM_LOCATION은 업스트림 저장소 위치입니다. 가상 저장소와 업스트림은 동일한 리전이나 멀티 리전에 있어야 합니다.
- UPSTREAM_REPOSITORY_ID는 업스트림 저장소 ID입니다.
- UPSTREAM_REPOSITORY_DESCRIPTION은 업스트림 저장소에 대한 선택적인 설명입니다.
- LOCATION은 가상 저장소 위치입니다.
- REPOSITORY_ID는 가상 저장소 ID입니다.
- DESCRIPTION은 가상 저장소에 대한 선택적인 설명입니다. 저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.
- KEY는 암호화에 고객 관리 암호화 키(CMEK)를 사용하는 경우 Cloud Key Management Service 키의 이름입니다. 기본 설정인 Google 소유 및 Google 관리 키를 사용하려면 이 인수를 생략합니다.
- PRIORITY는 선택적인 우선순위 값입니다. 가장 높은 우선순위는 1입니다. 우선순위 값이 높은 항목이 가져오기 순서에서 우선 적용됩니다.
Maven
버전 정책을 지정하지 않으면 Artifact Registry가 기본적으로 패키지의 스냅샷 및 출시 버전을 모두 저장하는 Maven 저장소를 만듭니다.
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
location = "UPSTREAM_LOCATION"
repository_id = "UPSTREAM_REPOSITORY_ID"
description = "UPSTREAM_REPOSITORY_DESCRIPTION"
format = "maven"
}
resource "google_artifact_registry_repository" "my-repo" {
depends_on = []
location = "LOCATION"
repository_id = "REPOSITORY_ID"
description = "VIRTUAL_REPOSITORY_DESCRIPTION"
format = "maven"
kms_key_name = "KEY"
mode = "VIRTUAL_REPOSITORY"
virtual_repository_config {
upstream_policies {
id = "UPSTREAM_REPOSITORY_ID"
repository = google_artifact_registry_repository.my-repo-upstream.id
priority = PRIORITY
}
}
}
장소
- PROJECT-ID는 Google Cloud 프로젝트 ID입니다.
- UPSTREAM_LOCATION은 업스트림 저장소 위치입니다. 가상 저장소와 업스트림은 동일한 리전이나 멀티 리전에 있어야 합니다.
- UPSTREAM_REPOSITORY_ID는 업스트림 저장소 ID입니다.
- UPSTREAM_REPOSITORY_DESCRIPTION은 업스트림 저장소에 대한 선택적인 설명입니다.
- LOCATION은 가상 저장소 위치입니다.
- REPOSITORY_ID는 가상 저장소 ID입니다.
- DESCRIPTION은 가상 저장소에 대한 선택적인 설명입니다. 저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.
- KEY는 암호화에 고객 관리 암호화 키(CMEK)를 사용하는 경우 Cloud Key Management Service 키의 이름입니다. 기본 설정인 Google 소유 및 Google 관리 키를 사용하려면 이 인수를 생략합니다.
- PRIORITY는 선택적인 우선순위 값입니다. 가장 높은 우선순위는 1입니다. 우선순위 값이 높은 항목이 가져오기 순서에서 우선 적용됩니다.
스냅샷과 출시 버전을 서로 다른 저장소에 저장하려면 maven_config
블록을 사용하여 저장소에 대해 버전 정책을 지정합니다. 이 블록은 다음 설정을 지원합니다.
version_policy
는 다음 값 중 하나로 버전 정책을 설정합니다.VERSION_POLICY_UNSPECIFIED
: 스냅샷 및 출시 패키지를 저장합니다. 이는 기본 설정입니다.- 출시: 출시 패키지만 저장합니다.
- 스냅샷: 스냅샷 패키지만 저장합니다.
allow_snapshot_overwrites
는SNAPSHOT
버전 정책으로 저장소를 구성하여 저장소의 기존 버전을 덮어쓰는 고유하지 않은 스냅샷을 허용합니다.
다음 예시에서는 출시 버전 정책으로 Maven 저장소를 정의합니다.
provider "google" {
project = "my-project"
}
resource "google_artifact_registry_repository" "my-repo" {
provider = google-beta
location = "us-central1"
repository_id = "my-repo"
description = "Maven repository"
format = "MAVEN"
maven_config {
version_policy = "RELEASE"
}
}
npm
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
location = "UPSTREAM_LOCATION"
repository_id = "UPSTREAM_REPOSITORY_ID"
description = "UPSTREAM_REPOSITORY_DESCRIPTION"
format = "npm"
}
resource "google_artifact_registry_repository" "my-repo" {
depends_on = []
location = "LOCATION"
repository_id = "REPOSITORY_ID"
description = "VIRTUAL_REPOSITORY_DESCRIPTION"
format = "npm"
kms_key_name = "KEY"
mode = "VIRTUAL_REPOSITORY"
virtual_repository_config {
upstream_policies {
id = "UPSTREAM_REPOSITORY_ID"
repository = google_artifact_registry_repository.my-repo-upstream.id
priority = PRIORITY
}
}
}
장소
- PROJECT-ID는 Google Cloud 프로젝트 ID입니다.
- UPSTREAM_LOCATION은 업스트림 저장소 위치입니다. 가상 저장소와 업스트림은 동일한 리전이나 멀티 리전에 있어야 합니다.
- UPSTREAM_REPOSITORY_ID는 업스트림 저장소 ID입니다.
- UPSTREAM_REPOSITORY_DESCRIPTION은 업스트림 저장소에 대한 선택적인 설명입니다.
- LOCATION은 가상 저장소 위치입니다.
- REPOSITORY_ID는 가상 저장소 ID입니다.
- DESCRIPTION은 가상 저장소에 대한 선택적인 설명입니다. 저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.
- KEY는 암호화에 고객 관리 암호화 키(CMEK)를 사용하는 경우 Cloud Key Management Service 키의 이름입니다. 기본 설정인 Google 소유 및 Google 관리 키를 사용하려면 이 인수를 생략합니다.
- PRIORITY는 선택적인 우선순위 값입니다. 가장 높은 우선순위는 1입니다. 우선순위 값이 높은 항목이 가져오기 순서에서 우선 적용됩니다.
Python
provider "google" {
project = "PROJECT-ID"
}
resource "google_artifact_registry_repository" "my-repo-upstream" {
location = "UPSTREAM_LOCATION"
repository_id = "UPSTREAM_REPOSITORY_ID"
description = "UPSTREAM_REPOSITORY_DESCRIPTION"
format = "python"
}
resource "google_artifact_registry_repository" "my-repo" {
depends_on = []
location = "LOCATION"
repository_id = "REPOSITORY_ID"
description = "VIRTUAL_REPOSITORY_DESCRIPTION"
format = "python"
kms_key_name = "KEY"
mode = "VIRTUAL_REPOSITORY"
virtual_repository_config {
upstream_policies {
id = "UPSTREAM_REPOSITORY_ID"
repository = google_artifact_registry_repository.my-repo-upstream.id
priority = PRIORITY
}
}
}
장소
- PROJECT-ID는 Google Cloud 프로젝트 ID입니다.
- UPSTREAM_LOCATION은 업스트림 저장소 위치입니다. 가상 저장소와 업스트림은 동일한 리전이나 멀티 리전에 있어야 합니다.
- UPSTREAM_REPOSITORY_ID는 업스트림 저장소 ID입니다.
- UPSTREAM_REPOSITORY_DESCRIPTION은 업스트림 저장소에 대한 선택적인 설명입니다.
- LOCATION은 가상 저장소 위치입니다.
- REPOSITORY_ID는 가상 저장소 ID입니다.
- DESCRIPTION은 가상 저장소에 대한 선택적인 설명입니다. 저장소 설명은 암호화되지 않으므로 민감한 정보는 포함하지 마세요.
- KEY는 암호화에 고객 관리 암호화 키(CMEK)를 사용하는 경우 Cloud Key Management Service 키의 이름입니다. 기본 설정인 Google 소유 및 Google 관리 키를 사용하려면 이 인수를 생략합니다.
- PRIORITY는 선택적인 우선순위 값입니다. 가장 높은 우선순위는 1입니다. 우선순위 값이 높은 항목이 가져오기 순서에서 우선 적용됩니다.
Artifact Registry가 저장소를 만듭니다. 다음 명령어를 실행하여 저장소에 대한 설명을 봅니다.
gcloud artifacts repositories describe REPOSITORY \
--location=LOCATION
저장소를 만든 후:
- 저장소에 대한 액세스 권한을 부여합니다.
저장소 인증을 위해 Docker, 패키지 관리자, 기타 타사 클라이언트를 구성합니다.
업스트림 저장소 업데이트
업스트림 저장소 목록을 변경하거나 업스트림 저장소의 우선순위를 조정할 수 있습니다.
콘솔
Google Cloud 콘솔에서 저장소 페이지를 엽니다.
저장소 목록에서 가상 저장소를 선택하고 저장소 수정을 클릭합니다.
가상 저장소 업스트림 목록에서 필요한 사항을 변경합니다. 목록에서 저장소를 추가 및 삭제하거나 저장소의 우선순위를 변경할 수 있습니다.
저장을 클릭합니다.
gcloud
변경사항에 따라 업스트림 정책 파일을 수정합니다. 예를 들어 업스트림 저장소를 추가하거나 우선순위 설정을 조정할 수 있습니다.
모든 업스트림 저장소를 제거하려면 정책 파일에 빈 저장소 집합이 포함되어야 합니다.
[]
다음 명령어를 사용하여 가상 저장소에 변경사항을 적용합니다.
gcloud artifacts repositories update REPOSITORY \ --upstream-policy-file=UPSTREAM_POLICY_FILE
UPSTREAM_POLICY_FILE
을 업스트림 정책 파일의 경로로 바꿉니다.명령어에 대한 자세한 내용은 gcloud 아티팩트 저장소 업데이트 참조 문서를 확인하세요.
저장소 설명 수정
Google Cloud 콘솔 또는 gcloud CLI에서 저장소 설명을 변경할 수 있습니다.
콘솔
Google Cloud 콘솔에서 저장소 페이지를 엽니다.
저장소 목록에서 저장소를 선택하고 저장소 수정을 클릭합니다.
저장소 설명을 수정한 후 저장을 클릭합니다.
gcloud
저장소 설명을 업데이트하려면 다음 명령어를 실행합니다.
gcloud artifacts repositories update REPOSITORY \
--project=PROJECT \
--location=LOCATION \
--description="DESCRIPTION"
다음을 바꿉니다.