클래스 매핑
이 페이지의 내용
개요
이 가이드에서는 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# 드라이버는 클래스에 인수가 없는 생성자가 있는 경우에만 클래스를 자동으로 매핑할 수 있습니다. 드라이버가 하나 이상의 인수를 허용하는 생성자를 사용하도록 하려면 생성자에 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를 참조하세요.