2024. 11. 20. 17:33ㆍJava
분명 지난 Kafka를 관련해서 블로그 글을 작성했습니다.
물론 계속 했습니다 그 이후도..근데 로그를 보고 있는데
Spring Data Redis - Could not safely identify store assignment for repository candidate interface forOlderJava.absurdityAppForJava.domain.cart.repository.CartItemRepository; 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
...
이런식으로 모든 도메인 레포지토리에 INFO 로그가 올라온다..
사실 가장 큰 문제는 Kafka 쪽이 크지만 이것도 마음에 들지 않기에 RedisConfig 부터 Service / Dto 등을 추가 수정했다.
RedisConfig
@Configuration
@EnableJpaRepositories(basePackages = {
"forOlderJava.absurdityAppForJava.domain.cart.repository",
"forOlderJava.absurdityAppForJava.domain.coupon.repository",
"forOlderJava.absurdityAppForJava.domain.event.repository",
"forOlderJava.absurdityAppForJava.domain.item.repository",
"forOlderJava.absurdityAppForJava.domain.member.repository",
"forOlderJava.absurdityAppForJava.domain.order.repository",
"forOlderJava.absurdityAppForJava.domain.payment.repository",
"forOlderJava.absurdityAppForJava.domain.younger.repository"
})
@EnableRedisRepositories(basePackages = {
"forOlderJava.absurdityAppForJava.domain.*.redis" // Redis 관련 repository만 따로 패키지로 분리
})
public class RepositoryConfig {
이 로그가 나오는 이유 중 하나는 JPA Repository와 Redis Repository 인지 모호해서 발생하는 경고 이기에
Config에서 Repository를 명확하게 구분해주는 작업을 했습니다.
또한 Redis Cache는 필요한 부분에만 적용해주어서 메모리 등의 향상을 노려 보았습니다.
적용된 도메인은
Coupon
// 적절한 사용 사례
- 사용 가능한 쿠폰 목록 캐싱
- 쿠폰 상세 정보 캐싱
- 자주 조회되는 인기 쿠폰 캐싱
Item
// 적절한 사용 사례
- 상품 상세 정보 캐싱
- 인기 상품 목록
- 최근 본 상품
- 상품 재고 수량 (실시간 업데이트 필요)
Event
// 적절한 사용 사례
- 진행 중인 이벤트 목록
- 이벤트 상세 정보
- 이벤트 참여 현황
Member
// 적절한 사용 사례
- 회원 프로필 정보
- 회원 등급/포인트 정보
- 로그인 세션 관리
Younger
// 적절한 사용 사례
- 심부름꾼 프로필/평점
- 활동 가능한 심부름꾼 목록
- 실시간 위치 정보
모든 도메인에 Redis를 적용하는 것보다 보다 활용에 용이한 것만을 골라서 적용 시켰습니다.
공통적인 특징:
읽기 작업이 쓰기 작업보다 훨씬 많음
데이터 일관성보다 성능이 중요
어느 정도의 데이터 지연(latency) 허용
// 1. 캐시 미스 전략 구현
public Optional<ItemRedisDto> getItemInfo(Long itemId) {
// 캐시 먼저 확인
// 없으면 DB 조회 후 캐시 갱신
}
// 2. 적절한 TTL 설정
redisTemplate.opsForValue().set(key, value, Duration.ofHours(24));
// 3. 배치 작업으로 캐시 미리 준비
@Scheduled(cron = "0 0 * * * *")
public void refreshPopularItems() {
// 인기 상품 목록 갱신
}
// 4. 캐시 무효화 전략
public void deleteItemCache(Long itemId) {
// DB 업데이트
// 캐시 삭제 또는 갱신
}
등의 전략을 구현했습니다.
public record ItemRedisDto(Long itemId, String name, int price, int discount,
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
LocalDateTime createdAt) {
public static ItemRedisDto from(final Item item) {
return new ItemRedisDto(
item.getId(), item.getName(), item.getPrice(), item.getDiscount(),
item.getCreatedAt());
}
}
Dto는 위와 같은 방식으로 전부 설계했습니다.
@Repository
public interface ItemCacheRepository extends CrudRepository<ItemCache, String> {
}
@RedisHash(value = "item_cache", timeToLive = 3600)
public class ItemCache {
@Id
private String id;
private String name;
private Integer price;
private Integer quantity;
private Integer discount;
private String description;
private ItemSortType itemSortType;
}
이렇게 RedisHash가 들어가는 도메인은 Repository도 구현 해주었습니다.
그 외 도메인은 RedisTemplate으로 충분히 커버가 가능하다고 (AI가)...
이제 가장 마음에 안든 로그는
logging:
level:
root: INFO
org.springframework.data.repository.config: ERROR # Repository 관련 로그를 ERROR 레벨로
org.springframework.data.redis: ERROR # Redis 관련 로그를 ERROR 레벨로
만약 prod 또는 local 등 환경을 나누어서 운영하는 방식은
spring:
profiles:
active: local # 또는 dev, prod
---
spring:
config:
activate:
on-profile: local
logging:
level:
root: INFO
org.springframework.data.repository.config: ERROR
---
spring:
config:
activate:
on-profile: prod
logging:
level:
root: ERROR
```
이 있습니다.
다음엔 Kafka를 해결해서 난항기를 해결기로 작성하는게 목표입니다.
'Java' 카테고리의 다른 글
Kafka 적응기 (1) | 2024.11.13 |
---|---|
Controller Restful 관련 (0) | 2024.11.11 |
JWT 그런데 OAuth2.0 곁들인 (2) (1) | 2024.11.10 |
JWT 그런데 OAuth2.0 곁들인 (1) | 2024.11.08 |
SSE(Server-Sent Events) (0) | 2024.11.06 |