스프링에서는 ETag 를 만들어야 하는지 판단하고 직접 만들어주는 ShallowEtagHeaderFilter 객체를 제공하고 있다. ShallowEtagHeaderFilter 는 이전에 응답한 메시지에서 변경사항이 있는지 판단한다. 변경사항이 없을 경우 304 Not Modified 와 함께 이전과 동일한 ETag 를 반환하며, 변경사항이 있을 경우 200 OK 와 새로운 body 정보를 변경된 ETag 와 함께 응답한다.

@Configuration
public class EtagFilterConfiguration {

    @Bean
		public ShallowEtagHeaderFilter shallowEtagHeaderFilter() {
				return new ShallowEtagHeaderFilter();
		}
}

ShallowEtagHeaderFilter 객체를 설정 객체에 빈 등록을 하는 것만으로도 ETag 설정을 할 수 있다. 만약 경로에 따라 ETag 를 사용할지 결정하고 싶다면 Filter 를 이용한다.

@Configuration
public class EtagFilterConfiguration {

   @Bean
   public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagHeaderFilter() {
	   FilterRegistrationBean<ShallowEtagHeaderFilter> filterRegistrationBean = new FilterRegistrationBean<>(
		   new ShallowEtagHeaderFilter()
	   );
	   filterRegistrationBean.addUrlPatterns("/etag/*");
       return filterRegistrationBean;
   }
}

FilterRegistrationBean 객체로 감싸서 빈을 등록하면 Filter 에서 제공하는 설정값을 사용할 수 있다. 위의 예제는 /etag 하위의 URL 에 한해서만 ETag 를 사용한다.

https://www.baeldung.com/etags-for-rest-with-spring