객체 저장

이번 수업에서는 클래스 객체를 저장하는 방법을 배우고 객체 저장 및 조회를 진행합니다.

이 코드는 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)

객체 저장

Previous:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다