티스토리 뷰
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을 통해 불필요한 리소스 소모를 줄이고, 애플리케이션의 시작 속도를 높일 수 있습니다.
그러나 무분별하게 적용하면 오히려 시스템의 예측 가능성과 유지보수성을 저하시킬 수 있으니, 꼭 필요한 빈에만 한정적으로 사용하는 것이 좋습니다.
'Programming' 카테고리의 다른 글
GraalVM Native 이미지를 빌드 자동화툴 및 프레임워크 (0) | 2025.03.21 |
---|---|
Next.js 리소스를 최적화 (0) | 2025.03.20 |
스프링부트 서비스 리소스 절감 최적화 전략 (0) | 2025.03.20 |
GraalVM을 사용한 네이티브 이미지 정적 링크 빌드란? (0) | 2025.03.20 |
자바 WebClient VS FeignClient 비교 (0) | 2025.03.20 |