Spring
[Spring] 스프링 컨테이너의 생성과 종료
재담
2022. 2. 13. 22:55
스프링 컨테이너는 크게 다음의 주기를 갖는다.
- 컨테이너 생성
- 빈 메타 정보(XML이나 자바 설정)를 이용해서 빈 객체 생성
- 컨테이너 사용
- 컨테이너 종료(빈 객체 제거)
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 프로그래밍 (최범균 저)