일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kotliln
- cache-control
- 개미수열
- 브로틀리
- 알게뭐냐
- 이렇게살아야되나자괴감이
- i18n
- HTTP
- cross parameter
- Kotlin
- 코드스피츠
- etag
- jsr380
- jsr303
- 리얼월드HTTP
- Spring
- 알고리즘
- 랜선아미안해
- 스프링
- 지수반등
- brotli
- LastModified
- 지뢰찾기
- 워드프레스
- 클래스레벨밸리데이션
- Today
- Total
취미개발 블로그와 마음수양
Http와 스프링 (2) : LastModified, ETag 직접 쳐보기 본문
목차
http와 스프링 뒤적뒤적 연재 시리즈~
---
https://adunhansa.tistory.com/261
0. 개요 : HTTP 응답코드들 알기
우선 Http 의 상태코드를 살펴보기로 하겠습니다.
다음의 위키를 참조하기로 해봅니다.
https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
다음과 같은 응답코드내용들을 볼 수 있습니다.
이번편에서 알아볼 내용은 캐시에 대한 내용이며 여기서는 주로 ETag , LastModified 를 다루기로 합니다.
1. HTTP 캐시 : ETag 에 대한 이해
여러군데서 설명이 있지만 두군데 설명으로 마무리합니다.
https://www.zerocho.com/category/HTTP/post/5b594dd3c06fa2001b89feb9
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
(블로그 내용 발췌 이미지)
---
글 쓰다보며 들은 생각은 과거를 회상해보니, 개발자로써 가장 필요한 역할 기능구현은 했지만,
구현된 제품을 가지고서 서비스를 해나가고, 운영을 하면서 운영관련비용을 내실 분들에게 티는 나지 않지만
조금이라도 짐을 덜어드리지 못했던 것같다는 생각은 들긴 하였네요..
( 제가 이렇게 적는다고해서 운영진,경영진을 선호하는 건 아닙니다. 반골기질ㅋㅋ )
지구야 랜선낭비해서 미안해..
추가로 이런 저런 더 이슈가 있다고는 하는데
https://www.baeldung.com/etags-for-rest-with-spring#other
당장 알고싶지는 않군요 (도망)
그럼 이만..
Last Modified 는 이미 관련 블로깅을 찾아서 애써 기술하지 않습니다 후닥닥
연습깃헙 :
https://github.com/arahansa/learn_http_with_spring
다음의 책을 보면서 스프링 예제코드를 찾아보았습니다 . 리얼월드 HTTP 도서 입니다.
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=187943894
'개발관련 잡다 > HTTP' 카테고리의 다른 글
http와 스프링 (0) - 연재를 시작하며.. (2) | 2019.11.10 |
---|---|
http와 스프링 (5) : 다국어 API, 페이지에 대한 캐싱고민과 300 응답? (0) | 2019.11.10 |
http와 스프링 (4) : Cache Control 과 정적자원들의 관리 (0) | 2019.11.10 |
Http와 스프링 (3) : eTag를 이용하여 View 에도 적용하기 (0) | 2019.11.09 |
Http와 스프링 (1) : Encoding - Brotli (0) | 2019.11.04 |