캐시의 기본동작
캐시가 없는 경우
• 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
• 인터넷 네트워크는 매우 느리고 비싸다.
• 브라우저 로딩 속도가 느리다.
• 느린 사용자 경험
캐시가 있는 경우
캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
• 비싼 네트워크 사용량을 줄일 수 있다.
• 브라우저 로딩 속도가 매우 빠르다.
• 빠른 사용자 경험
캐시 유효시간이 초과한경우
캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
• 이때 다시 네트워크 다운로드가 발생한다.
중요
304 NOT Modified 로 응답을 보낸다.
Http 바디가 없다
[ 검증 헤더와 조건부 요청 ]
검증 헤더
• 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터
• 방법 : Last-Modified , ETag
조건부 요청 헤더
• 검증 헤더로 조건에 따른 분기
• If-Modified-Since: Last-Modified 사용
• If-None-Match: ETag 사용
• 조건이 만족하면 200 OK
• 조건이 만족하지 않으면 304 Not Modified
예시
If-Modified-Since: 이후에 데이터가 수정되었으면?
• 데이터 미변경 예시
• 캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 10:00:00
• 304 Not Modified, 헤더 데이터만 전송(BODY 미포함), 요청한곳으로 리다이렉션
• 전송 용량 0.1M (헤더 0.1M)
• 데이터 변경 예시
• 캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 11:00:00
• 200 OK, 모든 데이터 전송(BODY 포함)
• 전송 용량 1.1M (헤더 0.1M, 바디 1.0M)
Last-Modified, If-Modified-Since 단점
• 1초 미만(0.x초) 단위로 캐시 조정이 불가능
• 날짜 기반의 로직 사용
• 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
• 서버에서 별도의 캐시 로직을 관리하고 싶은 경우
• 예) 스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시를 유지하고 싶은 경우
임의로 로직을 관리하싶은경우에는 ETag, If-None-Match로 캐시 메커니즘을 사용
ETag, If-None-Match
• ETag(Entity Tag)
• 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
• 예) ETag: "v1.0", ETag: "a2jiodwjekjl3"
• 데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성)
• 예) ETag: "aaaaa" -> ETag: "bbbbb"
• 진짜 단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받기!
캐시 제어 헤더
중요
no-cache => 데이터는 캐시를 해도되는데, 항상 서버에서 검증을 받고 써라
pragma 와 expires는 잘사용하지 않는다.
정리
캐시 무효화
원서버에서 접근 할수 없는 경우 항상 오류를 반환한다라는 것에서 차이가 있다.
'Java Spring' 카테고리의 다른 글
HTTP ) 헤더 - ( 표현, 협상 , 일반정보 , 인증 , 쿠키 등.) (0) | 2025.02.10 |
---|---|
HTTP ) 상태 코드 (0) | 2025.02.10 |
HTTP ) 참고하면 좋은 URI 설계 개념 (0) | 2025.02.10 |
HTTP ) POST , PUT 정리 (0) | 2025.02.10 |
HTTP ) 메서드 GET,POST, PUT,PATCH, DELETE (0) | 2025.02.06 |