Spring-JSP

[Spring-JSP] 초기화 메서드 Spring Bean 생명주기

Jeong Jeon
반응형

오늘은 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 순으로 호출되는것을 알수있다.

 

각 시점별 원하는 초기화 메서드를 구현하여 사용할 수 있다.!

반응형