[Spring] Spring bean life cycle

한호성·2022년 10월 19일
0

글의 목적

Spring bean & Life Cycle에 대해서 설명하는 글입니다.

  • Spring Container 는 자바 객체(Bean)의 생성과 소멸 같은 생명주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 합니다.

Bean Life Cycle

  • Spring의 Bean은 Java 또는 XML bean 정의를 기반으로 IoC 컨테이너가 시작될 때 인스턴스화 되어야 한다.
  • Bean을 사용 가능한 상태로 만들기 위해 사전, 사후 초기화 단계를 수행해야 할 수 있다.
  • 그 후 Bean이 더 이상 필요하지 않으면 IoC Container에서 제거된다.
  • 다른 시스템 리소스를 해제하기 위해 사전 및 사후 소멸 단계를 수행해야 할 수 있다.

Bean Life cycle 이란 해당 객체가 언제 어떻게 생성되어 소멸되기 전까지 어떤 작업을 수행하고 언제, 어떻게 소멸되는지 일련의 과정을 이르는 말이다.

Spring Container는 이런 빈 객체의 생명주기를 컨테이너의 생명주기 내에서 관리하고, 생성이나 소멸 시 호출될 수 있는 콜백 메서드를 제공하고 있다.

Spring Bean Life Cycle 흐름 정리

1) 스프링 컨테이너 생성
2) 스프링 빈 생성
3) 의존성 주입
4) 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
5) 사용
6) 소멸전 콜백 :빈이 소멸되기 직전에 호출
7) 스프링 종료

Spring bean Life Cycle Call back

1) 인터페이스 (InitializaingBean, DisposableBean)

public class Example1 implements InitialzingBean, DisposableBean {
	```
    @Override
    public void afterPropertiestSet() throws Exception {
    	// 초기화 로직
    }
    
    @Override
    public void destory() throws Exception {
    	// 객체 소멸 로직 (메모리 회수, 연결 종료 등)
    }
}

단점 : 코드를 고칠 수 없는 외부 라이브러리에 적용 불가능

2) 설정 정보에 초기화 메소드, 종료 메소드 지정

인터페이스를 구현하는 것이 아니라 @Bean Anootation에 initmethod,destroyMehod를 속성으로 초기화 하여 각각 지정한다.

public class ExampleBean {
    public void init() throws Exception {
    	//초기화 콜백 
    }
    
    public void close() throws Exception {     
        // 소멸 전 콜백 
    }
}

@Configuration
class LifeCycleConfig {
	 @Bean(initMethod = "init", destroyMethod = "close")
     public ExampleBean exampleBean() {
	
     }
}
  • 위 방법은 위에 명시한 두 인터페이스를 구현시킬 수 없는 클래스의 객체를 스프링 컨테이너에 등록할 때 유용하다.
  • 메소드 명을 자유롭게 부여할 수 있고, 스프링 코드에 의존하지 않는다.
  • 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화 종료 메서드를 적용할 수 있다.

3) @PostConstruct, @PreDestroy annotiation 사용

  • @PostConstruct
    : 기본 생성자를 사용하여 빈이 생성된 후 인스턴스가 요청 객체에 반환되기 직전에 주석이 달린 메서드가 호출됩니다.

  • @PreDestroy
    : @PreDestroy주석이 달린 메소드는 bean이 bean 컨테이너 내부 에서 파괴되기 직전에 호출됩니다 .

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class DemoBean
{
	@PostConstruct
	public void customInit()
	{
		System.out.println("Method customInit() invoked...");
	}

	@PreDestroy
	public void customDestroy()
	{
		System.out.println("Method customDestroy() invoked...");
	}
}
  • 최신 스프링에서 가장 권장하는 방법으로 애노테이션 하나만 붙이면 되므로 매우 편리합니다.
  • 패키지를 잘 보면 javax.annotation.PostConstruct 로 스프링에 종속적인 기술이 아니라 JSR-250 라는 자바 표준입니다.따라서 스프링이 아닌 다른 컨테이너에서도 동작합니다.
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 점입니다.

Reference

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition
https://dodokwon.tistory.com/57

profile
개발자 지망생입니다.

0개의 댓글