web/Spring

스프링 실행 시 실행 되는 부분

반응형

스프링으로 만든 어플리케이션실행과 함께 스케줄등을 실행 시켜야 하거나 initialDB등등 초기화 하는 메서드를 실행시켜야 하는 경우가 있기 때문에 

실행되는 메소드에 대해서 알아볼 필요가 있어서
이 구동될 때 실행되는 메소드에 대해 정리하였다.


1. PostConstruct, PreDestory 


그 중 bean이 생성될 때 실행되는 init-method 또는 destroy-method를 하는
@PostConstruct와 @PreDestroy가 있다.

@PostConstruct는 InitializingBean 콜백 인터페이스로써 afterPorpertiesSet() 으로써 정의된다.
@PreDestory는 DisposableBean에 대해서 destroy()를 호출한다.

이런 초기화 메서드와 소멸 메서드의 객체 정의 메타데이터를 사용하면 클래스가 스프링 인터페이스와 커플링을 갖지 않으면서 이와 동일한 컨테이너와의 통합을 이룰 수있다.

이 둘은 Bean lifecycle이므로 컨텍스트 라이프사이클을 사용하고 싶은경우에는 바로아래의 방식을 사용한다.
-> 하지만 둘은 99% 케이스에서 동일하다.

빈이 생성될 때 실행되는 매커니즘이 한가지가 아니다. 하지만 이런 메카니즘을 여러개 선언하였을 때 실행 순서는 다음과 같다.



빈 생성
1). @PostConstruct 어노테이션이 붙은 메서드
2). InitializingBean 콜백 인터페이스로 정의된 afterPropertiesSet()
3). 커스텀 설정된 init() 메서드


빈 제거
1). @PreDestroy 어노테이션이 붙은 메서드
2). DisposableBean 콜백 인터페이스로 정의된 destroy()
3). 커스텀 설정된 destroy() 메서드



2. ApplicationContext 라이플 사이클 LifecycleProcessor

스프링이 관리하는 모든 객체는 이 인터페이스를 구현한다.
그리고 ApplicationContext의 시작과 종료의 컨텍스트에서 정의한 모든 라이플 사이클 구현체에서 단계적으로 이 LifecycleProcessor에서 다음 메소드가 실행된다.



1
2
3
4
5
6
7
8
9
10
11
public interface Lifecycle {
   void start();
   void stop();
   boolean isRunning();
}
 
// Lifecycle 인터페이스에서 확장된 인터페이스 LifecylcleProcessor 인터페이스
public interface LifecycleProcessor extends Lifecycle {
  void onRefresh();
  void onClose();
}
cs


3. ApplicationListener<ContextRefreshedEvent> 구현
ApplicationContext의 상태가 변경될 경우 ApplicationListener 이 변경된 상태를 통보받을 수 있도록 설계되어 있다.

이는 옵저버 패턴으로써 ApplicationContext는 subject, ApplicationListener은 observer로서 동작한다.

그렇기에 ApplicationContext는 ApplicationListener 인터페이스를 구현한 후 이벤트가 발생할 때마다 이를 통지한다.


이벤트

설명
ContextRefreshedEvent
ApplicationContext가 초기화되거나 갱신 될 때 실행됩니다.
ContextClosedEvent
ApplicationContext가 닫힐 때 실행됩니다.
RequestHandledEvent
Spring의 DispatcherServlet을 사용하는 Web 응용 프로그램에 HTTP 요청이있는 경우에 실행됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.techscore.spring.di;
 
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
 
public class ContextObserver implements ApplicationListener {
 public void onApplicationEvent (ApplicationEvent event) {
  if (event instanceof ContextRefreshedEvent) {
   System.out.println ( "context is refreshed.");
  } else if (event instanceof ContextClosedEvent) {
   System.out.println ( "context is closed.");
  }
 }
}
cs



ApplicationListner 인터페이스를 구현하여 onApplicationEvent를 재 정의 하는 경우 ApplicationContext의 상태 편경 시 마다 onApplicationEvent(..) method는 스프링 시작시 호출된다.

여기서 전달되는 ApplicationEvent의 형태에 따라 동작을 정의하여 필요한 동작을 수행할 수 있다.



반응형