상세 컨텐츠

본문 제목

[스프링1] 6장. 빈 라이프 사이클과 범위

22-23/22-23 Spring 1

by YUZ 유즈 2022. 11. 5. 10:02

본문

728x90

해당 포스트는 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 [최범균 저] 책 내용을 참고하였습니다.


❗컨테이너 초기화와 종료

📌기본

public class Main {

	public static void main(String[] args) {
		//1. 컨테이너 초기화
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
		
		//2. 컨테이너에서 빈 객체를 구해서 사용
		Greeter g1 = ctx.getBean("greeter", Greeter.class);
		Greeter g2 = ctx.getBean("greeter", Greeter.class);
		System.out.println("(g1 == g2) = " + (g1 == g2));

		//3. 컨테이너 종료
		ctx.close();
	}
}
  1. 컨테이너 초기화
    • AnnotationConfigApplicationContext 의 생성자를 이용해서 컨텍스트 객체 생성
    • 빈 객체 생성
    • 빈 연결(의존 주입), 초기화
  2. 컨테이너 사용
  3. 컨테이너 종료
    • 빈 객체 소멸

close() 메소드는 AbstractApplicationContext 클래스에 정의되어 있다. AnnotationConfigApplicationContext(자바 설정) 뿐 아니라 GenericXmlApplicationContext(xml 설정)도 AbstractApplicationContext를 상속받고 있기 때문에 두 컨텍스트 모두 close() 메소드를 이용해 컨테이너를 종료할 수 있다.

 

 

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

📌객체 생성 → 의존 설정 → 초기화 → 소멸

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

(스프링 컨테이너 초기화 →) 빈 객체 생성 → 빈 의존 설정 → 빈 초기화 → (스프링 컨테이너 종료 →) 빈 소멸

 

📌빈 객체의 초기화와 소멸: 스프링 인터페이스

  • org.springframework.beans.factory.InitializingBean
    • afterPropertiesSet() : 빈 객체 초기화 시 호출되는 메서드
  • org.springframework.beans.factory.DisposableBean
    • destroy() : 빈 객체 소멸 시 호출되는 메서드
public interface InitializingBean{
		void afterPropertiesSet() throws Exception;
}

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

 

초기화와 소멸 과정이 필요한 예 : 데이터베이스 커넥션 풀, 채팅 클라이언트

 

public class Client implements InitializingBean, DisposableBean {

	private String host;

	public void setHost(String host) {
		this.host = host;
	}

	//빈 객체의 초기화 과정
	@Override 
	public void afterPropertiesSet() throws Exception {
		System.out.println("Client.afterPropertiesSet() 실행");
	}

	public void send() {
		System.out.println("Client.send() to " + host);
	}

	//빈 객체의 소멸 과정
	@Override
	public void destroy() throws Exception {
		System.out.println("Client.destroy() 실행");
	}

}

 

📌빈 객체의 초기화와 소멸: 커스텀 메서드

InitializingBean이나 DisposableBean 인터페이스를 상속할 수 없거나 상속하고 싶지 않은 경우, 설정 클래스에서 @Bean 등록 시 직접 메서드를 지정하면 된다.

  • initMethod 속성 : 초기화 메서드 지정
  • destroyMethod 속성: 소멸 메서드 지정
public class Client2 {

	private String host;

	public void setHost(String host) {
		this.host = host;
	}

	public void connect() { //초기화 과정에서 실행할 메서드
		System.out.println("Client2.connect() 실행");
	}

	public void send() {
		System.out.println("Client2.send() to " + host);
	}

	public void close() { //소멸 과정에서 실행할 메서드
		System.out.println("Client2.close() 실행");
	}

}

 

설정 클래스에서 초기화 메서드와 소멸 메서드를 지정한다.

@Configuration
public class AppCtx {
	
	@Bean(initMethod = "connect", destroyMethod = "close")
	public Client2 client2() {
		Client2 client = new Client2();
		client.setHost("host");
		return client;
	}
}

 

initMethod 속성과 destroyMethod 속성에 지정한 메서드는 파라미터가 없어야 한다. 이 두 속성에 지정한 메서드에 파라미터가 존재할 경우 스프링 컨테이너는 익셉션을 발생시킨다.

 

 

❗빈 객체의 생성과 관리 범위

📌싱글톤 범위 : @Scope(”singleton”)

기본적으로 스프링 컨테이너는 빈 객체를 한 개만 생성한다.

@Configuration
public class AppCtxWithPrototype {

	@Bean(initMethod = "connect", destroyMethod = "close")
	@Scope("singleton") //생략 가능
	public Client2 client2() {
		Client2 client = new Client2();
		client.setHost("host");
		return client;
	}
}

 

📌프로토타입 범위 : @Scope(”prototype”)

빈 객체를 구할 때마다 매번 새로운 객체를 생성한다.

@Configuration
public class AppCtxWithPrototype {

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

프로토타입 범위의 빈은 완전한 라이프 사이클을 따르지 않는다. 프로토타입의 빈 객체의 경우, 스프링 컨테이너를 종료한다고 해서 해당 빈 객체의 소멸 메서드가 실행되지 않는다. 따라서 프로토타입 범위의 빈을 사용할 때는 소멸 처리를 직접 코드로 실행하여야 한다.

 


1. 컨테이너 초기화 단계에서는 컨테이너 객체 생성, ( 빈 객체 생성 ), ( 빈 의존 주입 ), ( 빈 초기화 ) 과정이 진행된다.

2. 컨테이너 소멸 단계에서는 ( 빈 객체 소멸 ) 과정이 진행된다.

3. 빈 객체 초기화 과정에서는 ( afterPropertiesSet() ) 메서드가 실행된다.

4. 빈 객체 소멸 과정에서는 ( destroy() ) 메서드가 실행된다.

5. 빈 객체 최기화 및 소멸 과정을 직접 작성하고자 하는 경우, @Bean 애노테이션의 ( initMethod )와 ( destroyMethod ) 속성 값을 지정해주면 된다.

6. 스프링 컨테이너는 기본적으로 ( 싱글톤 ) 범위로 빈을 생성한다.

7. 프로토타입 범위의 빈을 생성하고자 한다면, ( @Scope ) 애노테이션을 "prototype"으로 지정한다.

 


Spring1

EDITOR: 로자

728x90

'22-23 > 22-23 Spring 1' 카테고리의 다른 글

[스프링1] 8장. DB 연동  (0) 2022.11.10
[스프링1] 7장. AOP 프로그래밍  (0) 2022.11.10
[스프링1] 5장. 컴포넌트 스캔  (0) 2022.11.05
[스프링1] 4장. 의존 자동 주입  (0) 2022.11.05
[스프링 1] 3장.스프링 DI  (0) 2022.10.27

관련글 더보기