과연 캐시의 문제였을까?

Hyunsoo Kim·2024년 4월 22일
0

에러 해결기

목록 보기
2/5

이슈

데이터가 정상적으로 수정되고, db에 반영이 되었고, 새로고침이 수행되었음에도 화면에 데이터가 반영되지 않는 문제였다.

다만 재로그인을 하면 수정된 데이터가 반영되는 걸 보고, 캐시 문제라 판단하여 관련 코드를 들여다 보았다.


EHCACHE란?

EhCache는 캐시를 캐시 저장소에 만료기간과 함께 저장하고, 사용자 요청이 있을 때 만료시간 전이라면 해당 저장소에 있는 데이터를 쓰는 방식이다.

데이터를 얻어오기 위해 매번 쿼리를 날려 DB에 접근하는 방법은 효율적이지 못한 만큼, 데이터가 자주 변하지 않는 경우라면 캐시에 저장해서 사용하는 편이 좋다.

캐시는 서버의 부담을 줄이고 성능을 높이기 위해 사용되는 기술이다. 자주 사용하는 데이터와 값을 미리 복사하여 임시저장소에 넣어둔다고 생각하면 편하다.

고로 캐시에 저장된 값이 변경되어도 즉각 반영되지 않을 수 있다.


해결과정

1. 첫번째 시도: cache.put()

@Cacheable을 사용해 cache.put() 메소드를 작성했다.


  Cache cache = cacheManager.getCache("캐시이름");
  cache.put("캐시 이름", "데이터");

put() 메소드는 캐시를 수정할 때 사용된다. 고로, 수정된 데이터를 캐시에 put하여 수정하고자 했다.


결과

  • put을 했음에도 반영되지 않았다.

2. 두번째 시도: cache.evict()

cache.evict() 메소드를 통해 저장된 캐시를 한번 지우고, 다시 put을 밀어넣는 방식도 적용해 보았다.

  Cache cache = cacheManager.getCache("캐시이름");
  cache.evict("캐시 이름");
  cache.put("캐시 이름", "데이터");
 

이 방법은 데이터를 가져오고 나서 캐시를 제거하고 다시 추가하기 때문에 성능상의 문제가 있을 수 있다. 그러나 비웠다가 다시 넣는 방식이면 의도한 동작이 가능해질 로직이라고 판단하여, 구현해보기로 했다.


결과

  • evict도 반영되지 않았다.
  • 여기서부터 슬슬 감이 안 잡히기 시작했다. 정말 캐시 관련해서 발생한 문제가 맞을까? 캐시를 비우고 다시 넣었는데도 해결이 안 된다고...?

3. 세번째 시도: @CachePut

@CachePut은 캐시 내용 수정을 담당한다. @Cacheable과 유사하게 실행 결과를 저장하지만, 조회 시에 저장된 캐시 내용을 사용하지 않고 항상 메서드를 실행한다.

메서드 실행엔 영향을 주지 않고, 캐시를 갱신해야 하는 경우에만 사용한다.

캐시 갱신을 위해 시도해보았다.

결과

  • 반영되지 않았다....

4. 네번째 시도: 메소드 분리

원래 DB와 캐시를 같은 메소드에서 처리했다. 로직 순서 상 문제가 발생했을 수도 있다고 생각하여 캐시 처리 로직을 따로 분리했다. 이후 @CacheEvict를 통해 캐시를 한번 비우고 다시 캐시를 받았다.

결과

  • 원하는 대로 반영이 되었다!!!!

소감

처음 이슈를 받았을 때는 금방 해결할 수 있으리라고 생각했다. 그러나 여러 방법을 강구하고, 시도해보아도 픽스할 수가 없었다. 하루 이상 끌다가 사수님께 힘들 것 같다고 보고를 드리기까지 했다.

오랜 시간을 투자하여 고민했음에도 불구하고, 제대로 되지 않자 화도 나도 한편으론 속상해졌다. 자바 관련하여 처음으로 받은 과제인 데다가, 신입이 충분히 해결할 수 있으리란 판단 하에 넘겨주셨을 텐데 쩔쩔 매는 나의 모습에 여러 감정이 스쳐 지나갔다.

하지만 결국 오래 걸리더라도 해결해냈다! 우테코에서 강조했던 메소드를 분리해야 하는 이유를 납득하게 됐던 시간이었다.
또, 캐시에 대해서 배우고 좀 더 공부하는 시간을 가졌던 게 이후에 도움이 되리라고 생각한다.

profile
다부진 미래를 만들어가는 개발자

0개의 댓글