개요
이 가이드 에서는 MongoDB .NET/ C# 드라이버 BSON 문서를 C# 클래스와 매핑하는 방식을 사용자 지정하는 방법을 학습 수 있습니다. 이 페이지를 읽고 기본값 클래스 매핑 동작에 대해 자세히 학습 운전자 데이터를 직렬화 또는 역직렬화하는 방식을 사용자 지정해야 하는지 여부를 확인할 수 있습니다.
POCO 속성을 사용하여 직렬화 동작을 설정하다 수도 있습니다. 자세한 학습 은 POCO 가이드 참조하세요.
자동 클래스 매핑
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"); });
클래스 직렬화 사용자 지정
클래스에 속성을 적용하거나 클래스 맵을 등록하는 동안 메서드를 호출하여 운전자 클래스 수준에서 문서를 직렬화 및 역직렬화하는 방법을 사용자 지정할 수 있습니다.
필드 생략
클래스 맵을 등록할 때 UnmapMember()
메서드를 사용하여 지정된 필드의 직렬화를 방지할 수 있습니다.
다음 예시 Age
속성 직렬화되지 않도록 클래스 맵을 만드는 방법을 보여 줍니다.
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.UnmapMember(p => p.Age); });
팁
필드 속성을 사용하여 이 동작을 설정하는 방법을 알아보려면 POCO 가이드의 필드 생략 섹션을 참조하세요.
추가 요소 무시
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); });
Id 필드 식별
기본적으로 드라이버는 Id
, id
또는 _id
라는 공개 속성을 BSON _id
필드에 매핑합니다. _id
필드에 매핑할 속성을 명시적으로 선택하려면 MapIdMember()
클래스 맵 메서드를 사용하세요.
다음 코드 샘플에서는 Identifier
속성을 _id
필드에 매핑합니다.
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapIdMember(p => p.Identifier); });
문자열 ID
문서 ID를 string으로 나타내는 경우 IdMemberMap.SetSerializer()
클래스 맵 메서드를 사용하여 이러한 값을 MongoDB의 ObjectId
인스턴스로 직렬화할 수 있습니다. 이렇게 하면 데이터베이스에서 ID를 관리하기 위한 MongoDB 모범 사례를 준수하는 동시에 애플리케이션에서 ID 값이 표현되는 방식을 사용자 지정할 수 있습니다.
다음 예시는 드라이버가 string ID 값을 ObjectId
값으로 직렬화하도록 지시합니다.
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); });
드라이버가 ID 값으로 사용할 유효한 24자리 16진수 string을 생성하도록 하려면 SetIdGenerator()
메서드를 MapIdMember()
메서드에 연결하고 StringObjectIdGenerator
인스턴스를 전달하면 됩니다.
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapIdMember(p => p.Identifier).SetIdGenerator(StringObjectIdGenerator.Instance); });
ID 생성기에 대해 자세히 알아보려면 POCO 가이드의 ID 생성기 지정 섹션을 참조하세요.
GUID ID
애플리케이션이 문서에서 GUID를 고유 식별자로 사용하는 경우 클래스 맵을 등록하여 Guid
값의 직렬화 방식을 지정할 수 있습니다. 기본적으로 드라이버는 GuidGenerator
유형을 사용하여 ID 속성에 대한 고유한 값을 생성합니다. GuidSerializer
를 초기화하여 GUID 표현을 지정해야 합니다.
다음 코드는 클래스 맵을 등록할 때 Standard
GUID 표현을 지정합니다.
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.IdMemberMap.SetSerializer(new GuidSerializer(GuidRepresentation.Standard)); });
GUID 직렬화에 대해 자세히 학습 GUID 가이드 참조하세요.
생성자를 사용한 매핑
기본적으로 .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를 참조하세요.