RedisTemplate 의 객체지향

2024. 11. 20. 17:33Java

분명 지난 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