cache
예전에 면접을 보러 다닐 때 캐시에 대해 질문을 받은 적이 있다. 궁색한 변명이지만, 당시에는 캐시가 컴퓨터 구조에서 사용하는 용어이고 내가 당장 알기 어려운 것이라 생각했다. 당연히 대답은 못했다. 그런데 웹 프론트엔드 개발자에게도 캐시란 매우 중요하고 꼭 알아야 하는 개념이었다.
혼자 끄적이면서 공부한 것을 정리해 보았다.
1. cache의 정의
cache는 동일한 데이터에 반복해서 접근해야 하거나 많은 연산이 필요한 일일 때, 결과를 빠르게 이용하고자 성능이 좋은 (혹은 가까운) 곳에 저장하는 것이라고 말할 수 있을 것 같다.
가령 한번 접속한 웹사이트에 동일한 브라우저로 다시 접속할 때, 용량이 큰 이미지나 비디오 등은 다시 받아오지 않고 브라우저 캐시에 저장해 놨다가 동일하게 가져다 쓸 수 있다. 이를 통해 훨씬 빠르게 웹사이트의 콘텐츠를 볼 수 있다.
이처럼 캐시를 사용하면 과거에 계산한 데이터를 효율적으로 재사용할 수 있다. 지금 생각해보면 캐시 없이 개발을 한다는 생각을 할 수가 없다.
2. 캐시의 종류
캐시 메모리
먼저, 컴퓨터 내에 cache가 있다. CPU에서 가장 빠른 Register와 메인 메모리 사이에 캐시 메모리가 존재한다. 디스크 혹은 메모리에서 읽어온 데이터를 빠르게 저장하는 용도이다.
캐시가 없던 시절, CPU가 데이터를 요청하면 데이터를 메모리에서 레지스터로 바로 가져왔다. CPU 처리속도는 빨라지는데, 연산에 필요한 데이터가 도착하지 않으면 기다려야 했다. 이때 등장한 것이 캐시다.
CPU의 요청에 따라 메인 메모리에서 해당 데이터와 함께 인접한 데이터로 이뤄진 메모리 블록을 캐시 메모리로 가지고 온다. CPU가 다시 데이터를 요청하면 메인 메모리가 아니라 캐시에 요청을 해보고, 캐시에서 해당 데이터를 읽어온다. 없으면, 다시 메인 메모리에서 읽어온다.
레지스터가 가장 빠르고 성능이 좋지만, 가격이 매우 비싸다. 따라서, 자주 사용하는 데이터를 캐싱함으로서 좋은 효과를 얻을 수 있다.
브라우저 캐시
브라우저는 앞서 이야기했던 이미지, 비디오뿐 아니라, CSS, JavaScript 등 정적 리소스를 로컬에 저장하여 성능을 향상시킨다.
캐시 사용 여부나 최대 캐시 유효성 기간 등은 HTTP 헤더를 이용하여 설정해둘 수 있다.
성능이 중요한 만큼 데이터 변경 여부에 따라 새로운 데이터로 갱신하는 일도 매우 중요하다. 따라서, 최적의 캐시 기간을 설정하고 변경여부에 따라 갱신하거나 유지하도록 하는 것이 중요하다.
ETag 토큰을 서버에서 보내주면, 파일에 대한 해시값 혹은 식별자가 포함되어 파일 변경 여부를 확인하고 다운로드를 건너뛰기도 하고 갱신하기도 한다.
또, 파일 이름을 적절하게 수정하여 URL을 변경한다면 바뀐 데이터를 무조건 리로딩 하게 된다. 가령 CSS를 변경하였으나 캐시가 적용되는 시간을 초과하지 않았다면, 해당 CSS를 로드하는 URL이 변경될 수 있도록 파일 이름을 적절히 수정해줄 수 있다.
데이터베이스 + Redis
데이터베이스에서도 캐싱이 일어난다. 이때, 쿼리를 결과를 캐시에 담아둘 수 있다. MySQL에서는 쿼리의 결과물을 메모리에 캐싱해둘 수 있다.
대량의 데이터를 캐시할 필요성이 있거나 여러 서버에 있는 데이터를 동기화하고자 하는 목적에서, Redis 같은 Cache 서비스를 이용하기도 한다.
Redis는 key-value 타입 데이터베이스이며, 인메모리 엔진을 사용한다. 성능과 확장성이 뛰어나며, 다양한 자료구조를 지원하므로 여러 용도로 사용된다.
이와 같은 목적에서 캐시 서버를 따로 두거나, CDN 서비스를 사용하기도 한다. 데이터 원본을 일정한 기간 간격 대로 복제하거나 변경사항을 임시 저장하는 역할을 한다.
Redux
React의 상태 저장소인 Redux도 캐시처럼 사용될 수 있다. 데이터를 정규화해놓고, 통신 없이 각기 다른 상태를 브라우저에 저장하고 사용할 수도 있다.
3. 캐시를 설계할 때 고려할 점
먼저, 속도와 비용 중 어느 것을 택할 것인지를 면밀하게 고민해야 할 것 같다. 성능이 좋고 빠른 만큼의 효용가치가 있는지를 따져봐야 한다. 기껏 캐시에 저장해놨는데 해당 데이터를 잘 사용하지 않거나, 비용 대비 최적의 효과를 내지 못하는 경우가 발생할 수 있다.
또, 원본 데이터가 얼마나 자주 변경되는지도 중요하게 생각해야 한다. 원본과 달라질 가능성이 존재한다면, 캐시를 업데이트 해줘야 한다.