[기본] 빈 생명주기 콜백

이전 포스팅

우리는 스프링 빈 등록과 의존성 주입. 이를 조회하는 방법에 대해 익혔다. 예를 들어 커넥션 풀 빈을 생성한다 가정하고 순서로 표시해보자.

  1. 컨테이너와 함께 커넥션풀 스프링빈 생성
  2. 스프링빈에 의존성 주입
  3. DB와 연결해놓는 초기화 작업 수행
  4. 클라이언트가 사용
  5. 연결 종료 수행
  6. 컨테이너 종료(빈 소멸)

커넥션풀 빈은 의존성 주입받고 DB와 연결하는 초기화 작업. 빈이 소멸될 때 연결을 종료하는 소멸전 작업이 필요하다. 그런데 우리는 언제 생성&의존성주입이 완료되는지 알 수 없다.

빈 생성&의존성주입 후 수행할 초기화 작업과 소멸전 작업을 따로 선언해줄 수 없을까?


빈 초기화&소멸 콜백

빈 초기화란 생성&의존성주입 직후에 빈이 수행할 작업을 말한다. 커넥션 풀의 DB연결이 이에 해당한다. 자바나 스프링은 초기화 콜백을 통해 자동 호출되도록 이를 지원한다.

1. 인터페이스 InitializingBean, DisposableBean

public class ConnectionPool implements InitializingBean, DisposableBean {

    public ConnectionPool() {
    	System.out.println("커넥션풀 생성");	
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
    	System.out.println("DB 연동 수행");
    }
    
    @Override
    public void destroy() throws Exception {
    	System.out.println("연결 해제");
    }
}
  • 스프링의 초기화, 소멸 인터페이스인 InitializingBean, DisposableBean 을 상속

  • 멤버 메서드 afterPropertiesSet 과 destroy 를 Override 하여 구현

  • 콜백 메서드 이름 변경 불가. 내부에 메서드를 추가해야하므로 수정이 불가능한 외부 라이브러리에는 적용 불가.

스프링에 의존, 멤버 메서드 이름 변경 불가, 코드 수정이 필요하므로 외부 라이브러리에 적용 불가의 이유로 현재는 거의 사용하지 않음


2. @Bean 의 설정정보에 지정


public class ConnectionPool {

    public ConnectionPool() {
    	System.out.println("커넥션풀 생성");	
    }
    
    public void init() {
    	System.out.println("DB 연동 수행");
    }
    
    public void close() {
    	System.out.println("연결 해제");
    }
}

@Configuration
public class WebConfig {
	@Bean(initMethod = "init", destroyMethod = "close")
    ConnectionPool connectionPool() {
    	return new ConnectionPool();
    }
}
  • Bean 의 설정 정보에 initMethod 와 destroyMethod 를 명시해주는 방식

  • 스프링 코드를 상속받지 않기에 스프링 코드에 의존하지 않음

  • 코드 수정 없이 설정 정보에 메서드 이름만 넣어주면 되므로 외부 라이브러리에 적용 가능

  • destroyMethod 는 추론 기능이 있어 close, shutdown 이라는 이름의 메서드가 있으면 자동으로 등록된다. 추론 기능을 끄려면 destroyMethod = "" 로 등록하자.

스프링 코드에 비의존적, 외부 라이브러리에 적용 가능한 점 때문에 외부 라이브러리에 콜백을 추가할 때 사용한다. destroyMethod의 경우 추론기능이 있음에 유의한다.


3. @PostConstruct, @PreDestroy 어노테이션

public class ConnectionPool {

    public ConnectionPool() {
    	System.out.println("커넥션풀 생성");	
    }
    
    @PostConstruct
    public void init() {
    	System.out.println("DB 연동 수행");
    }
    
    @PreDestroy
    public void close() {
    	System.out.println("연결 해제");
    }
}
  • 멤버 메서드에 PostConstruct, PreDestroy 어노테이션으로 등록

  • 매우 편리하며 스프링 종속 기술이 아닌 자바 표준 기술이다.

  • 멤버 메서드에 어노테이션을 추가해야하기에 수정이 불가능한 외부라이브러리에는 쓸 수없다.

어노테이션만 등록하면 되기에 매우 편리하며 가장 자주 사용하나 외부라이브러리에는 적용 불가능하다.


외부 라이브러리에 초기화, 소멸 콜백을 추가할 때는 @Bean 에 속성추가하는 방법을 사용하고. 그 외의 경우에는 @PostConstruct @PreDestory 어노테이션을 사용하자



본 글은 김영한님의 "스프링 핵심 원리 - 기본편" 강의내용 및 이해한 내용을 정리한 것입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

좋은 웹페이지 즐겨찾기