프레임 워크 관점에서, 레디스에 저장된 데이터는 오직 바이트다. 레디스 자체는 다양한 유형을 지원하지만, 대부분의 경우 이는 데이터가 무엇을 나타내는지보다는 데이터가 저장되는 방식을 나타낸다. 정보를 문자열로 변환할지 다른 객체로 변환할지는 사용자가 결정할 수 있다.
Spring Data에서 사용자 유형과 원시 데이터 간의 변환은 org.springframework.data.redis.serializer
패키지의 Spring Data Redis에서 처리한다.
이 패키지에는 이름에서 알 수 있듯이 직렬화 프로세스를 처리하는 두 가지 유형의 직렬화기가 포함되어 있다:
RedisSerializer
를 기반으로 하는 양방향 직렬화기RedisElementReader
및RedisElementWriter
를 사용하는 요소 리더와 라이터
위의 두 유형의 주요 차이점은 RedisSerializer
는 주로 byte[]
로 직렬화하는 반면, 요소 리더와 라이터는 ByteBuffer
를 사용한다는 점이다.
이 문서에서 이미 언급한 두 가지를 포함하여 여러 구현을 사용할 수 있다:
RedisCache
및RedisTemplate
에 기본적으로 사용되는JdkSerializationRedisSerializer
StringRedisSerializer
하지만, Spring OXM 지원을 통해 OxmSerializer
를 사용하여 객체를 XML로 매핑할 수도 있고, 데이터를 JSON 형식으로 저장하기 위해 Jackson2JsonRedisSerializer
또는 GenericJackson2JsonRedisSerializer
를 사용할 수도 있다.
저장 형식은 값에만 제한되지 않는다. 키, 값, 해시에 대해서도 제한 없이 사용할 수 있다.
Hash Mapping
Redis 내에서는 다양한 데이터 구조를 사용하여 데이터를 저장할 수 있다. Jackson2JsonRedisSerializer
는 객체를 JSON 형식으로 변환할 수 있다. 이상적으로는 JSON 데이터를 단순한 키를 사용하여 값으로 저장하는 것이 가능하다. 좀 더 정교하게 구조화된 객체를 매핑하려면 Redis의 해시를 사용할 수 있다.
Spring Data Redis는 용도에 따라 해시에 데이터를 매핑할 수 있는 여러 전략을 제공한다:
- 직접 매핑:
HashOperations
와 직렬화 도구를 사용하는 방법 - Redis 리포지토리 사용: Spring Data Redis가 제공하는
Repository
인터페이스를 사용하는 방법 HashMapper
와HashOperations
를 함께 사용하는 방법: 객체를 해시로 세분화하여 저장하고 조회하는 데 적합
Hash Mappers
HashMapper
는 객체를 Map<K, V>
형식으로 변환하거나 그 반대로 변환하는 컨버터다.
HashMapper
는 Redis의 Hash
구조와 함께 사용하기 위해 설계되었다.
여러 가지 구현체가 제공된다:
BeanUtilsHashMapper
: Spring의BeanUtils
를 활용하여 매핑ObjectHashMapper
: Java 객체를 바이트 배열 기반으로 해시 매핑Jackson2HashMapper
: Jackson 라이브러리를 사용해 JSON 기반으로 객체를 해시로 매핑
Jackson2HashMapper
Jackson2HashMapper
는 FasterXML Jackson
을 사용하여 도메인 객체에 대한 Redis 해시 매핑을 제공한다. Jackson2HashMapper
는 최상위 속성을 해시 필드 이름으로 매핑하고 선택적으로 구조를 플랫화할 수 있다. 단순한 유형은 단순한 값에 매핑된다. 복잡한 유형(중첩된 객체, 컬렉션, 맵 등)은 중첩된 JSON으로 표현됩니다.
평탄화는 중첩된 모든 속성에 대해 개별 해시 항목을 생성하고 가능한 한 복잡한 유형을 단순한 유형으로 변환한다.
평탄화를 적용하지 않은 경우
Hash Field | Value |
---|---|
firstname | Jon |
lastname | Snow |
address | { "city" : "Castle Black", "country" : "The North" } |
date | 1561543964015 |
localDateTime | 2018-01-02T12:13:14 |
평탄화를 적용한 경우
Hash Field | Value |
---|---|
firstname | Jon |
lastname | Snow |
address.city | Castle Black |
address.country | The North |
date | 1561543964015 |
localDateTime | 2018-01-02T12:13:14 |
'개발' 카테고리의 다른 글
Spring Data Redis Cache 정리 (0) | 2025.05.20 |
---|---|
Many to Many Relations (0) | 2025.05.19 |
선언형과 명령형 프로그래밍 정리 (0) | 2025.05.15 |
이벤트 소싱 정리 (0) | 2025.05.14 |
이벤트 드리븐 패턴 정리 (0) | 2025.05.13 |