지연 초기화 vs 즉시 초기화
Spring의 기본 초기화는 즉시 초기화 방식을 사용한다.
Context가 실행되면 해당 context가 관리하는 모든 빈을 초기화하는 것이다.
하지만 이런 초기화를 특정 빈만 나중에 하고 싶다면 지연 초기화 방식을 사용한다.
지연 초기화는 @Lazy 어노테이션을 이용하여 사용하며 적용된 빈은 context가 실행될때 초기화되는 것이 아닌 빈이 사용될때 초기화가 된다. 지연 초기화는 component, Bean, Configuration에 사용 가능하다. 특히 configuration에 사용하면 설정 파일에 있는 모든 빈들이 지연 초기화된다.
하지만 추천되는 초기화 방식은 즉시 초기화 방식이다. 왜냐하면 Spring 구성에 오류가 있을 경우 프로그램이 시작하자마자 오류가 있다는 것을 찾을 수 있기 때문이다. 이러한 이유로 인해 지연 초기화는 권장도 되지않고 자주 사용되지 않는다. 단 지연 초기화의 경우 메모리를 덜 쓴다는 장점이 있다.

Bean 스코프 - 프로토타입 및 싱글톤
//프로토타입
@Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass{
}
//싱글톤
@Component
class NormalClass{
}
프로토타입은 위 방식을 통해 선언을 하고나면 해당 클래스 Bean을 사용할때마다 새로운 인스턴스를 생성하여 사용하게 된다.
반면 싱글톤은 Spring의 기본 값이며 프로토타입과 달리 Spring Context 내 에서 한개의 인스턴스만 생성되고 사용한다.

위 사진에서 보이듯이 2개의 차이점은 많지만 프로토타입은 각 사용자의 정보가 따로 유지되는 정보를 관리하는 시나리오일때 권장되며 그 외의 경우에는 싱글톤으로 관리하는 것을 권장한다.
PostConstruct, PreDestroy
@Component
class SomeClass{
private SomeDependency someDependency;
public SomeClass(SomeDependency someDependency){
super();
this.someDependency=someDependency;
System.out.println("All dependencies are ready!!");
}
@PostConstruct
public void initialize(){
someDependency.getReady();
}
@PreDestroy
public void cleanUp(){
System.out.println("CleanUp");
}
}
@Component
class SomeDependency{
public void getReady() {
System.out.println("Some logic using SomeDependency");
}
}
@PostConstruct를 사용하면 의존성이 주입된 후에 해당 어노테이션이 달린 메서드를 호출한다. 즉 위에서의 상황과 같이 의존성 주입이 된 직후 초기화를 진행한다거나 최초로 해야하는 작업이 있을때 사용하면 좋은 어노테이션이다.
@PreDestroy는 반대로 Bean이 삭제되기 전에 해야하는 작업이 있을 때 예를 들어 데이터베이스와의 연결을 끊어야 하는 경우 해당 어노테이션을 Bean삭제 전에 실행한다.
'SpringBoot' 카테고리의 다른 글
| [Spring Boot] Spring Cloud Netflix Eureka (2) | 2024.02.05 |
|---|---|
| [Udemy] Spring Boot 3 - 의존성 주입 (2) | 2023.11.07 |
| [Udemy] Spring Boot 3 - @Primary VS @Qualifier (1) | 2023.11.02 |
| [Udemy] Spring Boot 3 - Java Bean, POJO, Spring Bean 차이 (6) | 2023.11.01 |
| [Udemy] SpringBoot 3 - Spring Bean (0) | 2023.11.01 |