얼마 전에 프론트엔드 개발자분이 서버에서 받은 데이터가 브라우저에 캐싱이 안된다고 했다.
서버 측에서 캐싱을 할 수 없도록 설정해놨다고 한다.
나는 처음에는 서버자체에서 캐싱을 이야기하는 줄 알았다.(ex: @Cacheable)
아직 캐싱관련 설정을 하지 않았기 때문에 아직 별도의 설정을 하지 않았기 때문에 해놓겠다고 했다.
우선 메인페이지를 구성하는 월드컵 검색 api에만 설정을 해놓고 되는지 확인해 보라고 했다.
그랬더니 똑같이 안된다고 한다. 서버로그를 확인해보니 정상적으로 캐싱이 되어 데이터베이스로 쿼리문이 날아가지 않는다.
응...????
뭔가 이상함을 느꼈고, 다시 검색을 해보니 브라우저에서 캐싱을 하는 것과 서버에서 캐싱을 하는 것은 전혀 다른 것이었다.
프론트엔드개발자분이 요청한 것은 브라우저에서 캐싱을 해서 서버에 요청을 하지 않도록 하는 캐시정책 설정이었고,
내가 생각한 것은 서버에서 캐싱을 통해 데이터베이스에 요청을 하지 않도록 하는 것이었다.
Cache-Control 정책을 설정하는 방법을 알아보자
Cache-Control 설정
java-17, spring-boot 3.0.5
캐시설정 방법은 생각보다 간단하다.
컨트롤러의 ResponseEntity에 cacheControl 옵션을 설정해 주면 된다.
return ResponseEntity.ok()
// 이외에도 다양한 옵션을 줄 수 있음
.cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS))
.body(responseDtos);
캐시 만료시간을 20초로 설정해 주고 간단하게 클라이언트 측에서 요청을 보내는 모습을 재현해 보았다.
테스트 결과
아래의 결과를 보면 최초 요청 시에는 서버에 데이터를 요청한다.
그리고 캐시정책에 의해 20초간은 동일한 요청이 필요하면 서버에 요청을 보내지 않고 캐시 된 데이터를 사용한다.
그래서 Size를 보면 최초에는 3.5kB라고 표기되어 있지만 그 이후에는 (disk cache)라고 적혀있다.
또한, Time의 경우 977ms에서 한 자릿수로 줄어든 것을 볼 수 있다.
총 5번의 요청버튼을 눌렀지만 실제로 서버에 요청이 들어간 횟수는 최초 1회이다.
결론
- 캐싱 관련 설정은 브라우저에 캐싱하는 Cache-Control 정책과 서버 자체에 캐싱하는 방법이 있다.
- Cache-Control 설정을 통해 브라우저와 서버의 통신 횟수와 속도를 획기적으로 개선할 수 있다.
참고자료
'개발일지 > 돌픽' 카테고리의 다른 글
Docker로 spring-boot EC2에 배포하기 (0) | 2023.06.07 |
---|---|
Spring boot 쿼리파라미터 Dto 사용하기 (@ModelAttribute) (2) | 2023.05.23 |
ImgBB API 이용해보기 (0) | 2023.05.17 |
Spring-boot 파일 업로드 - 공식문서 따라하기 ! (0) | 2023.05.12 |
네이버 무료 검색 API 이용해보기 (0) | 2023.05.01 |