Object-to-Hash Mapping

뾰족머리삼돌이·2024년 10월 22일
0

Spring Data Redis

목록 보기
12/12

Hash Mapping 포스팅에서 살펴봤던 것처럼 Redis는 HashMapper를 이용해 객체를 Hash로 변환한다.
이러한 HashMapper들은 주어진 객체를 key-value 쌍의 Map으로 변환시켜 Redis에 저장하는 역할을 수행한다.


과거 포스팅에서 Object-to-Hash Mapping을 사용하는 ObjectHashMapper 라고 소개했는데,

클래스 주석을 살펴보면 MappingRedisConverter에 기반을 두고있다는 소개를 확인할 수 있다.

Converter

Spring Repository는 객체를 해시로 변환시키는데 RedisConverter를 이용한다
Converter는 byte[]에서 속성 값을 매핑시키는 작업을 수행하는 데 사용된다.

_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
address.city = emond's field
address.country = andor

객체는 key-value 쌍의 형태로 변환되며, 그 과정에서 복합적인 타입의 경우 .을 이용한 구분자로 표현된다.
공식문서에서는 각 타입이 어떤 값 형태로 변환되는지를 표로 소개한다.

전체적으로 주어진 필드명을 key 값으로 생성하며, 배열이나 컬렉션인 경우 인덱스와 .을 이용하여 표현된다.

이러한 매핑동작은 RedisCustomConversions에 Converter를 등록함으로써 변경시킬 수 있다.
Converter 등록은 RedisCustomConversions 생성자를 통해 리스트의 형태로 등록시킬 수 있다.

예시

@Component
@WritingConverter
public class AddressToBytesConverter implements Converter<Address, byte[]> {

  private final Jackson2JsonRedisSerializer<Address> serializer;

  public AddressToBytesConverter() {

    serializer = new Jackson2JsonRedisSerializer<>(Address.class);
  }

  @Override
  public byte[] convert(Address value) {
    return serializer.serialize(value);
  }
}

@Component
@ReadingConverter
public class BytesToAddressConverter implements Converter<byte[], Address> {

  private final Jackson2JsonRedisSerializer<Address> serializer;

  public BytesToAddressConverter() {

    serializer = new Jackson2JsonRedisSerializer<>(Address.class);
  }

  @Override
  public Address convert(byte[] value) {
    return serializer.deserialize(value);
  }
}

예를들어, AddressByte[]간 변환을 이뤄주는 Converter를 구현했다고 가정해보자.
각 Converter들은 Jackson2JsonRedisSerializer를 이용하여 JSON 형태의 byte[]를 입출력으로 받는다.

AddressToBytesConverterAddress객체를 JSON 형태의 byte[]로 변환시키며,
BytesToAddressConverterbyte[]Address객체로 변환시킨다.

@Bean
public RedisCustomConversions redisCustomConversions(AddressToBytesConverter addressToBytes,
                                                     BytesToAddressConverter bytesToAddress) {
    return new RedisCustomConversions(Arrays.asList(addressToBytes, bytesToAddress));
}

마지막으로 Config 파일에 RedisCustomConversions Bean을 등록하면서 커스텀 Converter를 등록해준다.


커스텀 Converter를 등록시키지 않은 경우, 출력되는 결과는 아래와 같다.

커스텀 Converter로 생성된 출력결과는 아래와 같다

JSON 직렬화기를 이용했으므로, . 구분자 없이 문자열로 저장되는 것을 확인할 수 있다.

만약, 저장되는 _class 정보에 클래스 이름이 입력되는 것을 원하지 않는다면 @TypeAlias 를 사용할 수 있다.
도메인 클래스에 해당 애노테이션을 작성하면, 작성된 명칭이 _class에 저장된다

0개의 댓글

관련 채용 정보