본문 바로가기

프로그래밍

spring boot 2, http/2, undertow

들어가며

스프링 부트 프로젝트 생성할 때마다 스프링 버전은 계속 올렸는데, (올릴수록 편해지니까...) jdk (와 jvm)는 8에서 머물러 있었다. 얼마 전에 http2의 위력을 보고 http/2를 해보고 싶어서 스프링 부트에는 어떻게 적용하나 알아봤는데... 부트 2 위에서 http/2를 적용하는 방식은 일맥상통하지만, 컨테이너 별로 지원하는 버전이 달라서, jdk 1.8을 쓰던 사람은 컨테이너 별로 설정을 달리 해줘야 한다.

JDK 8과 undertow

스프링 부트 공식 문서 에 자세히 나와있는데, (참고로 공식 문서 how-to section이 상당히 좋다. 부트 설정 부분을 개괄적으로 다 가르쳐준다.) JDK 8에서 다른 건 추가 설정이 있어야 하지만... undertow는 (부트 embedded was를 띄울 경우) 빌드 설정에서 톰캣을 빼고 undertow만 넣어주면 되기 때문에... undertow로 결정. JDK 9부터는 별 다른 추가 설정들이 필요 없고, 입맛에 맞게 골라서 쓰시면 될 듯...

https

http/2는 스펙상 http가 안되는 것은 아닌데, 대부분 https로 이뤄진다. 그러므로 먼저 https 커넥션을 추가하던 바꾸던 해야 한다. 바꾸는 게 훨씬 간단하기 때문에 바꾸는 걸로... 키 스토어 파일을 생성하여 resource 폴더에 추가하고

server.ssl.key-store=classpath:server.jks 
server.ssl.key-store-password 

설정만 boot 설정 파일에서 적용하면 바로 https가 된다.

http/2

server.http2.enabled=true

면 끝이다.

테스트

크롬 개발자 창에서 인터넷 환경을 굉장히 느리게 하고 테스트를 해봤다. 게시물에 사진을 6장 정도 올려서 게시물을 로딩하고 네트워크 추이를 봤는데.... 처음에는 프로토콜이 컬럼으로 설정이 안 되어 있어서 칼럼들을 우클릭하고 프로토콜 칼럼을 추가하니, 실제로 http1.1에서 h2로 변경되었다. 그래서 성능이 엄청 향상되었냐? 클라이언트(브라우저) 입장에서는 노, 서버 입장에서는 예스? 아마도? 우선 브라우저는 이미 다수의 커넥션을 통해 사진을 여러장씩 전송받는다. 그래서 클라이언트 입장에서 엄청난 속도 향상을 경험하지는 못했다. 다만, 서버 입장에서는 하나의 커넥션으로 처리하니 부하가 더 적은 게 아닐까... 싶다. 이 부분은 http/2 책을 들여다 보고 확실히 해야겠다.

테스트 실수

블로그를 적으면서 깨달은 건데, 크롬은 asset 요청을 다섯개 정도 단위로 하는 것 같다. (추측) 사진 여섯 개 중에 하나만 요청이 늦게 들어가기 시작했다. 아마, 사진이 엄청나게 늘어나면 클라이언트도 엄청난 속도 향상이 있을 것 같은데... 사실, 사진을 여섯 장이나 올리는 것도 현재 서비스에서 많은 편이긴 해서... 실효성이 있을지 모르겠는데... 만약 업로드한 사진을 쪼개서 저장하는 게 진짜 엄청난 속도 향상을 불러일으킨다면 해볼 만한 개발인 것 같다.

티몬 & 쿠팡

갑자기 궁금해서 소셜커머스 사이트 두군데 들어가서 확인해봤는데... 쿠팡은 콘텐츠 사진들이 http/2로 로딩되고 있었고, 티몬은 대부분이 http 1.1로 동작하고 있었다.