RedisTemplate방식, annotation 방식, Spring Data JPA 방식 모두 알아볼 것
필기 내용
spring data repository 이슈
gradle 의존성에 jpa, redis 추가한 경우 각각 spring data repository를 자동으로 설정하게 된다.
그래서 각각에 대해서 repository를 특정 package로 바라보게끔 설정했다.
@Configuration
@EnableRedisRepositories(basePackages = ["io.beaniejoy.dongnecafe.infra.redis.repository"])
class RedisConfig
@Configuration
@EnableJpaAuditing
class JpaConfig
이 때 에러는 아니지만 애플리케이션 실행시 이상한 로그가 나오게 된다.
Spring Data Redis - Could not safely identify store assignment for repository candidate interface io.beaniejoy.dongnecafe.db.cafe.repository.CafeMenuCategoryRepository. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository.
즉 Redis에 대해서 repository 지정하려고 했는데 이게 어떤 repository인지 구별이 어렵다 대충 이런 뜻
(왜냐하면 jpa repository도 있기 때문에)
그래서 이부분에 대해서 yaml에 다음과 같이 설정하라는 얘기도 있다.
spring:
data:
redis:
repositories:
enabled: false
하지만 위의 로그는 내가 지정한 redis 전용 repository에 아무런 repository interface가 없고
거기에 @RedisHash로 지정한 Entity가 없어서 나온 것이다.
그래서 redis repository를 사용할 Entity에 RedisHash 어노테이션 지정하고 그에 대한 repository 설정하면 저런 로그는 안 나올 것이다.
Multiple Spring Data modules found, entering strict repository configuration mode!
INFO 28216 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
INFO 28216 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 184 ms. Found 6 JPA repository interfaces.
INFO 28216 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
INFO 28216 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
INFO 28216 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 1 Redis repository interfaces.
최종적으로 나오는 로그, JPA 전용 repository 6개 스캔했고, redis 전용 repository 1개 스캔완료했다는 의미
RedisHash
@RedisHash("auth_tokens")
class AuthToken protected constructor(
id: Long,
accessToken: String,
refreshToken: String
) : BaseTimeEntity() {
@Id
var id: Long = id
protected set
//...
}
@Id의 필드는 똑같이 id이어야 한다. (생성자 필드도 id로 동일해야 한다.)
@Indexed 사용시 @Id를 통해 생성된 redis key와 별개로 또다른 index가 생성된다. (메모리 측면에서 비효율적일 수 있음, 불필요한 index 추가)
필기 내용
spring data repository 이슈
gradle 의존성에 jpa, redis 추가한 경우 각각 spring data repository를 자동으로 설정하게 된다.
그래서 각각에 대해서 repository를 특정 package로 바라보게끔 설정했다.
이 때 에러는 아니지만 애플리케이션 실행시 이상한 로그가 나오게 된다.
즉 Redis에 대해서 repository 지정하려고 했는데 이게 어떤 repository인지 구별이 어렵다 대충 이런 뜻
(왜냐하면 jpa repository도 있기 때문에)
그래서 이부분에 대해서 yaml에 다음과 같이 설정하라는 얘기도 있다.
하지만 위의 로그는 내가 지정한 redis 전용 repository에 아무런 repository interface가 없고
거기에
@RedisHash
로 지정한 Entity가 없어서 나온 것이다.그래서 redis repository를 사용할 Entity에 RedisHash 어노테이션 지정하고 그에 대한 repository 설정하면 저런 로그는 안 나올 것이다.
최종적으로 나오는 로그, JPA 전용 repository 6개 스캔했고, redis 전용 repository 1개 스캔완료했다는 의미
RedisHash