개요
이 가이드에서는 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 특성을 추가하는 방법을 보여 줍니다.
[] 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# 드라이버 클래스에 인수가 없는 생성자가 있는 경우 클래스를 자동으로 매핑합니다. 이 생성자는 private를 포함한 모든 액세스 수정자를 가질 수 있습니다. 운전자 인수를 허용하는 생성자를 사용하도록 하려면 생성자에 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;} [] 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;} [] 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를 참조하세요.