Spring Boot 웹 정적 파일 캐 시 처리 방법

4493 단어 SpringBoot캐 시
Spring Boot+Freemarker 를 이용 하여 웹 프로젝트 를 개발 할 때 일부 정적 파일 이 비교적 크기 때문에 PC 에 접근 하 는 영향 이 크 지 않 으 면 핸드폰 에 접근 할 때 특히 데이터 로 접근 할 때 속도 가 매우 느 리 고 데이터 소모 가 많다.
요청 을 캡 처 한 결과 한 페이지 에 들 어 갈 때마다 정적 파일 을 불 러 와 야 한 다 는 것 을 알 수 있 습 니 다.돈 이 모자 라 지 않 는 회 사 는 정적 파일 을 CDN 에 올 려 놓 고 접근 속 도 를 높이 거나 Nginx 로 정적 파일 캐 시 를 할 수 있 습 니 다.
오늘 은 다른 캐 시 최적화 방식 을 소개 합 니 다.Spring 의 캐 시 체 제 를 통 해 정적 파일 을 캐 시 합 니 다.Spring Boot 에서 정적 파일 캐 시 를 설정 하려 면 설정 파일 에 아래 설정 만 추가 하면 됩 니 다.

#       ,   
spring.resources.cache-period=604800 
#   gzip  
spring.resources.chain.gzipped=true 
#     
spring.resources.chain.cache=false
설정 은 문 서 를 참고 할 수 있 습 니 다https://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/SPRING RESOURCES HANDLING 부분
캐 시 설정 을 추가 하면 페이지 에 접근 하면 불 러 온 정적 자원 이 캐 시 되 고 두 번 째 방문 시 다운 로드 를 다시 요청 하지 않 습 니 다.스냅 백 을 통 해 캐 시 되 어 있 음 을 알 수 있 습 니 다.

Size 열 에는 from memory cache 가 있 습 니 다.자원 은 브 라 우 저의 메모리 에 캐 시 되 어 있 고 어떤 파일 은 디스크 에 캐 시 됩 니 다.그것 이 바로 from disk cache 입 니 다.
최적화 목적 은 달성 되 었 지만 해결 되 지 않 은 작은 문제 가 있 습 니 다.만약 에 제 자원 파일 이 바 뀌 면 css 파일 이 수정 되 었 습 니 다.제 서버 에서 발표 한 후에 도 사용자 쪽 에 캐 시 가 존재 합 니 다.
가장 좋 은 효 과 는 파일 이 바 뀌 었 을 때 나 서버 의 프로그램 이 다시 시작 되면 사용자 의 요청 은 서버 의 최신 자원 을 다운로드 해 야 합 니 다.다시 시작 하지 않 았 을 때 캐 시 내용 을 사용 하면 변경 후 사용자 가 최신 내용 을 바로 볼 수 있 습 니 다.
우 리 는 버 전 번호 로 이 문 제 를 해결 할 수 있다.바로 정적 자원 뒤에 버 전 번 호 를 추가 하고 자원 이 변화 할 때 버 전 번호 도 바 꾸 면 문제 가 없 을 것 이다.
사용 방식 은 다음 과 같 습 니 다.

<link rel="stylesheet" href="css/main-app.css?version=${version!}" rel="external nofollow" />
용법 은 매우 간단 합 니 다.관건 은 version 이라는 값 이 어디서 나 오 느 냐 는 것 입 니 다.
우 리 는 시작 하기 전에 코드 를 통 해 이 값 을 설정 할 수 있 습 니 다.

System.setProperty("version", version);
이 값 은 main 방법의 args 를 통 해 들 어 올 수 있 습 니 다.프로젝트 를 시작 하 는 스 크 립 트 에서 프로그램 에 동적 으로 전 달 됩 니 다.스 크 립 트 를 시작 하면 프로그램 jar 의 MD5 값 을 버 전 번호 로 가 져 올 수 있 습 니 다.그러면 서버 의 프로그램 이 다시 시작 되면 버 전 번호 가 바 뀌 고 캐 시 는 효력 을 잃 습 니 다.
그리고 필터 에서 이 값 을 가 져 와 request 에 설정 하면 각 페이지 에서 사용 할 수 있 습 니 다.

String version = System.getProperty("version");
req.setAttribute("version", version == null ? "1.0.0" : version);
이러한 매개 변 수 를 전달 하 는 방식 을 제외 하고 사용자 정의 포장 플러그 인 을 통 해 포장 할 때 version 을 구체 적 인 내용 으로 바 꿀 수도 있 습 니 다.
위 에서 말 한 방식 은 자신 이 version 을 생 성하 여 파일 의 변경 을 제어 하 는 것 입 니 다.사실은 Spring Mvc 에서 정적 파일 의 버 전 관리 기능 을 제 공 했 습 니 다.두 가지 방식 이 있 습 니 다.하 나 는 자원 의 MD5 를 통 해 버 전 번 호 를 생 성 하 는 것 입 니 다.파일 내용 이 바 뀌 었 고 MD5 도 바 뀌 었 을 것 입 니 다.다른 하 나 는 자원 앞 에 버 전 번 호 를 추가 하 는 경로 입 니 다.
MD5
속성 파일 에 아래 설정 추가:

spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
Url 처리 증가:

@ControllerAdvice
public class ControllerConfig {

  @Autowired
  ResourceUrlProvider resourceUrlProvider;

  @ModelAttribute("urls")
  public ResourceUrlProvider urls() {
    return this.resourceUrlProvider;
  }

}

페이지 의 사용 방식 은 다음 과 같 습 니 다.

<link rel="stylesheet" type="text/css" href="${urls.getForLookupPath('/css/main-app.css')}" rel="external nofollow" >
컴 파일 하면 다음 내용 이 됩 니 다:

<link rel="stylesheet" type="text/css" href="/css/main-app-4v371326bb93ce4b611853a309b69b33.css" rel="external nofollow" >
버 전 번호
속성 파일 에 아래 설정 추가:

spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/**,/v1.0.0/**
spring.resources.chain.strategy.fixed.version=v1.0.0
페이지 의 사용 방식 은 다음 과 같 습 니 다.

<script type="text/javascript" src="${urls.getForLookupPath('/js/main.js')}"></script>
컴 파일 하면 다음 내용 이 됩 니 다:

<script type="text/javascript" src="/v1.0.0/js/main.js"></script>
어떤 방식 을 사용 하 든 효 과 를 실현 할 수 있 고 작업량 이 많 지 않 으 면 되 며 최적화 가 끝 이 없 으 면 된다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기