Programming

자바 Lazy Initialization이 유용하게 사용 하는 법

ipxy 2025. 3. 20. 11:19
728x90

Lazy Initialization(지연 초기화)은 실제로 필요한 시점까지 객체의 생성이나 리소스 할당을 지연시키는 방법입니다. 이를 통해 애플리케이션의 성능 향상과 리소스 사용량을 효율적으로 관리할 수 있습니다.

Lazy Initialization이 유용한 경우

  • 애플리케이션 시작 시간을 줄이고 싶을 때
  • 자주 사용하지 않는 무거운 객체를 초기 로딩에서 제외하여 리소스를 절약하고 싶을 때
  • 메모리나 CPU 사용량을 최소화하고 싶을 때

스프링부트에서 Lazy Initialization을 적용하는 방법

스프링부트는 기본적으로 Bean을 즉시 초기화(Eager Initialization)합니다. 하지만 특정 Bean을 사용할 때까지 생성을 지연(Lazy Initialization)하도록 설정할 수 있습니다.

📌 방법 1. @Lazy 애너테이션 사용하기

예시 코드:

@Component
@Lazy
public class HeavyService {
    public HeavyService() {
        System.out.println("HeavyService 생성됨");
    }

    public void process() {
        System.out.println("HeavyService 프로세스 수행");
    }
}

위 코드의 HeavyService는 실제로 다른 빈에서 호출될 때 생성됩니다.

@RestController
public class MyController {
    private final HeavyService heavyService;

    public MyController(HeavyService heavyService) {
        this.heavyService = heavyService;
    }

    @GetMapping("/process")
    public String process() {
        heavyService.process(); // 이 시점에 HeavyService가 생성됨
        return "처리 완료";
    }
}

초기 실행 시점이 아닌 /process 엔드포인트가 호출된 순간에 생성됩니다.


📌 방법 2. @Bean 메서드에 @Lazy 적용하기

Configuration 클래스에서도 Lazy 설정을 할 수 있습니다.

@Configuration
public class AppConfig {

    @Bean
    @Lazy
    public HeavyService heavyService() {
        return new HeavyService();
    }
}

이렇게 설정하면, HeavyService는 호출 시점까지 생성되지 않습니다.


📌 방법 3. 애플리케이션 전체에 Lazy Initialization 적용하기 (권장하지 않음)

스프링부트에서 글로벌 Lazy 초기화를 사용하려면 application.properties에 아래 설정을 추가하면 됩니다.

spring.main.lazy-initialization=true

이 설정을 추가하면 모든 빈이 Lazy 초기화됩니다. 단, 예상치 못한 부작용이 발생할 수 있어 필요한 경우에만 개별 빈 단위로 적용하는 것을 추천합니다.


Lazy Initialization의 장점과 주의사항

장점 ✅ 주의사항 ⚠️

초기 로딩 속도 향상 첫 호출 시 지연 발생 가능
리소스 사용 효율성 증가 런타임 시점에 문제가 발생할 수 있음
불필요한 Bean 생성 방지 디버깅 난이도가 증가할 수 있음

따라서 Lazy Initialization을 적용할 때는 반드시 사용 빈도를 고려하여 적절한 대상에만 적용하는 것이 좋습니다.


정리

Lazy Initialization을 통해 불필요한 리소스 소모를 줄이고, 애플리케이션의 시작 속도를 높일 수 있습니다.
그러나 무분별하게 적용하면 오히려 시스템의 예측 가능성과 유지보수성을 저하시킬 수 있으니, 꼭 필요한 빈에만 한정적으로 사용하는 것이 좋습니다.

728x90