Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

Cloud Firestore의 색인 유형

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

인덱스는 데이터베이스 성능에 중요한 요소입니다. 책의 주제를 페이지 번호에 매핑하는 책의 색인과 매우 유사하게 데이터베이스 색인은 데이터베이스의 항목을 데이터베이스의 해당 위치에 매핑합니다. 데이터베이스에 쿼리를 보낼 때 데이터베이스는 인덱스를 사용하여 요청한 항목의 위치를 ​​빠르게 조회할 수 있습니다.

이 페이지에서는 Cloud Firestore에서 사용하는 두 가지 유형의 색인인 단일 필드 색인복합 색인 에 대해 설명합니다.

모든 쿼리 뒤에 있는 인덱스

쿼리에 대한 인덱스가 없는 경우 대부분의 데이터베이스는 항목별로 콘텐츠를 크롤링합니다. 이 프로세스는 데이터베이스가 커질수록 속도가 더 느려집니다. Cloud Firestore는 모든 쿼리에 색인을 사용하여 높은 쿼리 성능을 보장합니다. 결과적으로 쿼리 성능은 데이터베이스의 항목 수가 아니라 결과 집합의 크기에 따라 달라집니다.

적은 인덱스 관리, 더 많은 앱 개발

Cloud Firestore에는 색인 관리에 소요되는 시간을 줄이는 기능이 포함되어 있습니다. 가장 기본적인 쿼리에 필요한 인덱스가 자동으로 생성됩니다. 앱을 사용하고 테스트할 때 Cloud Firestore는 앱에 필요한 추가 색인을 식별하고 생성 하는 데 도움이 됩니다.

인덱스 유형

Cloud Firestore는 단일 필드복합 의 두 가지 유형의 색인을 사용합니다. 인덱싱된 필드 수 외에도 단일 필드 및 복합 인덱스는 관리 방법이 다릅니다.

단일 필드 인덱스

단일 필드 인덱스는 특정 필드를 포함하는 컬렉션의 모든 문서에 대한 정렬된 매핑을 저장합니다. 단일 필드 인덱스의 각 항목은 특정 필드에 대한 문서의 값과 데이터베이스에서 문서의 위치를 ​​기록합니다. Cloud Firestore는 이러한 색인을 사용하여 많은 기본 쿼리를 수행합니다. 데이터베이스의 자동 인덱싱 설정 및 인덱스 면제를 구성하여 단일 필드 인덱스를 관리합니다.

자동 인덱싱

기본적으로 Cloud Firestore는 문서의 각 필드와 맵의 각 하위 필드에 대한 단일 필드 색인을 자동으로 유지 관리합니다. Cloud Firestore는 단일 필드 색인에 다음과 같은 기본 설정을 사용합니다.

  • 각각의 비배열 및 비맵 필드에 대해 Cloud Firestore는 2개의 컬렉션 범위 단일 필드 색인을 정의합니다. 하나는 오름차순 모드이고 다른 하나는 내림차순 모드입니다.

  • 각 맵 필드에 대해 Cloud Firestore는 맵의 각 비배열 및 비맵 하위 필드에 대해 하나의 컬렉션 범위 오름차순 색인과 하나의 내림차순 색인을 만듭니다.

  • 문서의 각 배열 필드에 대해 Cloud Firestore는 컬렉션 범위 배열 포함 인덱스를 만들고 유지합니다.

  • 컬렉션 그룹 범위가 있는 단일 필드 인덱스는 기본적으로 유지 관리되지 않습니다.

단일 필드 인덱스 면제

단일 필드 색인 예외를 생성하여 자동 인덱싱 설정에서 필드를 면제할 수 있습니다. 인덱싱 면제는 데이터베이스 전체의 자동 인덱스 설정을 재정의합니다. 면제는 자동 인덱싱 설정이 그렇지 않으면 자동 인덱싱이 활성화할 단일 필드 인덱스를 비활성화하거나 비활성화하는 단일 필드 인덱스를 활성화할 수 있습니다. 예외가 유용할 수 있는 경우 색인 작성 모범 사례 를 참조하십시오.

맵 필드에 대한 단일 필드 색인 예외를 생성하면 맵의 하위 필드가 해당 설정을 상속합니다. 그러나 특정 하위 필드에 대해 단일 필드 색인 예외를 정의할 수 있습니다. 하위 필드에 대한 면제를 삭제하면 하위 필드는 상위 면제 설정(있는 경우) 또는 데이터베이스 전체 설정(상위 면제가 없는 경우)을 상속합니다.

단일 필드 색인 예외를 만들고 관리하려면 Cloud Firestore에서 색인 관리 를 참조하세요.

복합 인덱스

복합 인덱스는 인덱스할 필드의 정렬된 목록을 기반으로 컬렉션에 있는 모든 문서의 정렬된 매핑을 저장합니다.

Cloud Firestore는 복합 색인을 사용하여 단일 필드 색인에서 아직 지원하지 않는 쿼리를 지원합니다.

Cloud Firestore는 가능한 필드 조합이 많기 때문에 단일 필드 색인처럼 복합 색인을 자동으로 생성하지 않습니다. 대신 Cloud Firestore를 사용하면 앱을 빌드할 때 필요한 복합 색인을 식별하고 생성 할 수 있습니다.

필요한 색인을 먼저 생성하지 않고 위의 쿼리를 시도하면 Cloud Firestore는 누락된 색인을 생성하기 위해 따라갈 수 있는 링크가 포함된 오류 메시지를 반환합니다. 이것은 인덱스에서 지원하지 않는 쿼리를 시도할 때마다 발생합니다. 콘솔을 사용하거나 Firebase CLI 를 사용하여 복합 색인을 수동으로 정의하고 관리할 수도 있습니다. 복합 인덱스 생성 및 관리에 대한 자세한 내용은 인덱스 관리 를 참조하십시오.

인덱스 모드 및 쿼리 범위

단일 필드 및 복합 인덱스를 다르게 구성하지만 둘 모두 인덱스에 대한 인덱스 모드와 쿼리 범위를 구성해야 합니다.

인덱스 모드

인덱스를 정의할 때 인덱스된 각 필드에 대해 인덱스 모드를 선택합니다. 각 필드의 인덱스 모드는 해당 필드에 대한 특정 쿼리 절을 지원합니다. 다음 인덱스 모드에서 선택할 수 있습니다.

인덱스 모드 설명
오름차순 필드에서 < , <= , == , >= , > , != , innot-in , 쿼리 절을 지원하고 이 필드 값을 기반으로 오름차순으로 결과 정렬을 지원합니다.
내림차순 필드에서 < , <= , == , >= , > , != , innot-in 쿼리 절을 지원하고 이 필드 값을 기준으로 내림차순으로 결과 정렬을 지원합니다.
배열 포함 필드에서 array-containsarray-contains-any 쿼리 절을 지원합니다.

쿼리 범위

각 인덱스는 컬렉션 또는 컬렉션 그룹으로 범위가 지정됩니다. 이를 인덱스의 쿼리 범위라고 합니다.

수집 범위
Cloud Firestore는 기본적으로 컬렉션 범위가 있는 색인을 만듭니다. 이러한 인덱스는 단일 컬렉션의 결과를 반환하는 쿼리를 지원합니다.

컬렉션 그룹 범위
컬렉션 그룹에는 컬렉션 ID가 동일한 모든 컬렉션이 포함됩니다. 컬렉션 그룹에서 필터링되거나 정렬된 결과를 반환하는 컬렉션 그룹 쿼리 를 실행하려면 컬렉션 그룹 범위가 있는 해당 인덱스를 만들어야 합니다.

인덱싱 예

단일 필드 인덱스를 자동으로 생성함으로써 Cloud Firestore를 사용하면 애플리케이션에서 가장 기본적인 데이터베이스 쿼리를 빠르게 지원할 수 있습니다. 단일 필드 인덱스를 사용하면 필드 값과 비교자 < , <= , == , >= , >in 기반으로 간단한 쿼리를 수행할 수 있습니다. 배열 필드의 경우 배열 array-containsarray-contains-any 쿼리를 수행할 수 있습니다.

이를 설명하기 위해 인덱스 생성의 관점에서 다음 예를 살펴보십시오. 다음 스니펫은 cities 컬렉션에 몇 개의 city 문서를 만들고 각 문서에 대해 name , state , country , capital , populationtags 필드를 설정합니다.

편물
var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

기본 자동 인덱싱 설정을 가정하면 Cloud Firestore는 비배열 필드당 하나의 오름차순 단일 필드 인덱스, 비배열 필드당 하나의 내림차순 단일 필드 인덱스, 배열 필드에 대해 하나의 배열 포함 단일 필드 인덱스를 업데이트합니다. 다음 테이블의 각 행은 단일 필드 인덱스의 항목을 나타냅니다.

수집 인덱싱된 필드 쿼리 범위
도시 이름 수집
도시 상태 수집
도시 국가 수집
도시 자본 수집
도시 인구 수집
도시 이름 수집
도시 상태 수집
도시 국가 수집
도시 자본 수집
도시 인구 수집
도시 array-contains 영역 수집

단일 필드 인덱스에서 지원하는 쿼리

자동으로 생성된 단일 필드 인덱스를 사용하여 다음과 같은 간단한 쿼리를 실행할 수 있습니다.

편물
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

in 및 복합 항등( == ) 쿼리를 만들 수도 있습니다.

편물
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

범위 비교( < , <= , > 또는 >= )를 사용하는 복합 쿼리를 실행해야 하거나 다른 필드를 기준으로 정렬해야 하는 경우 해당 쿼리에 대한 복합 인덱스 를 생성해야 합니다.

array-contains 인덱스를 사용하면 regions 배열 필드를 쿼리할 수 있습니다.

편물
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

복합 인덱스에서 지원하는 쿼리

Cloud Firestore는 복합 색인을 사용하여 단일 필드 색인에서 아직 지원하지 않는 복합 쿼리를 지원합니다. 예를 들어 다음 쿼리에 대해 복합 인덱스가 필요합니다.

편물
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

이러한 쿼리에는 아래의 복합 색인이 필요합니다. 쿼리는 country 필드에 대해 등호( == 또는 in )를 사용하므로 이 필드에 대해 오름차순 또는 내림차순 인덱스 모드를 사용할 수 있습니다. 기본적으로 부등식 절은 부등식 절의 필드를 기반으로 오름차순 정렬 순서를 적용합니다.

수집 인덱싱된 필드 쿼리 범위
도시 (또는 ) 국가, 인구 수집

동일한 쿼리를 내림차순 정렬로 실행하려면 population 에 대해 내림차순으로 추가 복합 인덱스가 필요합니다.

편물
citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
수집 인덱싱된 필드 쿼리 범위
도시 국가, 인구 수집
도시 국가 , 인구 수집

또한 array-contains 또는 array-contains-any 쿼리를 추가 절과 결합하기 위해 복합 인덱스를 생성해야 합니다.

편물
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
수집 인덱싱된 필드 쿼리 범위
도시 배열 포함 태그, (또는 ) 대문자 수집

컬렉션 그룹 인덱스에서 지원하는 쿼리

컬렉션 그룹 범위가 있는 인덱스를 보여주기 위해 일부 city 문서에 landmarks 하위 컬렉션을 추가한다고 상상해 보세요.

편물
var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

컬렉션 범위가 있는 다음 단일 필드 인덱스를 사용하여 category 필드를 기반으로 단일 도시의 landmarks 컬렉션을 쿼리할 수 있습니다.

수집 인덱싱된 필드 쿼리 범위
랜드마크 (또는 ) 카테고리 수집
편물
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

이제 모든 도시의 랜드마크를 쿼리하는 데 관심이 있다고 상상해 보세요. 모든 landmarks 컬렉션으로 구성된 컬렉션 그룹에서 이 쿼리를 실행하려면 컬렉션 그룹 범위가 있는 landmarks 단일 필드 인덱스를 활성화해야 합니다.

수집 인덱싱된 필드 쿼리 범위
랜드마크 (또는 ) 카테고리 컬렉션 그룹

이 인덱스를 활성화하면 landmarks 컬렉션 그룹을 쿼리할 수 있습니다.

편물
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

필터링되거나 정렬된 결과를 반환하는 컬렉션 그룹 쿼리를 실행하려면 컬렉션 그룹 범위가 있는 해당 단일 필드 또는 복합 인덱스를 활성화해야 합니다. 그러나 결과를 필터링하거나 정렬하지 않는 컬렉션 그룹 쿼리에는 추가 인덱스 정의가 필요하지 않습니다.

예를 들어 추가 인덱스를 활성화하지 않고 다음 컬렉션 그룹 쿼리를 실행할 수 있습니다.

편물
db.collectionGroup("landmarks").get()

색인 항목

프로젝트의 구성된 색인과 문서의 구조는 문서의 색인 항목 수를 결정합니다. 색인 항목은 색인 항목 수 제한에 포함됩니다 .

다음 예는 문서의 색인 항목을 보여줍니다.

문서

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

단일 필드 인덱스

  • city_name ASC
  • city_name DESC
  • 온도.여름 ASC
  • 온도.여름 DESC
  • 온도.겨울 ASC
  • 온도.겨울 DESC
  • 이웃 배열 포함(ASC 및 DESC)

복합 인덱스

  • city_name ASC, 지역 ARRAY
  • city_name DESC, 지역 ARRAY

색인 항목

이 인덱싱 구성으로 인해 문서에 대해 다음 18개의 인덱스 항목이 생성됩니다.

색인 인덱싱된 데이터
단일 필드 인덱스 항목
city_name ASC city_name: "샌프란시스코"
city_name DESC city_name: "샌프란시스코"
온도.여름 ASC 온도.여름: 67
온도.여름 DESC 온도.여름: 67
온도.겨울 ASC 온도.겨울: 55
온도.겨울 DESC 온도.겨울: 55
이웃 배열에는 ASC가 포함됩니다. 이웃: "미션"
이웃 배열에는 DESC가 포함됩니다. 이웃: "미션"
이웃 배열에는 ASC가 포함됩니다. 동네: "다운타운"
이웃 배열에는 DESC가 포함됩니다. 동네: "다운타운"
이웃 배열에는 ASC가 포함됩니다. 이웃: "마리나"
이웃 배열에는 DESC가 포함됩니다. 이웃: "마리나"
복합 색인 항목
city_name ASC, 지역 ARRAY city_name: "샌프란시스코", 이웃: "미션"
city_name ASC, 지역 ARRAY city_name: "San Francisco", 이웃: "Downtown"
city_name ASC, 지역 ARRAY city_name: "샌프란시스코", 이웃: "마리나"
city_name DESC, 지역 ARRAY city_name: "샌프란시스코", 이웃: "미션"
city_name DESC, 지역 ARRAY city_name: "San Francisco", 이웃: "Downtown"
city_name DESC, 지역 ARRAY city_name: "샌프란시스코", 이웃: "마리나"

인덱스 및 가격

인덱스는 애플리케이션의 스토리지 비용 에 기여합니다. 인덱스의 저장소 크기를 계산하는 방법에 대한 자세한 내용은 인덱스 항목 크기 를 참조하세요.

인덱스 병합 활용

Cloud Firestore는 모든 쿼리에 인덱스를 사용하지만 쿼리당 하나의 인덱스가 반드시 필요한 것은 아닙니다. 여러 같음( == ) 절과 선택적으로 orderBy 절이 있는 쿼리의 경우 Cloud Firestore는 기존 색인을 재사용할 수 있습니다. Cloud Firestore는 단순 동등 필터의 색인을 병합하여 더 큰 동등 쿼리에 필요한 복합 색인을 빌드할 수 있습니다.

인덱스 병합을 활용할 수 있는 상황을 식별하여 인덱싱 비용을 줄일 수 있습니다. 예를 들어 레스토랑 평가 앱에 대한 restaurants 컬렉션을 상상해 보십시오.

  • _북마크 레스토랑

    • 버거타임

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

이제 이 앱이 아래와 같은 쿼리를 사용한다고 상상해 보세요. 앱은 항상 star_rating 오름차순으로 정렬하면서 category , cityeditors_pick 에 대해 평등 절의 조합을 사용합니다.

편물
db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

각 쿼리에 대한 인덱스를 만들 수 있습니다.

수집 인덱싱된 필드 쿼리 범위
레스토랑 카테고리, star_rating 수집
레스토랑 도시, star_rating 수집
레스토랑 카테고리, 도시, star_rating 수집
레스토랑 카테고리, 도시, editors_pick, star_rating 수집

더 나은 솔루션으로 같음 절에 대한 색인을 병합하는 Cloud Firestore의 기능을 활용하여 색인 수를 줄일 수 있습니다.

수집 인덱싱된 필드 쿼리 범위
레스토랑 카테고리, star_rating 수집
레스토랑 도시, star_rating 수집
레스토랑 editors_pick, star_rating 수집

이 인덱스 집합은 더 작을 뿐만 아니라 추가 쿼리도 지원합니다.

편물
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

인덱싱 제한

인덱스에는 다음 제한이 적용됩니다. 모든 할당량 및 한도는 할당량 및 한도를 참조하십시오.

한계 세부
데이터베이스의 최대 복합 인덱스 수 200
데이터베이스에 대한 최대 단일 필드 구성 수

200

총 200개의 필드 수준 구성이 허용됩니다. 하나의 필드 구성에는 동일한 필드에 대한 여러 구성이 포함될 수 있습니다. 예를 들어 동일한 필드에 대한 단일 필드 인덱싱 면제 및 TTL 정책은 한도에 대한 하나의 필드 구성으로 계산됩니다.

각 문서의 최대 색인 항목 수

40,000

색인 항목 수는 문서에 대한 다음 항목의 합계입니다.

  • 단일 필드 인덱스 항목의 수
  • 복합 색인 항목 수

Cloud Firestore가 문서 및 색인 세트를 색인 항목으로 바꾸는 방법을 보려면 이 색인 항목 개수 예시 를 참조하세요.

복합 인덱스의 최대 필드 수 100
인덱스 항목의 최대 크기

7.5KiB

Cloud Firestore가 색인 항목 크기를 계산하는 방법을 보려면 색인 항목 크기를 참조하세요.

문서의 인덱스 항목 크기의 최대 합계

8MiB

전체 크기는 문서에 대한 다음 항목의 합계입니다.

  • 문서의 단일 필드 인덱스 항목 크기 합계
  • 문서의 복합 색인 항목 크기 합계
  • 인덱싱된 필드 값의 최대 크기

    1500바이트

    1500바이트를 초과하는 필드 값은 잘립니다. 잘린 필드 값과 관련된 쿼리는 일관성 없는 결과를 반환할 수 있습니다.

    인덱싱 모범 사례

    대부분의 앱에서 자동 인덱싱 및 오류 메시지 링크를 사용하여 인덱스를 관리할 수 있습니다. 그러나 다음과 같은 경우 단일 필드 예외를 추가할 수 있습니다.

    사례 설명
    큰 문자열 필드

    쿼리에 사용하지 않는 긴 문자열 값을 자주 포함하는 문자열 필드가 있는 경우 해당 필드를 인덱싱에서 제외하여 스토리지 비용을 절감할 수 있습니다.

    순차 값이 있는 문서가 포함된 컬렉션에 대한 높은 쓰기 속도

    타임스탬프와 같이 컬렉션의 문서 간에 순차적으로 증가하거나 감소하는 필드를 인덱싱하는 경우 컬렉션에 대한 최대 쓰기 속도는 초당 500회입니다. 순차 값이 있는 필드를 기반으로 쿼리하지 않는 경우 이 제한을 우회하기 위해 인덱싱에서 필드를 제외할 수 있습니다.

    예를 들어 쓰기 속도가 높은 IoT 사용 사례에서 타임스탬프 필드가 있는 문서가 포함된 컬렉션은 초당 500회 쓰기 제한에 접근할 수 있습니다.

    TTL 필드

    TTL(time-to-live) 정책 을 사용하는 경우 TTL 필드는 타임스탬프여야 합니다. TTL 필드에 대한 인덱싱은 기본적으로 활성화되어 있으며 더 높은 트래픽 속도에서 성능에 영향을 줄 수 있습니다. 가장 좋은 방법은 TTL 필드에 단일 필드 예외를 추가하는 것입니다.

    큰 배열 또는 맵 필드

    큰 배열 또는 맵 필드는 문서당 40,000개의 인덱스 항목 제한에 도달할 수 있습니다. 큰 배열이나 맵 필드를 기반으로 쿼리하지 않는 경우 인덱싱에서 제외해야 합니다.