Spring

[Spring] 스프링 컨테이너의 생성과 종료

재담 2022. 2. 13. 22:55

스프링 컨테이너는 크게 다음의 주기를 갖는다.

  1. 컨테이너 생성
  2. 빈 메타 정보(XML이나 자바 설정)를 이용해서 빈 객체 생성
  3. 컨테이너 사용
  4. 컨테이너 종료(빈 객체 제거)

1번과 2번 과정은 컨테이너를 생성할 때 함께 진행된다.

// 빈 메타 정보를 컨테이너 생성 시점에 제공해서 빈 객체 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:config.xml");

 

또는 다음과 같이 컨테이너를 먼저 생성하고 메타 정보를 컨테이너에 제공할 수도 있다.

// 컨테이너 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
// 메타 정보 제공
ctx.load("classpath:config.xml");
// 빈 객체 생성(읽어온 메타 정보로 빈 객체 재생성)
ctx.refresh();

 

자바 설정을 사용하는 경우에도 동일하게 가능하다. 참고로 컨테이너를 생성한 뒤에 XML 설정이나 자바 설정을 제공할 때에는 반드시 refresh() 메서드를 호출해서 빈 객체를 초기화해주어야 한다. 그렇지 않으면 컨테이너가 초기화되지 않아 빈을 구할 때 exception이 발생한다.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class);
ctx.refresh();

 

컨테이너를 사용하면 getBean() 등의 메서드를 이용해서 빈 객체를 사용할 수 있다.

// 컨테이너 사용
AuthenticationService authSvc = ctx.getBean("authenticationService", AuthenticationService.class);

 

컨테이너를 더 이상 사용할 필요가 없다면, 컨테이너를 종료해야 한다.

// 컨테이너 종료
ctx.close();

 

항상 원하는 순간에 close() 메서드를 호출할 수 있는 것은 아니다. Ctrl+C 키를 눌러서 자바 프로세스를 강제 종료하는 경우 close() 메서드를 호출하는 코드가 실행되지 않을 수 있다. 이런 상황이 발생할 수 있다면 registerShutdownHook() 메서드를 사용해야 한다.

// JVM이 종료될 때 컨테이너 종료 과정이 실행된다.
ctx.registerShutdownHook();

registerShutdownHook() 메서드는 자바의 셧다운 훅 기능을 사용해서, JVM이 종료될 때 스프링 컨테이너 종료 과정을 실행하도록 만든다. (물론 OS 수준에서 JVM 프로세스를 강제로 종료하면 실행되지 않는다.)


Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)