티스토리 뷰

초보 웹 개발자를 위한 스프링 5 프로그램 입문을 보고 복습 겸 개인 학습 정리입니다. (windows 기준)

 

컨테이너 초기화와 종료

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

1. 컨테이너 초기화 후에 컨테이너를 사용할 수 있다.

2. getBean()과 같은 메서드를 통해 컨테이너에 보관된 빈 객체를 구할 수 있다.

3. 사용이 끝나면 컨테이너를 종료하는데 close() 메서드를 사용하여 종료한다.

 

또한, 컨테이너의 사이클에 따라 다음 작업도 함께 이루어진다. 

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

컨테이너 종료 → 빈 객체 소멸

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();
	}
}

 

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

 

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

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

스프링에서 제공하는 InitializingBean 인터페이스와 DisposableBean 인터페이스에 지정한 메서드를 정의하고 있다.

 

대표적인 예로 데이터베이스 커넥션 풀이 있다.

이 커넥션 풀을 위한 빈 객체는 초기화 과정에 데이터베이스 연결을 생성하고 사용하는 동안 유지하지만 빈 객체를 소멸할 때 사용 중인 데이터베이스 연결을 끊어야 한다.

 

→ sp5-chap06/src/main/java/spring/Client.java

package spring;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
			// 스프링에서 정의하고 있는 인터페이스 구현
public class Client implements DisposableBean, InitializingBean {
    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 설정 값을 사용할 메서드 이름을 지정해주면 된다.

 

→ sp5-chap06/src/main/java/spring/Client2.java

package spring;

public class Client2 {
    private String host;

    public void setHost(String host) {
        this.host = host;
    }
    public void connect() { //초기화 연결 메서드
        System.out.println("Client2.connet() 실행");
    }
    public void send() {
        System.out.println("Clinet2.send() to" + host);
    }
    public void close() { // 소멸 메서드
        System.out.println("Client2.close() 실행");
    }
}

/*
설정 파일에서 initMethod속성과 destroyMethod속성을 
사용할 메서드인 이름으로 지정해주어야한다.

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

 

 

그 외 빈의 범위를 프로토타입으로 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성한다. (사용빈도가 낮음)

※ 프로토타입 범위의 빈은 빈 객체의 소멸 처리를 코드로 직접 해야 한다.

지정 방법

import org.springframework.context.annotation.Scope;

@Configuration
public class AppCtxWithPrototype {

    @Bean
    @Scope("prototype") // <- Scope 애노테이션과 속성값prototpye을 넣어준다
    public Client client() {
        Client client = new Client);
        client.setHost("host");
        return client;
    }
}

 

'study > Spring' 카테고리의 다른 글

chap 08 - DB 연동 DataSource 설정  (1) 2023.01.13
chap 07 - AOP 프로그래밍  (0) 2023.01.10
chap 05 - 컴포넌트 스캔  (0) 2023.01.05
chap 04 - 의존 자동 주입  (0) 2023.01.04
chap 03 - 스프링 DI (Dependency injection)  (0) 2022.12.05
댓글