[Spring] Cache 적용으로 읽기 성능 최적화하기 (1)

bagt13·2023년 2월 19일
1

Project

목록 보기
13/19
post-thumbnail
post-custom-banner

✅ Cache(캐시) 적용?

캐시를 적용하면 읽기(조회) 성능을 향상시킬 수 있다.

RDB의 경우, disk에 접근해야하기 때문에 상대적으로 연산 수행이 오래 걸린다. 반면 redis와 같은 캐시는 메모리에서 동작하기 때문에 상대적으로 빠르게 연산을 수행할 수 있다.


일반적인 캐싱 시 조회 과정은 다음과 같다.

  1. 최초 조회 시에는 캐시 데이터가 없기 때문에, DB 접근 조회 후 캐시에 저장한다.

  2. 그리고 다음 요청 부터는 캐시에 저장된 데이터를 반환하며, update와 같이 조회 데이터에 변경이 일어날 경우 캐시를 갱신한다.



✅ 언제 캐시를 사용해야할까?

캐시를 사용하면 읽기 성능을 향상시킬 수 있지만, 아무데나 사용해서는 안된다. 데이터가 update될 때마다 캐시도 함께 update 해줘야 하며, 캐시에 데이터가 과하게 많이 쌓일 경우에도 side effect가 발생할 수 있기 때문이다.

🔆 캐시를 사용하면 좋은 경우

  • 자주 변경되지 않는 데이터

    • update가 자주 일어난다면, 캐시 삭제 및 DB 접근 횟수가 늘어나 오히려 악영향을 끼칠 수 있다.
  • 자주 조회되는 데이터

    • 조회되는 횟수만큼 DB 접근이 줄어들기 때문에 성능 개선을 기대할 수 있다.


✅ 캐싱 전략

캐싱 전략에는 로컬 캐싱과 글로벌 캐싱이 있다. 즉, 어디에다 캐시를 저장할거냐? 의 문제이다.


📒 로컬 캐싱 (Local Caching)

로컬 캐싱은 서버 내부 저장소에 캐시 데이터를 저장하는 방법이다.

장점

  • 글로벌 캐싱에 비해 속도가 빠르다.

단점

  • 서버 간의 데이터가 공유되지 않는다.

  • 각 서버의 캐시가 서로 다른 상태를 가질 수 있기 때문에, 일관성 문제가 발생할 수 있다.


📒 글로벌 캐싱 (Global Caching)

별도의 캐시 서버를 두어 각 서버에서 캐시 서버에 접근한다.

글로벌 캐싱은 캐시 서버로의 네트워크 트래픽이 발생하기 때문에 로컬 캐싱보다 상대적으로 속도가 느리다.

하지만 앞서 봤던 서버 간의 데이터 공유가 불가능하다는 로컬 캐싱의 치명적인 단점이 사라진다.

실무에서는 여러 서버를 사용해야 하기 때문에, 별도의 redis 캐시 서버를 두어 글로벌 캐싱을 사용하기로 했다.


다음 포스트

Spring Cache 적용으로 읽기 성능 최적화하기 2편

profile
주니어 백엔드 개발자입니다😄
post-custom-banner

0개의 댓글