sh.updateZoneKeyRange()
정의
sh.updateZoneKeyRange(namespace, minimum, maximum, zone)
범위 샤드 키 값을 구역 과 연결합니다.
updateZoneKeyRange
데이터베이스 명령 과 해당 헬퍼sh.updateZoneKeyRange()
및sh.addTagRange()
를 샤딩되지 않은 컬렉션 또는 존재하지 않는 컬렉션 에서 실행 수 있습니다.중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드에 대해 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.데이터베이스 명령에 대해서는
updateZoneKeyRange
명령을 참조하십시오.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
sh.updateZoneKeyRange()
다음 인수를 사용합니다.Parameter유형설명namespace
문자열샤드 컬렉션의 네임스페이스 는
zone
와 연결됩니다.작업이 성공하려면 컬렉션을 샤딩해야 합니다.
minimum
문서샤드 키 값 범위의 포괄적 하한입니다.
샤드 키의 각 필드를
<fieldname> : <value>
형식으로 지정합니다. 값은 샤드 키와 동일한 BSON 유형이어야 합니다.해시 샤딩을 사용하려면 필드 값이
NumberLong
유형이어야 합니다.maximum
문서샤드 키 값 범위의 배타적 상한입니다.
샤드 키의 각 필드를
<fieldname> : <value>
형식으로 지정합니다. 값은 샤드 키와 동일한 BSON 유형이어야 합니다.해시 샤딩을 사용하려면 필드 값이
NumberLong
유형이어야 합니다.zone
문자열minimum
및maximum
로 묶인 샤드 키 값 범위와 연결할 구역의 이름입니다.sh.updateZoneKeyRange()
인스턴스에 연결된 경우에만 를 실행합니다.mongos
행동
샤드 컬렉션의 기존 범위와 하한선 및 상한선이 겹치는 샤드 키 값 범위는 생성할 수 없습니다. 예를 들어 기존 범위가 1
~ 10
인 경우 새 범위가 기존 범위와 겹치므로 5
~ 20
의 새 범위를 만들 수 없습니다.
구역은 여러 범위의 데이터와 연결될 수 있지만 범위는 최대 단일 구역과 연결될 수 있습니다.
샤드 클러스터의 구역에 대한 자세한 내용은 구역 매뉴얼 페이지를 참조하세요.
비어 있거나 존재하지 않는 컬렉션에 대한 초기 청크 배포
비어 있거나 존재하지 않는 컬렉션에 대해 구역 샤딩 을 수행하려는 sh.updateZoneKeyRange()
경우, 컬렉션을 샤딩 하기 전에 를 사용하여 구역 및 구역 범위를 생성합니다(이후 4.0.2). 버전 4 부터.0.3, 비어 있거나 존재하지 않는 컬렉션에 구역 및 구역 범위를 생성하면 MongoDB가 컬렉션을 샤딩할 때 초기 청크 생성 및 배포 프로세스를 최적화할 수 있습니다. 이 최적화된 프로세스는 샤딩 후 구역을 생성하는 것보다 적은 밸런서 오버헤드로 구역 샤딩을 더 빠르게 설정할 수 있도록 지원합니다. 밸런서 는 최적화된 초기 청크 생성 및 배포 후 모든 청크 관리를 수행합니다.
초기 청크 배포를 위한 구역 및 구역 범위를 정의하는 예 는 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.
복합 해시 샤드 키를 사용한 초기 청크 배포
MongoDB는 복합 해시 인덱스 에서 컬렉션 샤딩을 지원합니다. MongoDB는 복합 해시 샤드 키에서 비어 있거나 존재하지 않는 컬렉션을 샤딩할 때 최적화된 초기 청크 생성 및 배포를 수행할 수 있습니다.
해시된 필드가 샤드 키의 접두사(즉, 샤드 키의 첫 번째 필드)인 경우, MongoDB가 초기 청크 생성 및 배포를 수행하려면 다음 사항이 모두 충족되어야 합니다.
컬렉션에는 모든 하한 필드에 대해
MinKey
이고 모든 상한 필드에 대해MaxKey
인 단일 구역 범위가 있습니다.sh.shardCollection()
는 presplitHashedZones: true 옵션을 지정합니다.
해시 된 필드 가 샤드 키 의 접두사가 아닌 경우(즉, 샤드 키 에 해시되지 않은 선행 필드가 하나 이상 있는 경우) MongoDB 가 초기 청크 생성 및 배포를 수행하려면 다음 사항이 모두 충족되어야 합니다.
컬렉션에는 고유한 접두사 필드 값의 각 조합에 대해 하나의 구역 범위가 있습니다(예: 해시된 필드 앞에 오는 모든 필드).
각 구역 범위 의 하한에 대해 해시 필드 와 모든 후속 필드에 대해
MinKey
를 지정합니다.각 구역 범위에 대해 하나 이상의 상한 접두사 필드는 하한 접두사 필드와 달라야 합니다 .
sh.shardCollection()
는 presplitHashedZones: true 옵션을 지정합니다.
복합 해시 샤드 키에서 초기 청크 배포를 위한 구역 및 구역 범위를 정의하는 더 완전한 예 는 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.
밸런서
범위를 구역에 연결한 후에는 먼저 밸런서 를 실행해야 구역에 포함되는 범위의 청크를 해당 구역 내부의 샤드로 마이그레이션할 수 있습니다. 밸런싱이 완료될 때까지, 샤드 클러스터에 대해 구성된 구역을 고려할 때 일부 청크가 잘못된 샤드에 있을 수 있습니다. 자세한 내용은 밸런서 를 참조하세요.
샤드 클러스터에서 마이그레이션이 작동하는 방식에 대한 자세한 내용은 샤드 클러스터 밸런서 매뉴얼 페이지를 참조하세요.
바운드
구역 범위는 항상 하한 경계를 포함하고 상한 경계를 제외합니다.
삭제된 컬렉션
컬렉션을 제거하면 관련된 영역/태그 범위가 삭제됩니다.
이전 버전에서는 MongoDB가 삭제된 컬렉션에 대한 태그 연결을 제거하지 않았으며, 나중에 같은 이름으로 새 컬렉션을 만들면 이전 태그 연결이 새 컬렉션에 적용됩니다.
보안
authentication 으로 실행되는 샤드 클러스터의 경우 다음 중 하나를 사용하여 인증해야 합니다.
config
데이터베이스의 다양한 컬렉션에 대해 지정된 작업이 포함된 권한을 가진 사용자입니다.또는,
클러스터 리소스에 대한 가
enableSharding
포함된 권한을 가진 사용자입니다.
clusterAdmin
또는 clusterManager
기본 제공 역할에는 sh.updateZoneKeyRange()
발급에 적합한 권한이 있습니다. 자세한 내용은 역할 기반 액세스 제어 에 대한 설명서 페이지를 참조하세요.
예시
샤드 키가 { a
: 1 }
인 샤드 컬렉션 exampledb.collection
이 주어지면 다음 작업은 alpha
구역에 하한이 1
이고 상한이 10
인 범위를 생성합니다.
sh.updateZoneKeyRange( "exampledb.collection", { a : 1 }, { a : 10 }, "alpha" )
다음 작업은 null
을 zone
필드에 전달하여 이전에 생성된 범위를 제거합니다.
sh.updateZoneKeyRange( "exampledb.collection", { a : 1 }, { a : 10 }, null )
min
및 max
는 대상 범위의 경계와 정확히 일치해야 합니다. 다음 작업은 이전에 생성된 범위를 제거하려고 시도하지만 { a : 0 }
를 min
바운드로 지정합니다.
sh.updateZoneKeyRange( "exampledb.collection", { a : 0 }, { a : 10 }, null )
{ a : 0 }
및 { a : 10 }
범위는 기존 범위를 포함하지만 정확히 일치하지 않으므로 updateZoneKeyRange
는 아무것도 제거하지 않습니다.
복합 샤드 키
샤드 키가 { a
: 1, b : 1 }
인 샤드된 컬렉션 exampledb.collection
이 주어지면 다음 작업은 { a: 1, b : 1 }
의 하한과 { a : 10, b : 10}
의 상한을 포함하는 범위를 생성하고 이를 alpha
구역과 연결합니다.
sh.updateZoneKeyRange( "exampledb.collection", { a : 1, b : 1 }, { a : 10, b : 10 }, "alpha" )
비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의
비어 있거나 존재하지 않는 컬렉션에 구역 및 구역 범위를 생성하는 경우, MongoDB는 컬렉션을 샤딩할 때 초기 청크 생성 및 배포 프로세스를 최적화할 수 있습니다. 이 최적화된 프로세스는 샤딩 후 구역을 생성하는 것보다 적은 밸런서 오버헤드로 구역 샤딩을 더 빠르게 설정할 수 있도록 지원합니다. 밸런서 는 최적화된 초기 청크 생성 및 배포 후 모든 청크 관리를 수행합니다. 자세한 내용 은 복합 해시 샤드 키를 사용한 초기 청크 배포 를 참조하세요.
아래 섹션에는 세 가지 샤드 키 유형에 대한 예시가 포함되어 있습니다.
세 가지 서로 다른 샤드 키 유형에 대해 사전 정의된 구역 또는 구역 범위를 살펴보는 다음 예시를 살펴보세요.
단일 또는 복합 샤드 키
참고
이 예시는 해시 필드가 없는 단일 필드 또는 복합 샤드 키에만 적용됩니다.
예: { "zip" : 1 }
또는 { "zip" : 1, "account" : 1}
구역 만들기
sh.addShardToZone()
를 사용하여 구역을 생성합니다.
sh.addShardToZone("shardA", "DC1") sh.addShardToZone("shardB", "DC2")
구역 범위 만들기
sh.updateZoneKeyRange()
를 사용하여 exampledb
데이터베이스에 빈 contacts
컬렉션의 범위를 만듭니다.
sh.updateZoneKeyRange( "exampledb.contacts", { zip: 10001 }, { zip: 10090 }, "DC1" ); sh.updateZoneKeyRange( "exampledb.contacts", { zip: 90001 }, { zip: 96054 }, "DC2" );
컬렉션 샤딩
참고
컬렉션이 존재하지 않는 경우 샤딩 작업은 컬렉션을 생성합니다.
컬렉션이 비어 있고 샤드 키를 지원하는 인덱스가 없는 경우 샤딩 작업은 인덱스를 생성합니다.
sh.shardCollection()
를 사용하여 contacts
컬렉션을 샤딩합니다.
sh.shardCollection("exampledb.contacts", { zip: 1 } );
생성된 청크 및 배포 검토
생성된 청크와 분포를 보려면 sh.status()
작업을 실행합니다.
sh.status()
이 메서드는 다음을 반환합니다.
--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b80c06d35a961fd0ae1986d") } shards: { "_id" : "shardA", "host" : "shardA/mongodb0.example.net:27018,mongodb1.example.net:27018,mongodb2.example.net:27018", "state" : 1, "tags" : [ "DC1" ] } { "_id" : "shardB", "host" : "shardB/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018", "state" : 1, "tags" : [ "DC2" ] } active mongoses: "4.2.0" : 2 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "exampledb", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("6c351bcf-acd2-4fd9-82d8-9f6bd7321558"), "lastMod" : 1 } } exampledb.contacts shard key: { "zip" : 1 } unique: false balancing: true chunks: shardA 3 shardB 2 { "zip" : { "$minKey" : 1 } } -->> { "zip" : 10001 } on : shardA Timestamp(1, 0) { "zip" : 10001 } -->> { "zip" : 10090 } on : shardA Timestamp(1, 1) { "zip" : 10090 } -->> { "zip" : 90001 } on : shardB Timestamp(1, 2) { "zip" : 90001 } -->> { "zip" : 96054 } on : shardB Timestamp(1, 3) { "zip" : 96054 } -->> { "zip" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 4) tag: DC1 { "zip" : 10001 } -->> { "zip" : 10090 } tag: DC2 { "zip" : 90001 } -->> { "zip" : 96054 }
컬렉션의 경우 샤딩 작업으로 shardA 및 shardB에 걸쳐 5 청크(영역 범위에 해당하는 2개, 다른 모든 값을 포함하는 청크 3개)가 생성되었습니다.
해시 접두사가 있는 복합 해시 샤드 키
참고
이 예시는 해시 필드가 샤드 키의 접두사(즉, 샤드 키의 첫 번째 필드가 해시됨)인 복합 해시 샤드 키에만 적용됩니다.
예를 들면 다음과 같습니다. { "_id" : "hashed", "facility" : 1 }
MongoDB는 복합 해시 인덱스 에서 컬렉션 샤딩을 지원합니다. 복합 해시 샤드 키에서 샤딩할 때, MongoDB는 정의된 영역 범위가 추가 요구 사항을 충족하는 경우에만 비어 있거나 존재하지 않는 컬렉션에 대해 최적화된 초기 청크 생성 및 배포를 수행할 수 있습니다.
두 제조 시설 중 하나의 분석을 저장할 빈 컬렉션 examples.metrics
을 가정해 보겠습니다. 계획된 샤드 키는 { "_id" : "hashed", "facility" : 1}
이며, 여기서 해시 필드는 샤드 키 접두사 입니다.
구역 만들기
계획된 샤드 키는 { "_id" : "hashed", "facility" : 1 }
입니다. 해시된 필드는 접두사(즉, 샤드 키의 첫 번째 필드)이므로 sh.addShardToZone()
을사용하여 단일 구역을 만듭니다.
sh.addShardToZone("shardA", "FacilityAlpha") sh.addShardToZone("shardB", "FacilityAlpha")
구역 범위 만들기
해시 접두사가 있는 복합 해시 샤드 키의 초기 청크 배포에는 모든 하한 필드에 MinKey
, 모든 상한 필드에 MaxKey
가 있는 단일 구역 범위가 필요합니다.
sh.updateZoneKeyRange()
을 사용하여 단일 범위를 생성합니다.
sh.updateZoneKeyRange( "examples.metrics", { "_id" : MinKey, "facility" : MinKey }, { "_id" : MaxKey, "facility" : MaxKey }, "FacilityAlpha" );
컬렉션 샤딩
참고
컬렉션이 존재하지 않는 경우 샤딩 작업은 컬렉션을 생성합니다.
컬렉션이 비어 있고 샤드 키를 지원하는 인덱스가 없는 경우 샤딩 작업은 인덱스를 생성합니다.
컬렉션을 샤딩하고 초기 청크 생성 및 배포를 수행하려면 sh.shardCollection()
를 presplitHashedZones: true 와 함께 사용합니다.
sh.shardCollection( "examples.metrics", { "_id" : "hashed", "facility" : 1 }, false, { presplitHashedZones: true } )
생성된 청크 및 배포 검토
생성된 청크와 분포를 보려면 sh.status()
작업을 실행합니다.
sh.status()
출력은 다음과 유사합니다(가독성을 위해 내용이 생략됨).
--- Sharding Status --- databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "examples", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("245f8abf-a363-48b0-8208-2a5b577bbb4e"), "lastMod" : 1 } } examples.metrics shard key: { "_id" : "hashed", "facility" : 1 } unique: false balancing: true chunks: shardA 2 shardB 2 { "_id" : { "$minKey" : 1 }, "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("-4611686018427387902"), "facility" : { "$minKey" : 1 } } on : shardA Timestamp(1, 0) { "_id" : NumberLong("-4611686018427387902"), "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong(0), "facility" : { "$minKey" : 1 } } on : shardA Timestamp(1, 1) { "_id" : NumberLong(0), "facility" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("4611686018427387902"), "facility" : { "$minKey" : 1 } } on : shardB Timestamp(1, 2) { "_id" : NumberLong("4611686018427387902"), "facility" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 }, "facility" : { "$maxKey" : 1 } } on : shardB Timestamp(1, 3) tag: FacilityAlpha { "_id" : { "$minKey" : 1 }, "facility" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 }, "facility" : { "$maxKey" : 1 } }
샤딩 작업으로 총 4 청크가 생성되었습니다. 두 개의 청크는 절대 하한과 상한에 해당합니다. shardA
및 shardB
에 FacilityAlpha
에 해당하는 하나의 구역이 생성되었습니다. 구역은 해시 필드를 사용하여 2 청크로 세분화되었습니다.
접두사가 아닌 해시 필드가 있는 복합 해시 샤드 키
참고
이 예시는 해시 필드가 샤드 키의 접두사가 아닌 복합 해시 샤드 키에만 적용됩니다(즉, 샤드 키의 첫 번째 필드가 해시되지 않음).
예를 들면 다음과 같습니다. { "facility" : 1, "_id" : "hashed" }
MongoDB는 복합 해시 인덱스 에서 컬렉션 샤딩을 지원합니다. 복합 해시 샤드 키에서 샤딩할 때, MongoDB는 정의된 영역 범위가 추가 요구 사항을 충족하는 경우에만 비어 있거나 존재하지 않는 컬렉션에 대해 최적화된 초기 청크 생성 및 배포를 수행할 수 있습니다.
두 제조 시설 중 하나의 분석을 저장할 빈 컬렉션 examples.metrics
을 가정해 보겠습니다. 계획된 샤드 키는 { "facility" : 1, "_id" : "hashed" }
이며, 여기서 해시 필드는 샤드 키 접두사가 아닙니다 .
facility
필드는 시설 이름을 저장합니다:"FacilityAlpha"
또는"FacilityBaker"
. 각 시설의 데이터를 특정 샤드로 격리하기 위해 컬렉션에는facility
에 대한 구역 범위가 필요합니다._id
필드는facility
필드의 낮은 카디널리티를 보상합니다. 해싱은_id
필드의 단조 증가 특성을 보상합니다.
구역 만들기
sh.addShardToZone()
명령을 사용하여 구역을 생성합니다.
sh.addShardToZone("shardA", "FacilityAlpha") sh.addShardToZone("shardB", "FacilityBaker")
구역 범위 만들기
계획된 샤드 키는 {"facility" : 1, "_id" : "hashed"}
입니다. facility
필드에는 FacilityAlpha
및 FacilityBaker
의 두 가지 가능한 값이 있습니다.
해시 필드가 접두사가 아닌 복합 해시 샤드 키의 초기 청크 배포에는 고유한 접두사 필드 값의 각 조합에 대해 하나의 구역 범위가 필요합니다(예: 해시된 필드 앞에 오는 모든 필드). facility
에는 두 개의 고유한 접두사 값이 있으므로 컬렉션에는 해당 값을 포함하는 정확히 두 개의 구역 범위가 필요합니다.
하한 범위는 접두사가 아닌 모든 필드에 대해
MinKey
를 지정합니다.상한 범위에는 하한과 다른 접두사 필드가 하나 이상 있습니다.
sh.updateZoneKeyRange()
를 사용하여 "facility": "FacilityAlpha"
의 범위를 만듭니다.
sh.updateZoneKeyRange( "examples.metrics", { "facility": "FacilityAlpha", "_id" : MinKey }, { "facility": "FacilityBaker", "_id" : MinKey }, "FacilityAlpha" );
구역 범위 상한은 배타적 이므로 이 범위는 고유 샤드 키 접두사 값이
"facilty" : "FacilityAlpha"
이고 가능한 모든 값이_id
인 문서만 포함합니다.
sh.updateZoneKeyRange()
를 사용하여 "facility": "FacilityBaker"
의 범위를 만듭니다.
sh.updateZoneKeyRange( "examples.metrics", { "facility": "FacilityBaker", "_id" : MinKey }, { "facility": MaxKey, "_id" : MinKey }, "FacilityBaker" );
이 범위의 상한은 기술적으로
facility
의 다른 값을 캡처할 수 있지만 초기 청크 배포 로직은facility
에 대한 다른 고유 값이 존재하지 않는다는 가정에 의존합니다. 컬렉션에는facility
이FacilityAlpha
또는FacilityBaker
인 문서만 포함되어 있으므로 이 범위는 고유 샤드 키 접두사 값이"facility" : "FacilityBaker"
이고 가능한 모든 값이_id
인 문서만 포함합니다.
컬렉션 샤딩
참고
컬렉션이 존재하지 않는 경우 샤딩 작업은 컬렉션을 생성합니다.
컬렉션이 비어 있고 샤드 키를 지원하는 인덱스가 없는 경우 샤딩 작업은 인덱스를 생성합니다.
컬렉션을 샤딩하고 초기 청크 생성 및 배포를 수행하려면 sh.shardCollection()
를 presplitHashedZones: true 와 함께 사용합니다.
sh.shardCollection( "examples.metrics", { "facility" : 1, "_id" : "hashed"}, false, { presplitHashedZones: true } )
생성된 청크 및 배포 검토
생성된 청크와 분포를 보려면 sh.status()
작업을 실행합니다.
sh.status()
출력은 다음과 유사합니다(가독성을 위해 내용이 생략됨).
--- Sharding Status --- databases: { "_id" : "config", "primary" : "config", "partitioned" : true } { "_id" : "examples", "primary" : "shardA", "partitioned" : true, "version" : { "uuid" : UUID("6c351bcf-acd2-4fd9-82d8-9f6bd7321558"), "lastMod" : 1 } } examples.metrics shard key: { "facility" : 1, "_id" : "hashed" } unique: false balancing: true chunks: shardA 3 shardB 3 { "facility" : { "$minKey" : 1 }, "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } on : shard1 Timestamp(1, 0) { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityAlpha", "_id" : NumberLong(0) } on : shard1 Timestamp(1, 1) { "facility" : "FacilityAlpha", "_id" : NumberLong(0) } -->> { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } on : shard1 Timestamp(1, 2) { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityBaker", "_id" : NumberLong(0) } on : shard2 Timestamp(1, 3) { "facility" : "FacilityBaker", "_id" : NumberLong(0) } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } } on : shard2 Timestamp(1, 4) { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) tag: FacilityAlpha { "facility" : "FacilityAlpha", "_id" : { "$minKey" : 1 } } -->> { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } tag: FacilityBaker { "facility" : "FacilityBaker", "_id" : { "$minKey" : 1 } } -->> { "facility" : { "$maxKey" : 1 }, "_id" : { "$minKey" : 1 } }
샤딩 작업으로 총 6 청크가 생성되었습니다. 두 개의 청크는 절대 하한과 상한에 해당합니다. shardA
에 하나와 shardB
에 각각 FacilityAlpha
및 FacilityBaker
에 해당하는 두 개의 구역이 생성되었습니다. 이러한 각 구역은 해시 필드를 사용하여 2 청크로 더 세분화되었습니다.