웹을 이용하며, 우리는 컨텐츠를 봅니다. 이 컨텐츠는 글과 그림으로 이루어졌는데, 이 페이지는 서버에 저장되어 있는 데이터 입니다. 해당 페이지를 보기 위해서는, 우리는 서버에게 요청을 하고, 서버는 그 요청에 대한 응답을 반환해 줍니다. 이 사이에서 네트워크를 통해 데이터를 전송하게 되는데, 이때 자원 소모 및 비용이 발생하게 됩니다. 거리가 멀 수록, 용량이 클수록 더욱 더 많은 자원 소모가 가 발생하게 되는데, 이러한 단점을 보완하기 위해 Cache, 캐시라는 것이 등장합니다.
Cache라는 단어는 비단 웹 뿐만이 아닌 컴퓨터 공학 전반에 두루두루 쓰이곤 합니다.
- CPU 캐시 : CPU 연산을 위해 메모리에서 값을 가져와 사용 후 폐기 (칩셋)
- HTTP 캐시 : 웹 요청에 따른 결과를 임시 저장 후 추후 요청 시 임시 저장 결과 반환
- 서버 캐시 : LRU-Cache '로컬 캐시'혹은 인메모리 DB인 Redis '글로벌 캐시'
- LRU : Least Recently Used = 가장 오랫동안 사용되지 않는 것 먼저 폐기- 캐시 (동사) : "임시 저장해라"의 의미 (개발자의 default 사용 같은 느낌...?)
웹 서버는 요청을 반환하고, 웹 브라우저는 반환받은 코드를 컨텐츠화 하여 보여주게 됩니다. 클라이언트와 서버 둘 다 요청에 대한 일이 발생하게 되는데 만약, 웹 페이지의 내용이 같다면 어떨까요? 같은 페이지를 계속 반환하고 그려주며 리소스를 낭비하게 됩니다. 일반 웹 페이지의 경우에도, 사이트의 로고 같은 거라던가, 사이트의 구조 같은 경우는 잘 바뀔일이 없기 때문에 매번 호출하는 경우 이것도 낭비가 됩니다.
만약 이러한 내용을 어딘가에 임시로 저장하고, 필요할 때 마다 불러오는 방식을 채택한다면, 웹 서버와 웹 브라우저가 해야 하는 일이 많이 줄지 않을까요? 이러한 공간이나 저장하는 행위를 캐시라고 합니다. 해당 캐시 메모리를 웹 브라우저나 웹 서버, 혹은 네트워크 사이 공간에 두어 웹 서버 및 브라우저의 부하 완화와 웹 페이지 로드 성능 개선에 도움을 주기 위해 사용합니다.
캐시의 동작 원리는 두 가지로 구분이 가능합니다. 바로 웹 브라우저 입장과 웹 서버 입장이 있는데요, 먼저 웹 브라우저 입장에 대해 살펴 보겠습니다.
만약 제가 고양이 영상을 보고 싶어, 특정 사이트에 매일 접속을 한다고 가정 해 보겠습니다. 해당 사이트에는 100mb짜리 고양이 영상이 있습니다. 그러면 제가 요청을 통해 해당 서버로부터 고양이 영상을 받아오겠죠? 그러나 웹 브라우저는 매번 똑같은 고양이 영상을 받아오고 재생하고 있는데요, 이러한 행위에는 다음과 같은 문제가 발생합니다.
1. 네트워크 트래픽 및 비용 발생
2. 100mb 다운로드 완료까지 긴 대기시간 후 시청 가능

허나 그림과 같이 캐시를 사용한다면, 그러니까 반복적으로 사용하는 영상을 웹 브라우저의 캐시 영역에 저장 해 놓는다면 다음과 같은 이점이 생기게 됩니다.
1. 네트워크 트래픽 및 비용 감소
2. 100MB 다운로드 완료의 긴 대기시간 없이 바로 시청가능 = 유저 경험 증진

위와 같은 경우에서, 제가 고양이 영상을 보기위해 계속 요청하면 웹 서버는 해당 영상을 재생할 수 있게 만들어서 전달 해 줘야 합니다. 이러한 상황에서 반복적인 서버 자원을 소비하는 문제가 발생합니다. 수 많은 유저들의 요청에 대한 반복 연산이 발생하죠.
그러나 캐시에 저장된 영상을 사용하면, 반복되는 모든 유저들의 요청을 간단히 처리할 수 있습니다. 그로 인해서
1. 서버 자원에 여유가 생기고
2. 불특정 다수의 웹 브라우저에게도 캐시된 자원을 제공할 수 있게 됩니다.
📑 출처 및 참조
[ASAC] 강의 자료