복붙노트

[SPRING] 스프링 부트 시작 시간 단축

SPRING

스프링 부트 시작 시간 단축

스프링 부트 애플리케이션이 있습니다. 나는 많은 의존성을 추가했다 (불행히도, 나는 그들 모두를 필요로한다). 그리고 시작 시간은 상당히 많이 올라 갔다. SpringApplication.run (source, args)을 수행하는 데는 10 초 밖에 걸리지 않는다.

그게 "사용 된"것에 비해 그리 큰 것은 아니지만, 개발 흐름을 깰 수 있기 때문에 그 정도의 시간이 걸리는 것은 불행합니다. 이 시점에서 애플리케이션 자체는 다소 작기 때문에 대부분의 경우 앱 클래스 자체가 아닌 추가 된 종속성과 관련 있다고 가정합니다.

클래스 패스 스캐닝 문제라고 가정합니다. 그러나 다음과 같은 방법을 잘 모르겠습니다.

나는 이것을 가정한다.

사물의 속도를 높일 수는 있지만이 시점에서 선별 검사조차하지는 않습니다. 스프링 부트 자체에서 다음과 같은 몇 가지 다른 노력을 봅니다.

그러나 이것은 Tomcat에 특정한 것으로 보인다.

이 기사 :

비록 통합 테스트를 목표로하고 있지만, lazy-init = true를 사용하도록 제안하고 있지만, Java 설정을 사용하여 스프링 부트의 모든 빈에 이것을 적용하는 방법을 모른다.

모든 (다른) 제안은 환영받을 것입니다.

해결법

  1. ==============================

    1.스프링 부트는 필요하지 않은 많은 자동 구성을 수행합니다. 따라서 앱에 필요한 자동 구성 만 좁힐 수 있습니다. 자동 구성의 전체 목록을 보려면 org.springframework.boot.autoconfigure의 로깅을 DEBUG 모드 (logging.level.org.springframework.boot.autoconfigure = application.properties의 DEBUG)에서 실행하십시오. 또 다른 옵션은 --debug 옵션을 사용하여 스프링 부팅 응용 프로그램을 실행하는 것입니다. java -jar myproject-0.0.1-SNAPSHOT.jar --debug

    스프링 부트는 필요하지 않은 많은 자동 구성을 수행합니다. 따라서 앱에 필요한 자동 구성 만 좁힐 수 있습니다. 자동 구성의 전체 목록을 보려면 org.springframework.boot.autoconfigure의 로깅을 DEBUG 모드 (logging.level.org.springframework.boot.autoconfigure = application.properties의 DEBUG)에서 실행하십시오. 또 다른 옵션은 --debug 옵션을 사용하여 스프링 부팅 응용 프로그램을 실행하는 것입니다. java -jar myproject-0.0.1-SNAPSHOT.jar --debug

    출력물에는 다음과 같은 것이 있습니다.

    =========================
    AUTO-CONFIGURATION REPORT
    =========================
    

    이 목록을 검사하고 필요한 자동 구성 만 포함하십시오.

    @Configuration
    @Import({
            DispatcherServletAutoConfiguration.class,
            EmbeddedServletContainerAutoConfiguration.class,
            ErrorMvcAutoConfiguration.class,
            HttpEncodingAutoConfiguration.class,
            HttpMessageConvertersAutoConfiguration.class,
            JacksonAutoConfiguration.class,
            ServerPropertiesAutoConfiguration.class,
            PropertyPlaceholderAutoConfiguration.class,
            ThymeleafAutoConfiguration.class,
            WebMvcAutoConfiguration.class,
            WebSocketAutoConfiguration.class,
    })
    public class SampleWebUiApplication {
    

    코드가이 블로그 게시물에서 복사되었습니다.

  2. ==============================

    2.지금까지 답변이 가장 많았던 것은 틀린 것이 아니지만보고 싶은 깊이로 들어 가지 않고 과학적 증거도 제공하지 않습니다. Spring Boot 팀은 Boot 2.0의 시작 시간을 줄이기위한 연습을했으며 티켓 11226에는 많은 유용한 정보가 들어 있습니다. 조건 평가에 시간 정보를 추가 할 수있는 티켓 7939가 있지만 특정 ETA는없는 것 같습니다.

    지금까지 답변이 가장 많았던 것은 틀린 것이 아니지만보고 싶은 깊이로 들어 가지 않고 과학적 증거도 제공하지 않습니다. Spring Boot 팀은 Boot 2.0의 시작 시간을 줄이기위한 연습을했으며 티켓 11226에는 많은 유용한 정보가 들어 있습니다. 조건 평가에 시간 정보를 추가 할 수있는 티켓 7939가 있지만 특정 ETA는없는 것 같습니다.

    Dave Syer는 Boot startup을 디버깅 할 때 가장 유용하고 체계적인 방법을 사용했습니다. https://github.com/dsyer/spring-boot-startup-bench

    유사한 유스 케이스도 있었으므로 JMH와의 마이크로 벤치마킹 접근 방식을 취하여이를 실행했습니다. 결과는 부트 벤치 마크 프로젝트입니다. BootJar (이전에 boot 1.5에서 bootRepackage라고 부름)에서 생성 된 실행 가능한 jar를 사용하여 모든 Spring Boot 응용 프로그램의 시작 시간을 측정하는 데 사용할 수 있도록 설계되었습니다. 언제든지 사용하고 피드백을주십시오.

    내 발견은 다음과 같습니다 :

  3. ==============================

    3.이 질문 / 답변에 설명 된대로 최선의 방법은 필요하다고 생각하는 것만 추가하는 대신 필요없는 것으로 알고있는 종속성을 제외하는 것입니다.

    이 질문 / 답변에 설명 된대로 최선의 방법은 필요하다고 생각하는 것만 추가하는 대신 필요없는 것으로 알고있는 종속성을 제외하는 것입니다.

    참조 : 스프링 부팅 시작 시간 최소화

    요약하자면:

    명령 줄에서 응용 프로그램을 시작할 때 --debug를 지정하는 것만으로 간단하게 디버그 로깅을 사용할 수 있습니다. application.properties에서 debug = true를 지정할 수도 있습니다.

    또한 application.properties의 로깅 수준을 다음과 같이 간단하게 설정할 수 있습니다.

    logging.level.org.springframework.web : DEBUG logging.level.org.hibernate : ERROR

    원하지 않는 자동 구성 모듈을 감지하면 모듈을 비활성화 할 수 있습니다. 이에 대한 문서는 http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration에서 찾을 수 있습니다.

    예는 다음과 같습니다.

    @Configuration
    @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
    public class MyConfiguration {
    }
    
  4. ==============================

    4.수동 테스트를 위해 개발 과정을 최적화하려는 경우 devtools를 사용하는 것이 좋습니다.

    수동 테스트를 위해 개발 과정을 최적화하려는 경우 devtools를 사용하는 것이 좋습니다.

    재 컴파일 만하면 서버가 자동으로 다시 시작됩니다 (Groovy의 경우 소스 파일을 업데이트하면됩니다). IDE (예 : 'vscode')를 사용하는 경우 Java 파일을 자동으로 컴파일 할 수 있으므로 Java 파일을 저장하면 간접적으로 서버를 다시 시작할 수 있습니다. Java는 이와 관련하여 Groovy만큼이나 완벽 해집니다.

    이 접근법의 장점은 점진적 재시작이 처음부터 시작 단계의 일부를 단락 시키므로 서비스가 훨씬 빨리 백업되고 실행된다는 것입니다.

    유감스럽게도 이는 배포 또는 자동화 된 장치 테스트를 시작하는 데 도움이되지 않습니다.

  5. ==============================

    5.이상한 사람이 전에 이러한 최적화를 제안하지 않았 음을 알았습니다. 다음은 개발시 프로젝트 빌드 및 시작 최적화에 대한 일반적인 팁입니다.

    이상한 사람이 전에 이러한 최적화를 제안하지 않았 음을 알았습니다. 다음은 개발시 프로젝트 빌드 및 시작 최적화에 대한 일반적인 팁입니다.

  6. ==============================

    6.내 발견은 Hibernate가 애플리케이션 시작에 상당한 시간을 추가한다는 것이다. L2 캐시와 데이터베이스 초기화를 비활성화하면 스프링 부팅 응용 프로그램을 더 빨리 시작할 수 있습니다. 프로덕션 환경에서는 캐시를 ON으로두고 개발 환경에서는 캐시를 사용하지 않도록 설정하십시오.

    내 발견은 Hibernate가 애플리케이션 시작에 상당한 시간을 추가한다는 것이다. L2 캐시와 데이터베이스 초기화를 비활성화하면 스프링 부팅 응용 프로그램을 더 빨리 시작할 수 있습니다. 프로덕션 환경에서는 캐시를 ON으로두고 개발 환경에서는 캐시를 사용하지 않도록 설정하십시오.

    application.yml :

    spring:
      jpa:
        generate-ddl: false
        hibernate:
          ddl-auto: none
        properties:
          hibernate:
            cache:
              use_second_level_cache: false
              use_query_cache: false
    

    시험 결과:

    이제 나는이 모든 자유 시간으로 무엇을 할 것인지 궁금합니다.

  7. ==============================

    7.나에게 잘못된 구성 설정을 사용하고있는 것 같습니다. myContainer와 가능한 충돌을 검사하여 시작하십시오. 누가 대부분의 리소스를 사용하고 있는지 확인하려면 한 번에 각 종속성에 대한 메모리 맵 (데이터 양을보십시오!)을 확인해야합니다. 또한 시간도 많이 걸립니다 (SUDO 권한). 그건 그렇고 : 당신은 일반적으로 의존성에 대해 코드를 테스트하고 있습니까?

    나에게 잘못된 구성 설정을 사용하고있는 것 같습니다. myContainer와 가능한 충돌을 검사하여 시작하십시오. 누가 대부분의 리소스를 사용하고 있는지 확인하려면 한 번에 각 종속성에 대한 메모리 맵 (데이터 양을보십시오!)을 확인해야합니다. 또한 시간도 많이 걸립니다 (SUDO 권한). 그건 그렇고 : 당신은 일반적으로 의존성에 대해 코드를 테스트하고 있습니까?

  8. from https://stackoverflow.com/questions/27230702/speed-up-spring-boot-startup-time by cc-by-sa and MIT license