본문 바로가기

Java/JavaSpring

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

컨테이너 초기화와 종료

생성자를 통해서 객체 생성 할 때, 스프링 컨테이너를 초기화 한다. 스프링 컨테이너 설정 클래스에서 정보를 읽어와 빈 객체 생성(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") 이다.

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

'Java > JavaSpring' 카테고리의 다른 글

Chap 8. DB 연동  (0) 2022.06.28
Chap 7. AOP 프로그래밍  (0) 2022.06.27
Chap 5. 컴포넌트 스캔  (0) 2022.06.20
Chap 4. 의존 자동 주입  (0) 2022.06.20
Chap 3. 스프링 DI  (0) 2022.06.20