월별 글 목록: 2018년 8월월

Spring Boot Book 콘서트 참석 후기

도서 Boot Spring Boot! 의 저자 김지헌 님이 발표를 하셨던 북 콘서트에 다녀오고 정리해 봅니다.

 

Spring Boot 란?

  • Web Application 을 쉽고 빠르게 개발할 수 있다.
  • Auto configuration 으로 접근 장벽을 낮췄다.
  • 나온지 5년이 지났지만 아직도 한번도 써보지 않은 개발자들이 많다.

Spring Boot 가 쉽고 빠른 이유

  • 많은 Starter project 들이 있어 필요한 기능을 쉽게 사용할 수 있다.
  • 참고 : https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters

Jar vs War

  • Spring Boot 는 Embedded container 를 포함한 FAT jar 를 이용한 Application deploy 를 권장한다.
  • Cloud Native Java 참고 : http://www.yes24.com/24/goods/61788283?scode=032&OzSrank=1

Spring Boot 1.5.x vs 2.x.x

  • Java 8 이상을 완벽하게 지원하는 Spring Boot 2.x.x 이상을 사용하라
  • Spring Boot 2.x.x 에서부터는 Tomcat-JDBC 에서 HikariCP 가 기본으로 변경 되었다.
  • 참고 : https://github.com/brettwooldridge/HikariCP
  • 1.5.x 는 java 1.6, 1.7, 1.8 을 위해 만들어졌다. (하위 호환성을 위한 희생이 있음)
  • 2.0.x 는 java 1.8 이상을 위해 만들어졌다.
  • 1.5.x 와 2.x.x 는 actuator 사용시 endpint 가 달라졌다.
    • 1.5.x : /{endpoint}
    • 2.x.x : /actuator/{endpoint}
  • 1.5.x 와 2.x.x 의 container 는 명칭과 기능이 달라졌다.
    • 1.5.x : embedded container
    • 2.x.x : web server (reactive 지원)
  • 1.5.x 는 2019-08-01 에 지원이 끝난다. 따라서 가능하면 2.x.x로 갈아 타도록 하자

Spring Boot Auto Configure

  • Spring Boot 는 편리성을 위해서 Auto Configure 를 지원한다.
  • 본인이 사용하는 모듈이 어떤 설정으로 구동 되는지 확인하자 : https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure

Spring Boot Dependency

  • Spring Boot 는 dependency에 버전을 명시하지 않아도 동작을 하는게 기본 설정되어있는 버전이 있기 때문이다.
  • 본인이 사용하는 모듈의 라이브러리 버전을 확인하도록 하자
  • Spring Boot reference 참고 : https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix-dependency-versions

Debug 모드 활용

  • Application.yml 이나 properties 에 debug : true 로 설정해 주면 (기본값은 false)
  • 라이브러리 간에 의존성이나 기타 디버깅을 볼 수 있다.

 

저자 싸인 받았음 히히

RabbitMQ client 에서 useNio 사용시 timeout 이 먹히지 않는현상…

개인적으로 개발하고 있는 OpenSource Project illuminati 는 rabbitMQ 를 사용중이다.

illuminati를 프로젝트에 적용을 하면 해당 프로젝트가 bootrun 할때 같이 올라가는데
rabbitMQ 에 문제가 생겨 컨넥션을 만들지 못할 경우 장시간 멈추는 (약 1분 20초정도) 현상이
로컬 테스트에서 발견 되었다.

분명 소스에는 timeout 이 설정되어있었지만 소용이 없었다.

Connection factory 의 useNio 옵션을 사용하지 않고 useBlockingIo 옵션을 사용할 경우
정상적으로 5초후에 timeout 이 나는것을 확인 하였지만 useNio 옵션을 사용할경우 1분이 넘게
대기를 하는 현상을 다시한번 확인하고 amqp-client 소스를 까보기 시작했다.

useNio 옵션을 사용하느냐 하지 않느냐에 따라서

FrameHandler 를 생성하기 위한 Factory 는 2가지의 구현체를 사용하는데

nio : SocketChannelFrameHandlerFactory
io : SocketFrameHandlerFactory

일단 io (blockingIo) 부터 보면

socketConnect 라는 native method 를 사용하는것을 볼 수 있으며 timeout 를 파람으로 받아서 사용할 수 있는것을 볼 수 있다.

다음 nio 를 보면

Net.class 에서 connect0 이라는 native method 를 사용하는 것을 볼 수 있고 이놈은 timeout 를 파람으로 받지를 않는것을 볼 수 있다.

헐…. 뭐지… 하고 찾아본 경과

이놈은 OS 의 tcp timeout 설정을 사용한다는것을 알 수 있었다.

sysctl 명령을 이용하여 TCP 설정들을 보면

이렇게 1분 15초가 설정된것을 볼 수 있다.

왜 timeout 을 임의로 어플리케이션 딴에서 설정을 할 수 없는지

설정할 수 있는 native method 가 있는지는 아직 찾지 못했다.

나만 몰랐던 이슈로

일단 정리한대까지 까먹기 전에 기록으로 남겨 둔다. (나의 스승님들이 답을 주실듯)