최근 프로젝트를 진행하던 중 프론트엔드의 숙명 중 하나인 웹 최적화와 관련해 자료를 서치하던 중 Cache를 발견했다.
Cash 아니고 Cache다.
쿠키나 세션과 더불어 기본적인 개념은 알고 있었지만 딥하게 파보지는 않았기 때문에
이번 글에서 자세히 다뤄보고 실제로도 적용해 보기 위해 이렇게 글을 남긴다.
캐시(Cache)는 데이터나 리소스를 미리 저장해두어서, 다음에 같은 요청이 오면 저장해둔 데이터를 반환하여 빠른 응답 속도를 제공하는 기술이다.
캐시는 웹 애플리케이션에서 매우 중요한 역할을 하며 서버에서 클라이언트로 전송되는 데이터의 양을 줄이고, 응답 속도를 향상시키며, 서버 부하를 감소시키는 데 도움이 된다.
캐시는 여러 곳에서 사용될 수 있으며, 대표적인 예로는 브라우저 캐시, CDN(Content Delivery Network) 캐시, 데이터 캐시, 코드 캐시 등이 있다.
당연하게도 캐시를 사용하는 것을 캐싱이라고 한다!
캐시의 대표격인 캐시 메모리를 위주로 캐싱을 이해해보자.
캐시 메모리를 이해하려면 간단하게 컴퓨터의 동작 흐름에 대해 알아야 하는데 살펴보고 넘어가자.
RAM은 하드디스크에서 데이터를 불러오고 CPU는 램의 저장되어 있는 데이터를 이용하여 연산 작업을 수행하는 구조이다.
위 그래프는 CPU와 일반적으로 우리가 알고 있는 RAM간의 성능차이 그래프다.
CPU는 눈에 띄게 성능이 좋아진 반면 메모리는 그렇지 않은 걸 볼 수 있다.
왜 그럴까?
바로 그 이유는 CPU와 다르게 메모리는 속도보다는 메모리 자체의 용량을 늘리는 것을 주 목표로 삼았기 때문이다.
결과적으로 CPU와 메모리 간의 성능 차이는 점점 더 벌어지고 CPU는 데이터를 처리하기 위해 메모리와 끊임 없이 데이터를 주고 받는 관계인데
메모리가 CPU의 데이터 처리 속도를 쫓아가지 못해 CPU가 메모리를 기다려야 되는 병목현상이 일어나게 된다.
따라서 이 병목 현상을 완화하기 위해
CPU와 메인 메모리 사이에 크기는 작지만 속도가 빠른 캐시 메모리를 두고
캐시 메모리의 향후 재사용 할 가능성이 클 것으로 예상되는 데이터에
복사본을 저장해 둔 후 CPU가 요청하는 데이커를 바로 바로 전달할 수 있도록 되었다.
캐시 메모리의 용량을 크게 쓰거나, 아예 메인 메모리로 사용하면 되지 않을까 하고 생각할 수 있다.
안타깝게도 캐시 메모리는 비싸다.~~ 눈물 쓰-윽~~
아래의 사진을 살펴보자.
한 눈에 봐도 캐시 메모리가 비싸보인다.
메인 메모리는 DRAM, 캐시 메모리는 SRAM의 구조를 가지는데 한 메모리 셀당 트랜지스터 갯수가 다르다.
DRAM은 한 개, SRAM은 여섯 개,,,
물리적으로 차지하는 면적도 SRAM이 더욱 크다고 한다.
사람들이 안 하는데에는 모두 이유가 있다,,!
캐시 메모리를 포함한 메모리 계층은 위와 같다.
위의 있을수록 빠르고 비싸고 작은 용량을 가지며 CPU와 가까이에 위치하고 있다.
지금까지 캐시 메모리 위주로 얘기했지만 캐싱은 CPU와 RAM 사이에서만 사용되는 것은 아니다.
한 개체는 바로 아래 계층에 대하여 캐싱 작업을 수행한다.
CPU가 캐시 메모리를 캐싱하고
캐시 메모리가 RAM을 캐싱하고
메인 메모리도 하드 디스크를 캐싱한다.
결국 이러한 메모리 계층 구조의 목적은
캐싱을 이용하여 빠르고 작은 메모리와 크고 느린 메모의 장점을 조합해서 빠른 메모리처럼 행동하도록 만드는 것이다.
앞에서 재사용 할 가능성이 클 것으로 예상되는 데이터에 복사본에 저장함으로써 캐싱을 사용할 수 있다고 했다.
그렇다면 재사용 할 가능성이 클지는 어떻게 알까?
바로 데이터 지역성의 원리를 이용한다.
데이터 지역성의 원리란 데이터 접근이 시간적 혹은 공간적으로 가깝게 일어나는 것을 의미한다.
앞에서 봤던 메모리 계층 구조의 핵심이 캐싱인데, 캐싱의 핵심 원리는 데이터 지역성원리이니 메모리 계층 구조의 핵심이라고 할 수도 있다.
자세히 알아보자.
데이터 지역성의 원리를 사용해서 캐시에 데이터를 넣었다고 가정하자.
그러면 이제 CPU가 메모리에 데이터를 요청할 때 메인 메모리에 접근하기 앞서
캐시 메모리에 접근한다.
이 때 캐시 메모리가 해당 데이터를 가지고 있다면 캐시 히트, 또는 캐시 적중이라고 한다.
반면 캐시 메모리가 해당 데이터를 가지고 있지 않다면 캐시 미스라고 한다.
일반적으로 미스가 달성하면 캐싱을 하는데 히트 상태에서 데이터 쓰기 동작이 발생하면 두 가지 정책이 있다.
이게 무슨 말이냐면 CPU에서 데이터를 읽는 동작이 아니라, 입력 하는 동작이 발생하고 데이터를 변경할 주소가 캐싱된 상태라면 메모리에 데이터가 업데이트 되는 대신 캐시의 데이터가 업데이트 된다.
따라서 메인 메모리를 업데이트 해 주어야 하는데 이 메인 메모리를 업데이트 하는 시점에 따라 정책이 두가지로 나뉜다.
메인 메모리를 바로 업데이트 하는 정책
캐시만 업데이트 하다가 업데이트 된 데이터가 캐시에서 빠지게 될 때 메인 메모리를 업데이트 하는 정책
위의 기법뿐만 아니라 캐시 일관성을 지키기 위한 여러 기법이 존재한다고 한다.
캐싱 : 데이터나 리소스를 미리 저장해두어서, 다음에 같은 요청이 오면 저장해둔 데이터를 반환하여 빠른 응답 속도를 제공하는 기술
캐싱은 복사본을 이용하는 것이다.
복사본과 원본이 달라지는 경우가 생길 수 있으니 일관성 유지에 유의하자.