내가 지금 일하고 있는 회사에서는
GCP를 이용하여 홈페이지를 운영 중에 있다.
그리고 많은 API를 개발하면서 상품과 그에 대한 이미지를 같이 호출하는 일이 많다.
(당연하겠지, 손님이 그림을 안 보면 어떻게 물건을 사;;)
보통 이미지를 제공할 때 GCP에 저장된 이미지들의 URL을 output으로 제공하는데,
목록화면에서 상품 가짓수가 많으면 많을수록 이미지가 조금씩 늦게 나오는 경향이 있었다.
그래서 웹브라우저는 서버간에 콘텐츠를 어떻게 호출할까?
웹 브라우저는 최초 리소스를 호출할 경우, 서버에서 완전한 HTTP 요청/응답을 진행한다.
- 리소스: 웹브라우저가 HTTP 요청으로 가져올 수 있는 모든 종류의 파일(HTML, CSS, JS...)
- 완전한 요청: 리소스 요청시 아무런 조건이 없는, 서버에서 리소스를 호출해서 가져오는 동작 이후
응답에 포함된 Cache-control Header에 따라 해당 리소스의 주기가 결정된다.
Cache-Control Header는 그럼 어디서 봐?
Cache-Control Header는 웹브라우저 개발자 도구에 보면 확인이 가능하다.
Cache-Control Header의 응답값은 여러 가지가 있는데 내가 사용했던 것들만 나열해 본다면 다음과 같다.
Title | Description |
no-cache | 캐시 관리자에게 캐싱을 허용하나 사용 전 필수로 Server에 유효성 체크 |
no-store | 캐싱을 금지 |
max-age | 초 단위로 캐시가 유효한 시간을 제공 |
must-revalidate | 캐시 관리자에게 내부 유효성 체크를 허용하지 않으며, 항상 Server에 유효성 체크 |
좀 더 자세한 내용은 위에 링크에서 좀더 세분화된 응답 값을 볼 수 있다.
CDN
그렇다면 CDN은 무엇일까?
CDN을 구글에서 찾아보면 두가지로 정의가 된다.
- Content delivery network
- Content distribution network
풀어서 얘기한다면
콘텐츠를 효율적으로 전달하기 위해 여러 노드를 가진 네트워크에 데이터를 저장하여 제공하는 시스템
이라고 정의하면 될 것 같다.
즉 CDN을 통해 각 사용자들에게 있어 가장 가까운 서버를 통해 컨텐츠를 전송한다고 보면 된다.
내 집에서 가장 가까운 서버에서 리소스를 가져온다면 훨씬 더 빨리 리소스가 완성이 될 테니까!
GCP에서 제공하는 API 중 cacheControl을 제어하는 문서는 다음을 참고하자.
Class BlobInfo.Builder (2.22.1) | Java client library | Google Cloud
Creates a BlobInfo object.
cloud.google.com
다른 곳은 어떻게 사용하고 있을까?
캐싱 데이터를 회사에 적용하려다 보니
문득 이런 생각을 하게 된다.
다른 회사는 이걸 어떻게 쓰고 있는 거지?
※ 다른 회사들을 어떻게 적용하는지 알게 되면 좀 더 추가해 보겠습니다.
토스
https://toss.tech/article/smart-web-service-cache
웹 서비스 캐시 똑똑하게 다루기
웹 성능을 위해 꼭 필요한 캐시, 제대로 설정하기 쉽지 않습니다. 토스 프론트엔드 챕터에서 올바르게 캐시를 설정하기 위한 노하우를 공유합니다.
toss.tech
정리한다면 다음과 같다.
- HTML 파일
- HTML을 불러올 때마다 새로운 배포를 확인, max-age=0, s-maxage=31536000 설정
※ max-age=0, s-maxage=31536000의 의미
CDN에서는 1년 동안 캐시되지만 브라우저에서는 매번 재검증 요청을 보내도록 설정 가능
- HTML을 불러올 때마다 새로운 배포를 확인, max-age=0, s-maxage=31536000 설정
- JS, CSS 파일
- 임의의 버전 번호를 URL 앞부분에 붙여서 빌드 결과물마다 고유한 URL을 설정,
리소스가 만료될 일이 없기 때문에 max-age의 최대치인 max-age=31536000 적용
- 임의의 버전 번호를 URL 앞부분에 붙여서 빌드 결과물마다 고유한 URL을 설정,
마치며
서비스를 더 빠르게 호출하기 위해 많은 것들이 만들어지고 있다는 것.
이것들을 알기 위해서 개발자들은 더 열심히 공부해야 된다는 것.
열심히 하자!