[Spring] 빈 라이프사이클과 범위

2022. 9. 4. 19:32Spring

728x90
반응형
SMALL

컨테이너 초기화와 종료

스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다.

그리고 스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.

컨테이너가 초기화될 때 빈 객체의 생성, 의존 주입, 초기화가 이루어지고,

컨테이너가 종료될 때 빈 객체의 소멸이 일어난다.

 

스프링 컨테이너는 빈 객체를 초기화하고 소멸하기 위해 빈 객체의 지정한 메서드를 호출한다.

그리고 다음 두 인터페이스에 이 메서드를 정의하고 있다.

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

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

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

빈 객체가 DisposalbeBean 인터페이스를 구현하면 스프링 컨테이너는 소멸 과정에서 빈 객체의 destroy()를 실행한다.

(이 때 빈 객체에 각 메소드들을 오버라이드하여 알맞게 구현하면 된다.)

 

 

모든 클래스가 두 인터페이스를 상속받아 구현할 수 있는 것은 아니다.

이럴 경우 스프링 설정에서 직접 메소드를 지정할 수 있다.

//초기화와 소멸 과정에서 사용할 메소드 설정
	@Bean(initMethod="connect", destroyMethod="close")
	public Client2 client2() {
		Client2 client = new Client2();
		client.setHost("host");
		//client.connect(); -> initMethod를 설정하는 대신 직접 실행 가능
		return client;
	}

위 코드를 예로 들면, Client2 클래스에 connect 와 close 메소드를 정의한다.(단, 두 메소드는 파라미터가 없어야 한다.)

그리고 위와 같이 @Bean 애노테이션의 initMethod 와 destroyMethod 속성을 이용해

초기화와 소멸 과정에서 사용할 메소드를 지정할 수 있다.

 

주석처리된 부분을 실행되도록 하고, initMethod 속성을 이용하지 않을 수도 있다.

이렇게 직접 초기화 메소드를 실행할 경우 초기화 메소드가 두 번 호출되지 않도록 유의해야 한다.

예를 들어, afterPropertiesSet() 함수의 경우 직접 이 메소드를 실행하면,

빈 객체가 생성되고나서 한 번 호출되고 직접 메소드를 호출할 때 한 번 더 호출된다.


빈 객체의 생성과 관리 범위

별도 설정을 하지 않으면 빈은 싱글톤 범위를 갖는다.

즉, 스프링 컨테이너는 빈 객체를 한 개만 생성한다.

따라서 하나의 빈 객체를 여러 번 불러와도 모두 동일한 빈 객체를 참조한다.

 

하지만 빈의 범위를 프로토타입으로 지정하면 빈 객체를 불러올 때마다 새로운 객체를 생성한다.

	@Bean
	@Scope("prototype")
	public Client client() {
		Client client = new Client();
		client.setHost("host");
		return client;
	}

위의 빈 객체의 경우 프로토타입으로 지정되어 있다.

 

이 때 주의해야 할 점이 있다.

프로토타입 범위를 갖는 빈은 컨테이너가 종료되어도 해당 빈 객체의 소멸 메소드를 실행하지 않는다.

따라서 프로토타입 범위의 빈을 사용할 때에는 빈 객체의 소멸 처리를 코드에서 직접 해야 한다.

728x90
반응형
LIST

'Spring' 카테고리의 다른 글

[Spring] AOP 프로그래밍  (0) 2022.09.05
[Spring] 컴포넌트 스캔  (0) 2022.09.04
[Spring] 자동 주입  (0) 2022.08.31