오늘은 Spring에서 서버 기동후 모든 어플리케이션을 구동하기위한 세팅이 끝난 후 실행되야 되는 메소드를 구현하는 방법을 작성해두려고 한다.
필자는 Server 재기동시 DI작업을 마치고 난뒤 Redis에 이런저런 데이터를 캐싱해 놓을때 사용했다.(관리자정보, IoT정보 , 메뉴 등)
Spring 생명주기와 관련된 부분이라, 전체적으로 기재해 놓으려고 한다.!
초기화 메서드
DI 작업 까지 마친 다음 실행되는 메서드로, DI를 통해 빈이 주입된 후에 초기화 할 작업이 있을때 초기화를 진행할 수 있다.
즉 초기화 메소드(initialization method)는 빈 오브젝트가 생성되고 DI 작업까지 마친 다음에 실행되는 메소드를 말한다.
InitializingBean
Spring에서 제공하는 인터페이스로 afterpropertiesSet()메서드를 구현하여 초기화 작업을 할 수 있다.
@Service
public class SpringLifeCycleTest implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("#############afterPropertiesSet#############");
}
}
본인은 해당 메서드에서 DB에서 가져온 Redis에 Caching할 데이터를 처리하였다.~!
사실 마지막 쯤에 호출순서를 정리해 놓을건데, 호출순서를 잘 감안해서 사용하면 될것같다.
@PostContruct
초기화 하고 싶은 메서드 위에 해당 어노테이션만 붙여주면 초기화시점에 호출된다.
@Service
public class SpringLifeCycleTest {
@PostConstruct
public void postConstruct() {
System.out.println("############postConstruct############");
}
}
특징은 초기화할 메서드에는 파라미터가 있으면 안됀다. -> 에러발생
@Bean(initMethod)
@Bean 어노테이션을 이용해서 빈으로 등록하는 거라면 @Bean 어노테이션 속성에 있는 initMethod를 이용하면 된다.
@Bean(initMethod = "init")
public SpringLifeCycleTest springLifeCycleTest() {
return new SpringLifeCycleTest();
}
public class SpringLifeCycleTest {
public void init() {
System.out.println("init");
}
}
xml을 이용해서 빈을 등록하는 방법도 있다. 하지만 지금은 패스.
컨테이너가 종료될때 빈이 사용한 리소스를 반환하거나 종료시점에 처리할 작업이 있을때 사용하는 종료메서드도 있다.
DisposableBean
Spring에서 제공하는 interface로 override하여 사용하면된다.
@Service
public class SpringLifeCycleTest implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("destroy");
}
}
@PreDestroy
@PostConstruct와 동일하게 원하는 메서드위에 어노테이션을 붙여주면 된다.
@Service
public class SpringLifeCycleTest {
@PreDestroy
public void destroy() {
System.out.println("destroy");
}
}
@Bean(destroyMethod)
@Bean(init)과 동일하게 빈을 등록할때 사용한다.
@Bean(destroyMethod = "destroy")
public SpringLifeCycleTest springLifeCycleTest() {
return new SpringLifeCycleTest();
}
@Service
public class SpringLifeCycleTest {
public void destroy() throws Exception {
System.out.println("destroy");
}
}
자 여기서 중요한것은 호출순서이다.
어떤것이 먼저 호출되는지 확인해보자.
public class SpringLifeCycleTest implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
@PostConstruct
public void postConstruct() {
System.out.println("postConstruct");
}
public void init() {
System.out.println("init");
}
}
@Bean(initMethod = "init")
public SpringLifeCycleTest springLifeCycleTest() {
return new SpringLifeCycleTest();
}
결과 :
postConstruct
afterPropertiesSet
init
제일먼저 PostConstruct -> afterPropertiesSet -> init 순으로 호출되는것을 알수있다.
각 시점별 원하는 초기화 메서드를 구현하여 사용할 수 있다.!
'Spring-JSP' 카테고리의 다른 글
[Spring-JSP] 어플리케이션 백그라운드 데몬쓰레드 + ServletContextListener (0) | 2021.07.12 |
---|---|
[Spring-JSP] @WebListener 와 ServletContextListener (0) | 2021.07.09 |
[Spring-JSP] Json 을 HashMap으로 변환하는 법 (0) | 2021.06.04 |
[Spring-JSP] ModelMapper란? 사용법 (0) | 2021.06.02 |
[Spring-JSP] 엄청쉬운 Apache Poi 데이터 Excel 다운로드 기능구현 (0) | 2021.05.31 |