

# .NET 객체 지속성 모델 및 DynamoDB로 작업
<a name="DotNetSDKHighLevel"></a>

AWS SDK for .NET은 객체 지속성 모델을 제공하므로 이것으로 클라이언트 측 클래스를 Amazon DynamoDB 테이블에 매핑할 수 있습니다. 그러면 각 객체 인스턴스도 해당 테이블 항목으로 매핑됩니다. 클라이언트 측 객체를 테이블에 저장하기 위해 객체 지속성 모델에서는 DynamoDB에 대한 진입점인 `DynamoDBContext` 클래스를 제공합니다. 이 클래스는 DynamoDB로 연결하는 역할을 하기 때문에 테이블에 액세스하여 다양한 CRUD 작업이 가능할 뿐만 아니라 쿼리를 실행할 수 있습니다.

객체 지속성 모델은 속성 세트를 제공하여 클라이언트 측 클래스를 테이블로 매핑할 수 있으며, 속성/필드를 테이블 속성으로 매핑할 수 있습니다.

**참고**  
객체 지속성 모델은 테이블을 생성, 업데이트 또는 삭제할 수 있는 API를 제공하지 않으며 데이터 작업만 제공합니다. 테이블 생성, 업데이트 및 삭제에는 AWS SDK for .NET 하위 수준 API만 사용할 수 있습니다.

다음 예제에서는 객체 지속성 모델이 작동하는 방법을 보여줍니다. `ProductCatalog` 테이블로 시작합니다. `Id`를 기본 키로 갖고 있습니다.

```
ProductCatalog(Id, ...)
```

`Book` 클래스를 `Title`, `ISBN` 및 `Authors` 속성과 함께 갖고 있는 경우 다음 C\$1 코드 예제와 같이 객체 지속성 모델로 정의된 속성을 추가하여 `Book` 클래스를 `ProductCatalog` 테이블에 매핑할 수 있습니다.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]
    public int Id { get; set; }

    public string Title { get; set; }
    public int ISBN { get; set; }

    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }

    [DynamoDBIgnore]
    public string CoverPage { get; set; }
  }
```

앞의 예제에서는 `DynamoDBTable` 속성이 `Book` 클래스를 `ProductCatalog` 테이블에 매핑합니다.

객체 지속성 모델은 클래스 속성 및 테이블 속성 간 명시적 매핑과 기본 매핑 모두를 지원합니다.
+ **명시적 매핑** - 속성을 기본 키에 매핑하려면 `DynamoDBHashKey` 및 `DynamoDBRangeKey` 객체 지속성 모델 속성을 사용해야 합니다. 또한 기본이 아닌 키 속성의 경우 클래스의 속성 이름과 이를 매핑하려는 해당 테이블 속성이 같지 않다면 `DynamoDBProperty` 속성을 명시적으로 추가하여 매핑을 정의해야 합니다.

  앞의 예제에서는 `Id` 속성이 같은 이름의 기본 키로 매핑되고 `BookAuthors` 속성이 `Authors` 테이블의 `ProductCatalog` 속성으로 매핑됩니다.
+ **기본 매핑** - 기본적으로 객체 지속성 모델은 클래스 속성을 같은 이름의 테이블 속성으로 매핑합니다.

  앞의 예제에서는 `Title` 및 `ISBN` 속성이 `ProductCatalog` 테이블에 있는 같은 이름의 속성으로 매핑됩니다.

각 클래스 속성을 전부 하나씩 매핑할 필요는 없습니다. `DynamoDBIgnore` 속성을 추가하여 이러한 속성을 확인할 수 있습니다. `Book` 인스턴스를 테이블에 저장하더라도 `DynamoDBContext`에는 `CoverPage` 속성이 포함되지 않습니다. 또한 이러한 책 인스턴스를 가져와도 이 속성은 반환되지 않습니다.

int 및 문자열과 같은 .NET 기본 유형의 속성을 매핑할 수 있습니다. 적절한 변환기를 사용하여 임의 데이터를 DynamoDB 형식 중 하나로 매핑만 한다면 어떤 임의 데이터 형식도 매핑할 수 있습니다. 임의 유형 매핑에 대한 자세한 내용은 [AWS SDK for .NET 객체 지속성 모델을 사용하여 DynamoDB에서 임의 데이터 매핑](DynamoDBContext.ArbitraryDataMapping.md) 단원을 참조하세요.

객체 지속성 모델은 낙관적 잠금을 지원합니다. 따라서 업데이트 작업 동안 업데이트하려는 항목의 최신 복사본을 가질 수 있습니다. 자세한 내용은 [DynamoDB 및 AWS SDK for .NET 객체 지속성 모델을 사용하여 낙관적 잠금 수행](DynamoDBContext.VersionSupport.md) 섹션을 참조하세요.

자세한 내용은 아래 주제를 참조하십시오.

**Topics**
+ [지원되는 데이터 유형](#DotNetDynamoDBContext.SupportedTypes)
+ [.NET 객체 지속성 모델의 DynamoDB 속성](DeclarativeTagsList.md)
+ [.NET 객체 지속성 모델의 DynamoDBContext 클래스](DotNetDynamoDBContext.md)
+ [DynamoDB 및 AWS SDK for .NET 객체 지속성 모델을 사용하여 낙관적 잠금 수행](DynamoDBContext.VersionSupport.md)
+ [AWS SDK for .NET 객체 지속성 모델을 사용하여 DynamoDB에서 임의 데이터 매핑](DynamoDBContext.ArbitraryDataMapping.md)

## 지원되는 데이터 유형
<a name="DotNetDynamoDBContext.SupportedTypes"></a>

객체 지속성 모델은 기본 .NET 데이터 유형 세트와 컬렉션, 그리고 임의 데이터 유형을 지원합니다. 모델이 지원하는 기본 데이터 유형은 다음과 같습니다.
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

객체 지속성 모델은 .NET 컬렉션 형식도 지원합니다. `DynamoDBContext`는 구체적인 컬렉션 형식과 단순한 POCO(Plain Old CLR Object)를 변환할 수 있습니다.

다음 표에서는 앞서 나온 .NET 형식을 DynamoDB 형식으로 매핑하는 것을 요약하여 보여 줍니다.


****  

| .NET 기본 유형 | DynamoDB 형식 | 
| --- | --- | 
|  모두 숫자 형식  |  `N`(숫자 형식)  | 
|  모든 문자열 형식  |  `S`(문자열 형식)   | 
|  MemoryStream, byte[]  |  `B`(이진수 형식)   | 
| bool | N(숫자 형식). 0은 false를 나타내고 1은 true를 나타냅니다. | 
| 컬렉션 유형 | BS(이진수 세트) 형식, SS(문자열 세트) 형식, 그리고 NS(숫자 세트) 형식 | 
| DateTime | S(문자열 형식) DateTime 값은 ISO-8601 형식의 문자열로 저장됩니다. | 

객체 지속성 모델은 임의 데이터 형식 또한 지원합니다. 하지만 여러 형식을 DynamoDB 형식으로 매핑하려면 변환기 코드를 입력해야 합니다.

**참고**  
빈 이진수 값이 지원됩니다.
빈 문자열 값 읽기가 지원됩니다. DynamoDB에 쓰는 동안 문자열 집합 형식의 속성 값에서 빈 문자열 속성 값이 지원됩니다. 문자열 형식의 빈 문자열 속성 값과 목록 또는 맵 형식에 포함된 빈 문자열 값은 쓰기 요청에서 삭제됩니다.