프로그래밍공부(Programming Study)/스프링(Spring Framework)

Spring 애플리케이션 부팅 속도 최적화 방안

Chann._.y 2024. 9. 23.
728x90

Spring 애플리케이션의 부팅 속도를 줄이기 위한 다양한 최적화 방법들이 있습니다. 이 최적화는 주로 애플리케이션의 구조와 설정, 의존성 관리 및 리소스 할당을 효율화하는 작업으로 나눌 수 있습니다. 아래에서 부팅 속도를 최적화하는 방법을 설정 최적화, 의존성 및 빈 관리, 메모리 최적화, 빌드 최적화와 같은 여러 측면에서 살펴보겠습니다.

1. Lazy Initialization(지연 초기화)

Spring Boot 2.2부터는 지연 초기화(Lazy Initialization)를 활성화하여 필요할 때 빈을 초기화할 수 있습니다. 기본적으로는 애플리케이션 부팅 시 모든 빈이 즉시 생성되지만, 지연 초기화를 사용하면 필요한 빈만 생성되므로 부팅 시간이 줄어듭니다.

방법:

  • application.properties 또는 application.yml 파일에 설정:
    spring.main.lazy-initialization=true
    이 설정을 적용하면 빈은 필요할 때만 초기화되며, 이를 통해 초기 부팅 시간이 단축됩니다.

2. Spring DevTools 사용

Spring DevTools는 개발 환경에서 부팅 속도를 빠르게 해주기 위한 기능을 제공합니다. 이는 클래스 변경 시 전체 애플리케이션을 재시작하는 대신, 핫 리스타트(Hot Restart)를 통해 더 빠르게 변경 사항을 반영합니다. DevTools는 개발 환경에서 주로 사용되며, 애플리케이션 재시작 시간을 줄여줍니다.

방법:

  • pom.xml 또는 build.gradle 파일에 spring-boot-devtools를 추가합니다.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

3. Application Context의 프로파일 분리

Spring Boot는 애플리케이션 프로파일(profile)을 통해 환경에 따라 설정을 분리할 수 있습니다. 개발, 테스트, 프로덕션 환경에 따라 필요한 빈을 선택적으로 로드하여 불필요한 리소스 로딩을 피하고, 부팅 속도를 최적화할 수 있습니다.

방법:

  • 프로파일 설정:
    • application-dev.yml (개발 환경)
    • application-prod.yml (프로덕션 환경)
  • 실행 시 특정 프로파일을 활성화:
  • java -jar myapp.jar --spring.profiles.active=dev

이를 통해, 환경에 맞게 꼭 필요한 빈과 설정만 로드하여 부팅 시간을 줄일 수 있습니다.

4. 빈 스캐닝 범위 축소

Spring 애플리케이션은 @ComponentScan을 통해 빈을 자동으로 스캔합니다. 이 범위가 너무 넓으면 불필요한 빈까지 스캔되어 부팅 시간이 늘어날 수 있습니다. 패키지 범위를 명확히 지정하여 스캔 시간을 단축할 수 있습니다.

방법:

  • @ComponentScan의 범위를 특정 패키지로 한정:
    @SpringBootApplication
    @ComponentScan(basePackages = {"com.myapp.service", "com.myapp.controller"})
    public class MyApplication {
      public static void main(String[] args) {
          SpringApplication.run(MyApplication.class, args);
      }
    }

이를 통해 불필요한 클래스나 패키지를 스캔하지 않도록 하여 부팅 속도를 최적화할 수 있습니다.

5. Spring Boot의 spring.factories 커스터마이징

Spring Boot는 여러 자동 설정을 사용하는데, 그 중 일부는 애플리케이션에 불필요할 수 있습니다. 자동 설정 기능을 부분적으로 비활성화하면 부팅 속도를 단축할 수 있습니다.

방법:

  • META-INF/spring.factories 파일에서 필요하지 않은 자동 설정을 제외합니다.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

이렇게 필요 없는 설정을 제외하여 애플리케이션 초기화를 빠르게 할 수 있습니다.

6. Hibernate/JPA 지연 로드(Lazy Load) 사용

JPA/Hibernate를 사용하는 애플리케이션에서는 데이터베이스 초기화 과정이 부팅 시간에 영향을 줄 수 있습니다. 엔티티 관계를 지연 로딩(Lazy Loading)으로 설정하면, 불필요한 데이터 로딩을 줄일 수 있습니다.

방법:

  • 엔티티에서 @OneToMany, @ManyToOne 관계를 Lazy로 설정:
    @OneToMany(fetch = FetchType.LAZY)
    private List<Order> orders;

이렇게 설정하면, 데이터베이스에서 엔티티 관계를 즉시 로딩하지 않고, 필요할 때 로딩하게 됩니다.

7. 메모리 할당 최적화

부팅 속도는 JVM 메모리 할당에 의해서도 영향을 받을 수 있습니다. 애플리케이션이 사용할 수 있는 힙 메모리 크기를 적절히 설정하면, 부팅 성능을 개선할 수 있습니다.

방법:

  • JVM 옵션을 통해 초기 및 최대 메모리 크기를 설정:
    java -Xms512m -Xmx1024m -jar myapp.jar

이 설정은 최소 512MB, 최대 1024MB의 메모리를 사용하게 하며, 너무 적거나 큰 메모리 할당은 성능에 영향을 줄 수 있습니다.

8. Spring Data JPA 초기화 비활성화

데이터베이스 초기화를 비활성화하여 부팅 시간을 단축할 수 있습니다. Spring Boot는 기본적으로 데이터베이스를 초기화하려고 하지만, 실제 서비스에서는 이를 비활성화하여 속도를 높일 수 있습니다.

방법:

  • application.properties에서 데이터베이스 초기화를 비활성화:
    spring.jpa.hibernate.ddl-auto=none

이 설정은 애플리케이션이 실행될 때 데이터베이스 스키마를 생성하거나 변경하지 않도록 합니다.

9. 서버 포트 미리 바인딩

부팅 시 서버 포트를 미리 바인딩하는 방식으로 부팅 속도를 줄일 수 있습니다. 이는 Spring Boot 애플리케이션이 서버 초기화를 빨리 시작할 수 있게 합니다.

방법:

  • application.properties 파일에 설정:
    server.tomcat.connection-timeout=5000
    server.tomcat.max-threads=200

이러한 설정은 서버의 스레드 관리 및 타임아웃 설정을 최적화하여 빠른 부팅을 지원합니다.

10. AOT(Ahead-of-Time) 컴파일 사용

Spring Native 또는 GraalVM을 사용하여 AOT(Ahead-of-Time) 컴파일을 적용하면, 부팅 시점에 수행되는 일부 작업을 빌드 시점으로 미리 처리할 수 있습니다. 이 방식은 특히 서버리스 환경에서 부팅 시간을 크게 줄일 수 있습니다.

방법:

  • GraalVM을 사용해 네이티브 이미지를 생성하여 애플리케이션을 실행합니다.
    mvn -Pnative clean package

11. 필요 없는 스타터 제거

Spring Boot는 다양한 스타터(Starter) 라이브러리를 제공합니다. 하지만, 모든 스타터를 무분별하게 포함하면 부팅 시간이 증가할 수 있습니다. 필요한 라이브러리만 포함하여 부팅 시간을 최적화할 수 있습니다.

방법:

  • pom.xml에서 필요하지 않은 의존성을 제거:
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

필요한 스타터만 남기고 나머지를 제거하여 부팅 시간을 줄입니다.


결론

Spring 애플리케이션의 부팅 속도를 줄이기 위한 다양한 방법들이 있으며, 그 중 Lazy Initialization, 빈 스캐닝 범위 축소, 메모리 및 JVM 최적화, 자동 설정 비활성화, 프로파일 분리 등은 특히 효과적입니다. 각 애플리케이션의 특성과 환경에 맞춰 다양한 최적화 방법을 조합하면 부팅 시간을 크게 줄일 수 있습니다.

728x90

댓글