빈 생명주기 콜백

Yerim·2021년 9월 8일
0

Spring

목록 보기
8/9
post-thumbnail

✔ Inflearn 강의 수강 내용 정리글입니다!


빈 생명주기 콜백 시작

객체의 초기화와 종료 작업이 필요할 때가 있다.
ex) 네트워크 소켓처럼 애플리케이션 시작 전에 필요한 연결을 미리 해두고, 종교 시점에 모든 연결 종료

💡 임의의 NetworkClient 객체 생성

public class NetworkClient {

 	private String url;
    
 	public NetworkClient() {
           System.out.println("생성자 호출, url = " + url);
           connect();
           call("초기화 연결 메시지");
	}
    
    	public void setUrl(String url) {
           this.url = url;
        }
        
        //서비스 시작시 호출
        public void connect() {

        }
           
        public void call(String message) {
        
 	}
 
        //서비스 종료시 호출
        public void disconnect() {
         
        }
}

💡 실행

public class BeanLifeCycleTest {
 	@Test
 	public void lifeCycleTest() {
 		ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
 		NetworkClient client = ac.getBean(NetworkClient.class);
 		ac.close(); //스프링 컨테이너를 종료, ConfigurableApplicationContext 필요
 	}
    
 	@Configuration
 	static class Life**텍스트**CycleConfig {
 		@Bean
 		public NetworkClient networkClient() {
 		NetworkClient networkClient = new NetworkClient();
 		networkClient.setUrl("http://hello-spring.dev");
 		return networkClient;
 		}
 	}
}
  • 생성자에서 url 정보 없이 connect()가 호출된다.
  • 객체 생성 후에 수정자 주입을 통해 setUrl()이 호출된 후 url이 존재하게 된다.

💡 스프링 빈의 라이프 사이클

객체 생성 ➡ 의존관계 주입

  • 객체 생성 후 의존 관계 주입이 끝나고 나서야 필요한 데이터를 사용할 수 있는 준비가 완료된다.
  • 초기화 작업은 의존관계 주입이 모두 끝난 후 수행해야 한다.
    ➡ 어떻게 알 것인가?

스프링은 의존관계 주입이 끝난 후 콜백 메서드를 통해 스프링 빈에게 초기화 시점을 알려준다

스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준 다.

📍 스프링 빈의 이벤트 라이프 사이클
스프링 컨테이너 생성 ➡ 스프링 빈 생성 ➡ 의존관계 주입
➡ 초기화 콜백 ➡ 사용 ➡ 소멸 전 콜백 ➡ 스프링 종료

  • 초기화 콜백 : 빈이 생성되고, 의존관계 주입이 끝난 후 호출
  • 소멸 전 콜백 : 빈이 소멸되기 전에 호출

인터페이스 InitializingBean, DisposableBean

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
...

 @Override
 public void afterPropertiesSet() throws Exception {
 	connect();
 	call();
 }
 
 @Override
 public void destroy() throws Exception {
 	disConnect();
 }
  • InitializingBeanafterPropertiesSet() 메서드로 초기화 지원
  • DisposableBeandestroy() 메서드로 소멸 지원

💡 초기화, 소멸 인터페이스 단점

  • 스프링 전용 인터페이스, 코드가 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드 이름 변경 불가
  • 외부 라이브러리(내가 코드를 고칠 수 없음)에 적용 불가

지금은 거의 사용하지 않는 방법들!


빈 등록 초기화, 소멸 메서드 지정

설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")처럼 지정 가능

@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
 	NetworkClient networkClient = new NetworkClient();
 	networkClient.setUrl("http://hello-spring.dev");
 	return networkClient;
}

 public void init() {
 	connect();
 	call("초기화 연결 메시지");
 }
 
 public void close() {
 	disConnect();
 }

💡 설정 정보 사용 특징

  • 메서드 이름을 자유롭게 줄 수 있다.
  • 스프링 빈이 코드에 의존하지 않는다.
  • 설정 정보를 사용하기 때문에 외부 라이브러리에도 사용 가능

어노테이션 @PostConstruct, @PreDestroy

 @PostConstruct
 public void init() {
 	connect();
 	call("초기화 연결 메시지");
 }
 
 @PreDestroy
 public void close() {
 	disConnect();
 }
  • 가장 편리하게 초기화와 종료 실행 가능!

💡 @PostConstruct, @PreDestroy 어노테이션 특징

  • 최신 스프링에서 권장
  • 스프링 종속적인 기술이 아니라 자바 표준이므로 다른 컨테이너에서도 동작
  • 외부 라이브러리에서는 사용 불가능(코드 수정 불가능하기 때문)
    ➡ 이때에는 @Bean의 기능을 사용하자!

📍 @PostConstruct, @PreDestroy 어노테이션을 사용하자
📍 외부 라이브러리 초기화, 종료 필요 시 @Bean의 initMethod, destroyMethod를 사용하자


[출처 - Inflearn : 스프링 핵심 원리 - 기본편]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

profile
Backend-Developer

0개의 댓글