개인적으로 스프링 배치를 공부하면서 스프링 컨테이너와 빈의 생성주기와 배치가 매우 밀접한 관련이 있다는 것을 알게되었다.
배치스케쥴러가 스프링 프레임워크 아키텍칭 요소(환경설정)과 결이 비슷하고, 이에 따라 생성 사이클에 대해 한번 정리하는 것이 좋겠다 생각이 들었다.
아래 글이랑 같이 이해하면 좋을 것 같다.
https://velog.io/@gyrbs22/%EA%B0%9C%EB%B0%9C%EC%A7%80%EC%8B%9D-IoC-DI-AOP
생성주기는 스프링 컨테이너와 빈을 서로 연관지으면서 공부하고 싶었는데, 관련 글을 찾다가 이해하기 용이한 정리글이 있어서 해당 블로그 내용을 토대로 공부하였다.
스프링의 생명주기는 크게 스프링 컨테이너 생성주기와 빈 생성주기로 나눌 수 있고, 각각 별도의 생명주기를 가지면서 밀접한 연관관계에 있다.
- 컨테이너 초기화 : 스프링 컨테이너를 생성하고, 환경설정 및 클래스에서 선언한 빈들을 생성한다.
- 컨테이너 사용 : 애플리케이션 동작 시 컨테이너에서 빈을 사용하여 필요한 작업을 수행하고, 컨테이너는 빈을 제공한다.
- 컨테이너 종료 : 애플리케이션 종료 시 컨테이너는 종료, 이에 따라 빈도 같이 종료된다.
여기서 중요한 점은, 컨테이너 초기화 시 빈도 같이 생성된다는 점(컨테이너와 빈의 연관관계)과 빈 객체를 생성한 후 의존 관계가 주입된다.
- 빈 객체 생성 : 컨테이너 초기화 후 빈 객체도 생성, 의존관계 설정 전이다.
- 의존 관계 주입 : 빈 객체 생성 후 빈 객체 간 의존관계 설정, 생성자 주입 및 setter를 통해 이루어진다.
- 빈 객체 초기화 : 빈 객체 생성, 의존관계 주입 후 객체 초기화하여 빈을 사용할 수 있도록 준비하는 작업이 이루어진다.
- 빈 객체 소멸 : 스프링 컨테이너 종료 시 빈 객체도 소멸
빈 객체가 초기화할때, 종료할때 콜백함수 즉 해당 시점에서 자동으로 메소드를 작동할 수 있는 방법이 존재한다.
Java 표준 기술로, 빈도 하나의 클래스처럼 객체화하여 init(), close() 메서드를 활용하여 콜백할 수 있다.
@PostConstruct
@PreDestroy
놀랐던 점은 현재 프로젝트에서 사용하고 있는 initializingBean을 상속받으면서 afterPropertiesSet(), destroy()를 구체화하였는데..이게 권장되지 않는 과거에 사용되었던 기술이라는 점이었다.
스프링 배치는 빈을 활용하여, 아무래도 과거에서 사용하는 방법보다는 최대한 현재 사용하는 방법을 익혀서 공부하는 것이 좋을 것 같다.
큰 틀 - https://kangkangsulae.tistory.com/m/146
빈 콜백 - https://innovation123.tistory.com/213