studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • Resource versioning
  • ResourceResolver, ResourceTransformer
  1. Spring 관련 정리

Spring에서 효율적으로 Static resource 관리하기

이전에는 static resource들을 관리할 때 HTTP cache header를 (Expires, Cache-Control, Last-Modified) 통해서 관리하는게 일반적이었다. 스프링에서 설정하기도 쉬웠다. 그냥 Java Config든 XML이든 하나 써서 설정하면 된다. 그러나 이런 방법을 사용하면 많은 문제들이 남아있게 된다. 우선, 만약에 리소스에다가 minify, uglify 같은 변환을 적용하고 싶다면 어떻게 할 것인가? 그리고, less, sass, gzip같은 리소스들은 언제 어떻게 컴파일해서 제공할 것인가? 그 외에 새로운 스크립트를 배포하였지만 클라이언트 브라우저에 남아있는 캐시때문에 문제가 생기는 일도 있을 것이다. 이에 따라 스프링 4.1부터 위와 같은 방법에 대응할 수 있는 수단이 추가되었다.

Resource versioning

이것을 Fingerprinting URL이라고 부르기도 한다. 스프링에 추가된 기능은 RoR의 asset pipeline에 기초를 둔다. 이 기능의 요점은 다음과 같다. 가령, /css/mystyle.css 이라는 파일이 있다고 하면 자동적으로 /css/mystyle-f1l521f.css 같은 이름으로 바꿔서 제공한다. 이렇게 되면 HTTP header의 캐시를 얼마든지 길게 하더라도 언제나 최신의 리소스를 제공할 수 있게 된다. 특히, 저 버전은 css파일의 내용을 hash한 값이므로 파일의 내용이 변경되지 않는다면 파일 이름에도 변경이 생기지 않아 캐시가 효율적으로 동작한다.

ResourceResolver, ResourceTransformer

스프링 4.1에서 추가된 클래스들이다. 일반적으로 스프링에서 리소스를 제공할때 호출되는 `ResourceHttpRequestHandler` 사이에 끼워넣어 동작하게 만들 수 있다.

        +------------+
        |HTTP Request|
        +-----+------+
              |
              |
              |
              v
+-------------+--------------+
|                            |
|   ResourceResolver Chain   | 체인을 하나하나 통과하면서 적절한 리소스 탐색
|                            |
+-------------+--------------+
              |
              |
              v
+-------------+--------------+
|                            |
| ResourceTransformer Chain  | 체인을 하나하나 통과하면서 리소스를 변경
|                            |
+-------------+--------------+
              |
              |
              |
              v
        +-----+-------+
        |HTTP Response|
        +-------------+
PreviousSpring with JTA 삽질NextZuul을 사용해서 Spring Reverse proxy 만들기

Last updated 7 years ago