Docs Menu
Docs Home
/ / /
C#/.NET
/ /

클래스 매핑

이 페이지의 내용

  • 개요
  • 자동 클래스 매핑
  • 클래스 맵 수동 생성
  • 클래스 직렬화 사용자 지정
  • 추가 요소 무시
  • 생성자를 사용한 매핑
  • 속성 직렬화 사용자 지정
  • 추가 요소 지원
  • 동적 직렬화 속성
  • 추가 정보
  • API 문서

이 가이드에서는 MongoDB .NET/C# 드라이버가 BSON 문서를 C# 클래스와 매핑하는 방식을 사용자 지정하는 방법에 대해 설명합니다. 기본 클래스 매핑 동작에 대해 자세히 알아보거나 드라이버가 데이터를 직렬화 또는 역직렬화하는 방식을 사용자 지정해야 하는 경우 이 페이지를 읽어야 합니다.

BsonDocument가 아닌 클래스를 사용하여 MongoDB 컬렉션의 데이터를 나타내는 경우, .NET/C# 드라이버는 데이터를 직렬화하거나 역직렬화하는 데 사용하는 클래스 맵을 자동으로 생성합니다. 문서의 필드 이름을 클래스의 속성 이름과 일치시켜 이 매핑을 수행합니다.

중요

클래스의 속성 유형은 문서의 필드 유형과 일치해야 합니다. .NET/C# 드라이버는 클래스의 속성 유형을 기반으로 직렬 변환기를 인스턴스화합니다. 드라이버가 데이터를 역직렬화하려고 할 때 유형이 일치하지 않으면 직렬 변환기에서 예외가 발생합니다.

드라이버의 자동 클래스 매핑 기능을 우회하고 RegisterClassMap() 메서드를 사용하여 클래스 맵을 수동으로 정의할 수 있습니다.

다음 예시에서는 Person 클래스를 정의합니다.

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
}

다음 코드는 Person 클래스에 대한 클래스 맵을 등록하는 방법을 보여 줍니다.

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.MapMember(p => p.Name);
classMap.MapMember(p => p.Age);
classMap.MapMember(p => p.Hobbies);
});

중요

코드가 필요로 하기 전에 전에 클래스 맵을 등록해야 합니다. MongoDB와의 연결을 초기화하기 전에 클래스 맵을 등록하는 것이 좋습니다.

또한 클래스 속성의 하위 집합을 수동으로 매핑할 수 있지만 드라이버가 나머지 속성을 자동으로 매핑하도록 할 수 있습니다. 이렇게 하려면 속성을 수동으로 지정하기 전에 클래스 맵을 등록하고 AutoMap() 메서드를 호출합니다.

다음 코드 예시에서 AutoMap() 메서드는 Person 클래스의 모든 속성을 매핑한 다음 Hobbies 필드에 대한 매핑을 수동으로 조정합니다.

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.MapMember(p => p.Hobbies).SetElementName("favorite_hobbies");
});

클래스와 함께 특성을 사용하거나 클래스 맵을 등록하는 동안 메서드를 호출하여 클래스 수준에서 드라이버가 문서를 직렬화하고 역직렬화하는 방법을 사용자 지정할 수 있습니다.

BSON 문서가 C# 클래스로 역직렬화되면 .NET/C# 드라이버는 문서의 각 필드 이름을 살펴보고 클래스에서 일치하는 속성 이름을 찾으려고 합니다. 기본적으로 문서의 필드에 클래스에 일치하는 항목이 없는 경우 드라이버는 예외를 발생시킵니다.

BsonIgnoreExtraElements 특성을 사용하여 일치하는 클래스 속성이 없는 모든 요소를 무시하도록 선택할 수 있습니다. 이렇게 하면 드라이버가 예외를 발생시키는 것을 방지하고 일치하는 클래스 속성이 있는 다른 필드를 매핑합니다.

다음 예시에서는 클래스에 BsonIgnoreExtraElements 특성을 추가하는 방법을 보여 줍니다.

[BsonIgnoreExtraElements]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
}

클래스 맵을 등록할 때 추가 요소를 무시할 수도 있습니다.

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);
});

기본적으로 .NET/C# 드라이버는 클래스에 인수가 없는 생성자가 있는 경우에만 클래스를 자동으로 매핑할 수 있습니다. 드라이버가 하나 이상의 인수를 허용하는 생성자를 사용하도록 하려면 생성자에 BsonConstructor 특성을 추가하면 됩니다. 이 경우 드라이버는 유형을 검사하여 생성자 인수를 클래스 속성 또는 필드에 매핑하는 방법을 결정합니다.

드라이버는 다음 Person 클래스에 대한 클래스 맵을 생성할 때 BsonConstructor 특성으로 표시된 생성자를 사용합니다. name 인수는 Name 속성에 매핑되고 age 인수는 Age 속성에 매핑됩니다.

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
[BsonConstructor]
public Person(string name, string age)
{
Name = name;
Age = age;
}
}

여러 BsonConstructor 특성

BsonConstructor 특성을 가진 생성자가 두 개 이상 있는 경우 드라이버는 문서에서 일치하는 필드가 있는 매개변수가 가장 많은 생성자를 사용합니다.

클래스 맵을 등록할 때 사용할 생성자를 지정할 수도 있습니다.

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
public Person(string name, string age)
{
Name = name;
Age = age;
}
}
BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.MapCreator(p => new Person(p.Name, p.Age));
});

속성에 특성을 추가하여 드라이버가 클래스 속성을 직렬화하는 방법을 사용자 지정할 수 있습니다. 사용자 지정 속성 직렬화에 대한 자세한 내용은 사용자 지정 직렬화를 참조하세요.

일치하는 클래스 속성이 없는 문서에 추가 요소를 저장하도록 C# 클래스를 설계할 수 있습니다. 이렇게 하려면 클래스에 추가 요소를 보유할 BsonDocument 유형 속성이 있어야 합니다.

다음 코드는 ExtraElements 속성과 함께 BsonExtraElements 특성을 사용하여 드라이버에 추가 요소를 저장하도록 지시합니다.

public class Person
{
public string Name { get; set;
public int Age { get; set; }
public List<string> Hobbies {get; set;}
[BsonExtraElements]
public BsonDocument ExtraElements {get; set;}
}

클래스 맵을 초기화할 때 다음과 같이 추가 요소를 지원할 수도 있습니다.

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.MapExtraElementsMember(p => p.ExtraElements);
});

참고

드라이버가 추가 요소가 포함된 클래스를 다시 BSON으로 직렬화하면 추가 요소의 순서가 원본 문서의 순서와 동일하지 않을 수 있습니다.

메서드를 사용하여 속성을 직렬화할지 여부를 결정할 수 있습니다. 드라이버가 직렬화할 때 메서드를 자동으로 사용하려면 메서드 이름 앞에 ShouldSerialize를 붙이고 그 뒤에 메서드가 적용되는 속성 이름을 붙여야 합니다. 드라이버는 이 명명 규칙을 가진 메서드를 발견하면 해당 메서드를 사용하여 제공된 속성 이름을 가진 속성을 직렬화할지 여부를 결정합니다.

다음 예에서는 값이 0과 같지 않은 경우에만 Age 속성을 직렬화하는 메서드를 만듭니다. 드라이버는 값이 이 요구 사항을 충족하지 않는 속성은 직렬화하지 않습니다.

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
public bool ShouldSerializeAge()
{
return Age != 0;
}
}

클래스 맵을 등록하는 동안 메서드를 지정할 수도 있습니다.

BsonClassMap.RegisterClassMap<Employee>(classMap =>
{
classMap.AutoMap();
classMap.MapMember(p => c.Age).SetShouldSerializeMethod(
obj => ((Person) obj).Age != 0
);
});

C# 클래스 사용에 대한 자세한 내용은 POCO를 참조하세요.

  • BsonClassMap

  • RegisterClassMap

  • AutoMap

돌아가기

직렬화