빈 생명주기

이성준·2022년 8월 26일
0

Spring

목록 보기
6/11

빈 생명주기 메소드

개요

Bean은 스프링 컨테이너가 관리하는 객체입니다.
따라서 Bean도 스프링 컨테이너가 생성되고 종료됨에 따라 생명주기를 가집니다.
간략하게 예를 들면

스프링 컨테이너가 생성됨
인스턴스 생성 요청이 옴
1. 빈 인스턴스화
2. 의존관계 주입
스프링 컨테이너 닫힘

이런 생명주기를 가지는데요.

만약 클라이언트의 요청 이전에 데이터 베이스 연결을 해야한다거나(초기화),
컨테이너가 닫히기 전에 안전하게 종료하고싶으면 어떻게 해야할까요
그래서 오늘은 스프링 프레임워크에서 위 방법을 어떻게 해결해줬는지 정리해보겠습니다.

스프링은 이렇게 두가지를 제공합니다.

  • 스프링에선 빈의 의존관계가 생성되고 DI 작업까지 마친 다음에 실행하는 초기화 메소드
  • 컨테이너가 종료될때 호출돼서 종료 전에 처리해야할 작업을 수해하는 제거 콜백 메소드

그럼 빈의 생명주기를 다음과 같이 나타낼수 있습니다.

인터페이스 InitializingBean, DisposableBean

public class bean implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("초기화 작업");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("종료 전 작업");
    }
}

스프링이 제공하는 InitializingBean, DisposableBean 를 구현함으로써 초기화와 종료작업을 하는 작업 하지만 이 방식은 스프링 인터페이스를 그대로 노출하고 스프링과 강결합 되기때문에 권장하지않습니다.

@Bean의 initMethod, destroyMethod

빈 설정정보를 만들면서 Bean메소드의 initMethod와 destroyMethod 엘리멘트에 메소드를 지정해줄 수 있습니다.

 @Bean(initMethod = "init", destroyMethod = "close") 
        public BeanA beanA(){
            BeanA beanA = new BeanA();
            return beanA;
        }
public class BeanA {
    void init(){
        System.out.println("초기화");
    }
    void close() {
        System.out.println("종료");
    }
}

@PostCunstruct @PreDestroy

초기화나 종료전 메소드에 위 애노테이션을 지정해줍니다.

public class BeanA {
    @PostConstruct
    void init(){
        System.out.println("초기화");
    }
    @PreDestroy
    void close() {
        System.out.println("종료");
    }
}

굉장히 직관적이고, 자바 표준 공통애노테이션입니다, 하지만 외부 라이브러리에는 적용하지 못합니다. -> 코드를 수정할수가 없기 때문에

0개의 댓글