[JAVA] API 캐시
Cahe & Caheing 용어 차이
Cache : 자주 필요한 데이터나 값의 복사본을 일시적으로 저장, 보관하기 위해 사용하는 곳
Caching == Cache + ing
Cacheing : cache를 사용하는 것
API 캐시(Cache)란?
API (Application Programming Interface) 호출 결과를 저장하고 재사용함으로써 성능을 향상시키는 메커니즘입니다. 이는 일반적으로 네트워크 호출과 데이터베이스 쿼리와 같이 시간이 많이 소요되는 작업을 수행하는 API에서 특히 유용합니다.
API캐시의 장점
- 성능 향상: 캐시된 데이터를 사용하여 반복적인 요청을 처리하므로, 시간과 대역폭을 절약할 수 있습니다.
- 서버 부하 감소: 반복적인 요청을 처리하기 위해 서버의 부하가 줄어듭니다.
- 응답 시간 단축: 캐시된 데이터를 사용하므로 응답 시간이 단축됩니다.
API 캐시의 LIFECYCLE(생명주기)
클라이언트에서 서버로 데이터 요청을 하는 경우에 대해 캐시의 라이프사이클에 대해 알아봅니다.
1. 요청
- 클라이언트가 API에 요청을 보냅니다.
2. 캐시 조회
- 서버는 요청된 데이터가 캐시에 이미 저장되어 있는지 확인합니다.
3.1. 캐시가 존재하는 경우
- 데이터가 캐시에 발견되면, 새로운 서버 요청 없이 클라이언트에게 반환됩니다.
3.2. 캐시가 존재하지 않는 경우
- 캐시된 데이터는 만료 시간이 있으며, 만료되면 새로 고쳐져야 할 상태로 간주됩니다.
4. 캐시 무효화
- 특정 경우에는 캐시 된 데이터가 만료 시간 이전에 업데이트나 변경으로 인해 무효화되어야 합니다.
5. 캐시 갱신
- 캐시된 데이터가 만료되거나 무효화된 경우, API는 서버에서 업데이트된 데이터를 검색하여 캐시를 업데이트합니다.
6. 응답
- API는 요청된 데이터를 클라이언트에게 반환합니다.
그 이외에 여러 캐시들
- CPU의 캐시 메모리: 아무리 빠른 주기억장치도 CPU를 따라가기 어려워 SRAM이라는 특수한 메모리를 CPU에 넣어 캐시 메모리로 사용합니다.
- 하드디스크: CPU에 비해 10만 배 이상 느린 장치
처리 효율을 올리기 위해 자주 쓰이는 데이터를 캐싱해주는 캐시가 들어갑니다.
- 데이터베이스: 하드디스크나 SSD 위에서 돌아가므로 쿼리를 실행하여 데이터를 읽고 쓰는 것은 시간이 오래 걸리는 작업입니다. 데이터베이스는 쓰기보다 읽기가 많으므로, 자주 요청받는 쿼리의 결과를 캐싱해두면 효율이 오릅니다.
데이터베이스 자체에서 별도의 캐시를 운영합니다. (JPA의 영속성 컨텍스트도 캐시의 일종이다.)
- CDN: 국제 인터넷 회신은 비싸고 용량을 늘리기 어렵습니다.
구글은 각 통신사마다 Google Global Cache를 두어 인기 있는 동영상은 미국 서버까지 접속할 필요 없이 국내 서버에서 처리하도록 합니다. 세계 각지에 캐시 서버를 두어 전송속도를 높이고 부하를 분산하는 시스템이 CDN입니다.
- 웹 캐시: 네트워크를 통해 데이터를 가져오는 것은 하드디스크보다 느릴 때가 많습니다.
웹 브라우저는 웹 페이지에 접속할 때, 자원을 하드디스크나 메모리에 캐싱해 뒀다가 다음 번에 다시 접속할 때 이를 재활용합니다. → 브라우저 캐시
웹 서버 또한 동적 웹 페이지라 할지라도 매번 내용이 바뀌지 않는 경우가 더 많으므로, 서버에서 생성한 HTML을 캐싱해 뒀다가 다음 번 요청에 이를 재활용합니다. → 응답 캐시
이와 유사하게, 클라이언트에서 자주 요청받는 내용은 웹 서버로 전달하지 않고 웹 서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공하기도 합니다. → 프록시 캐시
- 브라우저 캐시: 웹 서버에서 클라이언트에 보내는 HTTP헤더에 캐시 지시자를 삽입하면, 웹 브라우저는 해당 지시자에 명시된 캐시 정책에 따라 캐싱을 실시합니다.
캐시의 유효 시간이 지나도 캐시된 데이터가 바뀌지 않은 경우를 확인하기 위해 ETag라는 유효성 검사 토큰을 사용합니다.
캐싱 된것을 무효화하고 다시 받아올 필요가 있는지 판단합니다.
- Redis(Remote Dictionary Server) -> Dictionary는 Java 기준 HashMap, HashTable
메모리 기반 오픈소스 NoSQL DBMS의 일종으로, 웹 서비스에서 캐싱을 위해 많이 습니다.
모든 데이터를 메모리에 다 올려서 처리하여 속도가 빠릅니다. 서버 재부팅 때 메모리의 데이터가 휘발되지 않게끔 데이터를 하드디스크에 기록할 수 있습니다.
DBMS의 일종으로, 명시적으로 삭제하지 않는 한 메모리에서 데이터를 삭제하지 않습니다.
자체적으로 여러 가지 자료형을 지원합니다.
- EHcache (Java의 표준 캐싱 API명세서인 JSR-107을 따르는 오픈소스 캐시 구현체)
Spring 프레임워크나 Hibernate ORM 등에서 바로 사용 가능합니다. Java 진영에서 가장 널리 쓰인다고 합니다.
캐시 저장공간을 속도에 따라 여러 등급(Tier)으로 나누어 메모리 계층 구조를 적용 가능합니다.(3단계)
메모리에 캐시된 내용을 하드디스크에 기록 가능합니다.
대규모 서비스에서 캐시 서버 여럿을 클러스터로 묶을 수 있는 기능 제공합니다.
API 캐싱 구현하는 방법
일반적으로 HTTP 캐싱, 메모리 캐싱, 데이터베이스 캐싱 등이 사용됩니다.
- HTTP 캐싱: HTTP 헤더를 사용하여 캐싱을 구현합니다. Cache-Control이나 Expires와 같은 헤더를 통해 클라이언트 및 중간 프록시가 데이터를 캐싱하도록 지시할 수 있습니다.
ex) HTTP헤더를 이용하여 캐싱 동작 제어 (개발자 도구 -> network tab에서 HTTP헤더 동작 제어 확인 가능)
- Expires 헤더: 리소스의 만료 날짜를 정의합니다. 클라이언트는 이 날짜 이후에는 서버에 다시 요청하지 않고
캐시된 리소스를 사용합니다.
- Cache-Control 헤더: 리소스에 대한 캐싱 지시사항을 지정합니다.
max-age, no-cache, no-store 등 다양한 디렉티브를 포함합니다.
- ETag 헤더: 리소스가 변경되었는지를 확인하기 위한 엔터티 태그를 제공합니다.
클라이언트는 이 태그를 사용하여 서버에 변경 여부를 물어보고, 변경이 없을 경우 304 Not Modified 상태 코드와 함께 캐시된 리소스를 사용합니다.
ETag의 다른 용례는 변경되지 않은 리소스를 캐시하는 것 입니다. 사용자가 URL을 재방문 했을 때(ETag를 가지고 있는 상태에서), 보유한 ETag가 너무 오래되어 사용될 수 없다고 판단되면, 클라이언트는 If-None-Match 헤더 필드에 ETag를 전송합니다.
// 문법
ETag: W/"<etag_value>"
ETag: "<etag_value>"
- Last-Modified 헤더: 리소스의 마지막 수정일을 제공합니다. 클라이언트는 이 날짜를 사용하여 리소스가 변경되었는지 확인합니다.
ETag 헤더보다 정확하진 않지만 이 태그는 대비책으로 사용합니다.
Last-Modified는 크롤러가 크롤링 빈도를 조정할 때, 브라우저가 휴리스틱 캐싱을 할 때, 콘텐츠 관리 시스템(CMS)이 콘텐츠가 마지막으로 수정된 시간을 표시할 때에도 사용됩니다.
// 구문
Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
// 예제
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
// 지시어
<day-name>
"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 또는 "Sun" 중 하나(대소문자 구분).
<day>
숫자의 날짜, 예: "04" 또는 "23".
<month>
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 중 하나(대소문자 구분).
<year>
숫자의 연도, 예: "1990" 또는 "2016".
<hour>
숫자의 시간, 예: "09" 또는 "23".
<minute>
숫자의 분, 예: "04" 또는 "59.
<second>
숫자의 초, 예: "04" 또는 "59".
GMT
그리니치 표준시. HTTP 날짜는 현지 시각이 아닌, 언제나 GMT로 표현합니다.
- 메모리 캐싱: 서버의 메모리에 데이터를 캐싱합니다. 이는 빠른 액세스와 데이터 보관을 위해 유용합니다. Redis나 Memcached와 같은 메모리 기반의 캐싱 시스템을 사용할 수 있습니다.
- 데이터베이스 캐싱: 데이터베이스 쿼리의 결과를 캐시하여 동일한 쿼리의 반복 실행을 피합니다. 이는 데이터베이스 부하를 줄이고 응답 시간을 개선하는 데 도움이 됩니다.
API 캐시의 유의할 점은 데이터의 유효성을 유지하는 것입니다.
데이터가 변경되면 캐시를 갱신하거나 무효화해야 합니다. 적절한 캐시 전략을 사용하여 데이터의 신뢰성을 유지하는 것이 중요합니다.
ETag - HTTP | MDN
ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭
developer.mozilla.org
캐시(Cache)와 캐싱(Caching) 정리 from 10분 테크톡
캐시(Cache) 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶
readinggeneral.tistory.com