앞선 포스팅에서는 RedisTemplate
을 이용한 상호작용 방법을 알아볼 수 있었다.
템플릿 객체를 Configuration에 등록하고 Bean으로 주입받아 사용하거나, 직접 생성하는 방식으로 사용할 수 있었다.
이러한 사용방식은 Redis를 애플리케이션에 적극적으로 사용하는 경우,
중복되는 코드작성을 야기할 수 있고 Redis에 저장될 객체들을 관리하는데 어려움을 겪을 수 있다.
Spring Data에서는 이러한 문제개선을 위해 Repository 추상화를 제공하고 있으며, 이는 Redis 사용에도 적용된다.
Spring Data의 Repository 추상화의 핵심클래스는 Repository
다.
보통은 CRUD기능을 지원하는 하위클래스인 CrudRepository
나 ListCrudRepository
를 사용하는게 일반적이다.
페이징 기능을 원한다면
PagingAndSortingRepository
나ListPagingAndSortingRepository
를 고려해볼 수 있다
또한, Spring Data JPA에서 그랬듯이 메서드 명칭을 이용한 쿼리파생도 그대로 사용할 수 있다.
@RedisHash("people")
public class Person {
@Id String id;
String firstname;
String lastname;
Address address;
}
Spring Data Redis의 도메인 객체는 @RedisHash
와 @Id
애노테이션을 이용해 설정할 수 있다.
이때, @Id
애노테이션은 org.springframework.data.annotation.Id
를 사용해야한다.
한 도메인 클래스를 JPA와 Redis 양쪽에서 사용할 수 있을까?
결론부터 말하자면 가능하다. 다만, JPA와 Redis를 함께 사용하는 경우 Bean 생성을 위한 로직이 각각 실행되므로 중복되는 Bean 명칭으로 인한 오류가 발생한다.
이 경우, 별도의 패키지로 Repository를 구분하여 관리해주거나 Filter를 이용한 작업처리가 필요하다.
만약, Spring Boot 환경이 아니라면 별도의 Java 설정파일을 작성해야한다.
@Configuration
@EnableRedisRepositories
public class ApplicationConfig {
@Bean
public RedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}