관리 메뉴

취미개발 블로그와 마음수양

Http와 스프링 (2) : LastModified, ETag 직접 쳐보기 본문

개발관련 잡다/HTTP

Http와 스프링 (2) : LastModified, ETag 직접 쳐보기

아라한사 2019. 11. 5. 01:32

목차

http와 스프링 뒤적뒤적 연재 시리즈~ 
--- 
https://adunhansa.tistory.com/261

 

http와 스프링(0) - 연재를 시작하며..

운 좋게, 좋은 스터디원분들과 좋은 책을 만나 HTTP 스터디를 시작하며 다음의 연재글을 시작해보려고 합니다. 목차 http와 스프링 뒤적뒤적 연재 시리즈~ --- 1편 - Encoding - Brotli 적용해보기 https://adunha..

adunhansa.tistory.com


0. 개요 : HTTP 응답코드들 알기

 

우선 Http 의 상태코드를 살펴보기로 하겠습니다.

다음의 위키를 참조하기로 해봅니다. 

 

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다. IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고 있다. 모든 HTTP 응답 코드는 5개의 클래스(분류)로 구분된다. 상태 코드의 첫 번째 숫자는 응답의 클래스를 정의한다. 마지막 두 자리는 클래스나 분류 역할을 하지 않는다. 첫자리에 대한 5가지 값들은 다음과 같다: 1xx (정보): 요청을 받았으며 프로

ko.wikipedia.org

 

다음과 같은 응답코드내용들을 볼 수 있습니다. 

 

 

이번편에서 알아볼 내용은 캐시에 대한 내용이며 여기서는 주로 ETag , LastModified 를 다루기로 합니다.

 

1. HTTP 캐시 : ETag 에 대한 이해

 

여러군데서 설명이 있지만 두군데 설명으로 마무리합니다.

 

https://www.zerocho.com/category/HTTP/post/5b594dd3c06fa2001b89feb9

 

(HTTP) 알아둬야 할 HTTP 쿠키 & 캐시 헤더

안녕하세요. 이번 시간에는 쿠키 & 캐시 전용 헤더만 따로 알아보겠습니다. 웹 자원을 효율적으로 쓰기 위해서는 캐싱이 중요합니다. 똑같은 데이터를 계속해서 내려 받을 필요는 없죠. 쿠키는 클라이언트(프론트)와 서버 간에 데이터를 주고받는 가장 간단한 방법 중 하

www.zerocho.com

https://medium.com/@bbirec/http-%EC%BA%90%EC%89%AC%EB%A1%9C-api-%EC%86%8D%EB%8F%84-%EC%98%AC%EB%A6%AC%EA%B8%B0-2effb1bfab12

 

HTTP 캐쉬로 API 속도 올리기

요즘 많은 서비스가 REST API를 제공해서 웹 프론트 또는 모바일앱에서 사용하도록 디자인을 많이 한다. 많이 사용하는 웹서버 또는 프레임웍에서는 Static file(js, css, image)에 자동으로 Cache 처리가 되지만 dynamic…

medium.com

 

2. 스프링에의 적용

다음의 블로그를 참고해 적용해봅니다.

검색하면 언제나 나타나는 baeldung -ㅅ-

 

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

 

다음과 같이 eTag 필터를 구성하게 되었습니다. 

@Bean
    fun shallowEtagHeaderFilterApply(): FilterRegistrationBean<ShallowEtagHeaderFilter> {
        val filterRegistrationBean = FilterRegistrationBean(ShallowEtagHeaderFilter())
        filterRegistrationBean.addUrlPatterns("/chap2/**")
        filterRegistrationBean.setName("etagFilter")
        return filterRegistrationBean
    }

 

3. 시나리오의 작성과 브라우저 화면 보기

 

baeldung 에서는 멋지게 테스트코드를 짰지만,

20세기형 방구석 취미 개발자인 저는 화면과 눈으로 한번 확인을 해볼 것입니다. 

 

시나리오는 다음과 같습니다. 

어떤 웹페이지에서는 select 박스에 어떤 고정적인 배열값들을

ajax 로 받아 option 요소들을 그려줄 것입니다.

 

api 하나는 윗 내용에서 알아본 eTag 를 적용해보고

api 하나는 단순히 List<String> 을 반환해볼 것입니다

해본 김에 하나는 lastModified 형태를 사용해볼 것입니다.

 

 

코드는 우선 그냥 대충 짭니다 (;;) (대충연습주의 개발;) 

ResponseEntity 생성하며 eTag 와 lastModified 생성되는 부분을 잘 봐주겠습니다.

@ResponseBody
    @GetMapping("/state-nocash")
    fun noCash(): List<String> {
        val list = ArrayList<String>()
        for (x in 0 until 10000)
            list.add("아라한사"+x)
        return list
    }

    @ResponseBody
    @GetMapping("/state")
    fun eTag(): ResponseEntity<List<String>> {
        val list = ArrayList<String>()
        for (x in 0 until 10000)
            list.add("아라한사"+x)
        return ResponseEntity.ok()
                .eTag(list.hashCode().toString())
                .body(list)
    }

    @ResponseBody
    @GetMapping("/state-last-modified")
    fun lastModified(): ResponseEntity<List<String>> {
        val list = ArrayList<String>()
        for (x in 0 until 10000)
            list.add("아라한사"+x)
        return ResponseEntity.ok()
                .lastModified(LocalDateTime.of(2019, 11, 5, 0, 4, 0).toEpochSecond(ZoneOffset.UTC))
                .body(list)

    }

코드는 이곳에서도 확인해보실 수 있습니다
https://github.com/arahansa/learn_http_with_spring/blob/master/first/src/main/kotlin/com/arahansa/chapter2/HttpCashController.kt

 

 

자 그럼 다시 뷰 화면으로 가서..

 

요렇게 셀렉트박스가 그려지게 되는데..  크롬 개발자 도구 네트워크 상에서는 무슨 일이 일어질까요~

처음에는 리스트들을 185 kb 씩 불러와지게 됩니다. 

 

하지만  두번 불러오게 된다면?

 

Last Modified 는 disk cache 가 적용되고 

eTag 는 304 응답 75b이 나왔네요..

아무런 처리 하지 않은 api 는 여전합니다.

 

 

마치며 ::

 

실은 정적자원들만 좀 생각했을 뿐이지, API 단에서는 생각을 잘 안하고 있었는데 http 책을 다시 한번 보면서

본 블로그 작성자분의 결론과 같은 생각을 하였습니다. 
https://medium.com/@bbirec/http-%EC%BA%90%EC%89%AC%EB%A1%9C-api-%EC%86%8D%EB%8F%84-%EC%98%AC%EB%A6%AC%EA%B8%B0-2effb1bfab12

 

HTTP 캐쉬로 API 속도 올리기

요즘 많은 서비스가 REST API를 제공해서 웹 프론트 또는 모바일앱에서 사용하도록 디자인을 많이 한다. 많이 사용하는 웹서버 또는 프레임웍에서는 Static file(js, css, image)에 자동으로 Cache 처리가 되지만 dynamic…

medium.com

(블로그 내용 발췌 이미지)

 

---

 

글 쓰다보며 들은 생각은 과거를 회상해보니, 개발자로써 가장 필요한 역할 기능구현은 했지만, 

 

구현된 제품을 가지고서 서비스를 해나가고, 운영을 하면서 운영관련비용을 내실 분들에게 티는 나지 않지만

조금이라도 짐을 덜어드리지 못했던 것같다는 생각은 들긴 하였네요..

( 제가 이렇게 적는다고해서 운영진,경영진을 선호하는 건 아닙니다. 반골기질ㅋㅋ ) 

 

지구야 랜선낭비해서 미안해..

 

추가로 이런 저런 더 이슈가 있다고는 하는데

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

당장 알고싶지는 않군요 (도망)

그럼 이만..

 


 

Last Modified 는 이미 관련 블로깅을 찾아서 애써 기술하지 않습니다 후닥닥

 

https://itstory.tk/entry/Spring-MVC-LastModified-IfModifiedSince-%EC%BA%90%EC%8B%9C-%EC%84%A4%EC%A0%95

 

연습깃헙 :

 

https://github.com/arahansa/learn_http_with_spring

 

다음의 책을 보면서 스프링 예제코드를 찾아보았습니다 . 리얼월드 HTTP 도서 입니다.

 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=187943894

 

리얼월드 HTTP

HTTP가 발전한 여정을 더듬으면서, 브라우저 내부에서 어떤 일이 일어나는지 그리고 서버와 어떻게 상호작용하는지 등을 다룬다. 메서드와 경로, 헤더, 바디, 스테이터스 코드 같은 HTTP 기본을 충실하게 설명한다.

www.aladin.co.kr