Java/JavaSpring

Chap 6. 빈 라이프사이클과 범위

펭킹 2022. 6. 24. 14:49

컨테이너 초기화와 종료

생성자를 통해서 객체 생성 할 때, 스프링 컨테이너를 초기화 한다. 스프링 컨테이너 설정 클래스에서 정보를 읽어와 빈 객체 생성(get) 후 각 빈을 의존주입 한다.

컨테이너를 사용한다는 뜻은 getBean()과 같은 메서드를 이용하여 컨테이너 내의 빈 객체를 구현하는 것이다.

컨테이너 사용 종료시 컨테이너를 종료한다. close() 메서드를 사용하여 컨테이너를 종료하고, 해당 매서드는 AbstractApplicationContext 클래스에 정의되어 있다.

위 내용을 요약하면 다음과 같다.

 

컨테이너 초기화 => 빈 객체 생성, 의존 주입, 초기화

컨테이너 종료 =>  빈 객체 소멸

 

스프링 빈 객체의 라이프사이클

스프링 컨테이너 내의 빈 객체의 라이프사이클은 다음과 같다.

 

 

스프링 컨테이너 초기화 시 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존 설정한다. 이때 의존 자동 주입(@Autowired)을 통한 의존 설정이 수행된다. 모든 의존 설정이 완료되면 빈 객체 초기화를 수행한다. 빈 객체를 초기화 하기 위해 스프링은 빈 객체의 지정된 메서드를 호출한다.

 

빈 객체의 초기화와 소멸을 위해 다음 두 인터페이스를 import 해야 된다.

 

org.springframework.beans.factory.InitializingBean

org.springframework.beans.factory.DisposableBean

 

두 인터페이스는 다음과 같다.

 

public interface InitializingBean
{
	void afterPropertiesSet() throws Exception;
}

public interface DisposableBean
{
	void destroy() throws Exception;
}

 

빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 빈 객체의 afterPropertiesSet() 메서드를 실행한다.

빈 객체가 DisposableBean 인터페이스 구현 시 빈 객체의 destroy() 메서드를 실행한다. destroy() 실행 시 Connection을 끊는다.

데이터베이스 커넥션 풀과 채팅 클라이언트는 초기화와 소멸과정이 필요하다. 빈 객체 소멸 시 사용중인 데이터베이스 연결을 끊어야 한다.

close() 메서드가 없으면 컨테이너 종료를 수행하지 않아 빈 객체의 소멸도 일어나지 않는다.

 

모든 클래스가 위 두개의 인터페이스를 상속 받아 구현 할 수 있는 것은 아니다. 외부 제공 클래스를 스프링 빈객체로 설정할 때 소스코드를 받아야만 두 인터페이스를 구현하도록 수정할 수 있다.

방법은 @Bean 태그에 initMethod 속성과 destroyMethod 속성을 사용해서 초기화 메서드와 소멸 메서드 이름을 지정하면 된다.

 

@Bean
public Client client()
{
    Client client = new Client();
    client.setHost("host");
    client.aterPropertiesSet();//중복
    return client;
}

 

Client 클래스는  InitializingBean을 구현하여서 afterPropertiesSet() 메서드를 실행한다.  즉 afterPropertiesSet() 메서드가 두번 호출되어 오류가 발생한다.

initMethod 속성과 destroyMethod 속성에 지정한 메서드는 파라미터가 없어야 한다.

 

빈 객체의 생성과 관리 범위

 

빈은 싱글톤(singleton) 범위(scope)를 가진다. 범위(scope)를 프로토타입으로 설정하면 빈 객체를 구할 때 매번 새로운 객체를 생성한다. 싱글톤 범위를 명시적으로 지정하는 방법은 @Scope("singleton") 이다.

프로토타입 범위는 객체 소멸되지 않는다. 컨테이너 종료해도 생성 프로토타입 빈 객체 소멸 메소드를 실행하지 않기 때문이다.