Hash Mapping 포스팅에서 살펴봤던 것처럼 Redis는 HashMapper
를 이용해 객체를 Hash로 변환한다.
이러한 HashMapper
들은 주어진 객체를 key-value 쌍의 Map으로 변환시켜 Redis에 저장하는 역할을 수행한다.
과거 포스팅에서 Object-to-Hash Mapping을 사용하는 ObjectHashMapper
라고 소개했는데,
클래스 주석을 살펴보면 MappingRedisConverter
에 기반을 두고있다는 소개를 확인할 수 있다.
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);
}
}
예를들어, Address
와 Byte[]
간 변환을 이뤄주는 Converter를 구현했다고 가정해보자.
각 Converter들은 Jackson2JsonRedisSerializer
를 이용하여 JSON 형태의 byte[]
를 입출력으로 받는다.
AddressToBytesConverter
는 Address
객체를 JSON 형태의 byte[]
로 변환시키며,
BytesToAddressConverter
는 byte[]
를 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
에 저장된다