이번 수업에서는 클래스 객체를 저장하는 방법을 배우고 객체 저장 및 조회를 진행합니다.
이 코드는 Memcached에서 기본 타입(int/bool)과 커스텀 클래스 객체를 저장하는 예시이며 자주 실수하는 핵심 포인트를 짚어줍니다.
커스텀 엔티티 클래스에는 반드시
[Serializable]특성을 지정해야 합니다. 지정하지 않으면 직렬화가 실패하고 객체를 읽어올 때null이 반환됩니다.
잘못된 작성 방식
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
// 기본 타입 저장 및 조회(int, bool은 기본 지원, 직렬화 속성 불필요)
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
// 커스텀 객체 저장
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person"); // 여기서 null이 나옵니다
Console.Read();
}
// 【오류】[Serializable] 누락
class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
발생 현상
var p = mClient.Get<Person>("person"); 실행 시 결과가 null로 돌아옵니다.
원인: EnyimMemcached는 기본적으로 .NET 바이너리 직렬화를 사용합니다. [Serializable] 특성이 없는 클래스는 직렬화할 수 없어 캐시에 저장한 뒤 역직렬화할 수 없습니다.
올바른 작성 방식
엔티티 클래스에 직렬화 특성을 추가합니다.
[Serializable] // 반드시 추가해야 함
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}Code language: JavaScript (javascript)
특성을 추가하면 Get<Person>("person")으로 객체 데이터를 정상적으로 가져올 수 있습니다.
추가 설명
// 제네릭 조회 : Get<T> 권장, 자동 타입 변환
var p = mClient.Get<Person>("person");
// 비제네릭 Get : object 타입이 반환되므로 수동 형변환 필요
var p2 = mClient.Get("person");Code language: JavaScript (javascript)
Get<T>(key): 제네릭 메서드, 우선 사용. 조회 실패 시 해당 타입의 기본값 반환(참조 타입은 null)Get(key): 원본object를 반환하므로 직접 형변환해야 함
전체 예제 코드
using Enyim.Caching;
using Enyim.Caching.Memcached;
using System;
[Serializable]
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public DateTime AddTime { set; get; }
}
class Program
{
static void Main(string[] args)
{
MemcachedClient mClient = new MemcachedClient();
mClient.Store(StoreMode.Set, "clicks", 1);
var clicks = mClient.Get<int>("clicks");
mClient.Store(StoreMode.Set, "isOk", true);
var isOk = mClient.Get<bool>("isOk");
var person = new Person { Id = 1, Name = "Jackson", AddTime = DateTime.Now };
mClient.Store(StoreMode.Set, "person", person);
var p = mClient.Get<Person>("person");
Console.WriteLine(p.Name); // Jackson 정상 출력
Console.Read();
}
}Code language: JavaScript (javascript)
객체 저장