[Spring] 빈 생명주기 관리 _ @PostConstruct & @PreDestroy
자원의 활당과 해제, 초기화와 소멸을 자동화하여 개발자가 수동으로 관리해야 하는 부담을 줄이고 애플리케이션의 관리와 유지보수를 용이하게 하기 위해 @PostConstruct
와 @PreDestroy
어노테이션을 사용하여 객체의 생명주기 관리를 보다 효율적으로 할 수 있다.
스프링 빈의 이벤트 사이클 (Event Cycle)
빈 정의 및 등록
- 먼저, 스프링 컨테이너는 구성 파일(XML)이나 어노테이션을 통해 빈의 정의를 읽는다.
- 이 정의에는 빈의 클래스 타입, 생명 주기 범위, 의존성 등이 포함된다.
➡️ 빈 인스턴스화
- 스프링 컨테이너는 빈의 정의에 따라 클래스의 인스턴스를 생성한다.
➡️ 의존성 주입 (Dependency Injection)
- 빈 인스턴스가 생성된 후, 스프링은 해당 빈의 의존성을 주입한다.
- 이는 생성자 주입, 세터 메소드 주입 등 다양한 방식으로 이루어질 수 있다.
➡️ 빈 초기화 콜백
- 의존성 주입이 완료된 후, 빈은 초기화 된다.
- 이때
@PostConstruct
어노테이션이 적용된 메소드가 호출되거나, ‘InitializingBean’인터페이스의 ‘afterPropertiesSet()’메소드가 실행된다.
➡️ 빈 사용
- 초기화 완료된 빈은 애플리케이션에서 사용된다.
➡️ 빈 소멸 콜백
- 애플리케이션 종료 시 또는 빈이 더 이상 필요 없을 때, 빈은 소멸된다.
- 이때
@PreDestroy
어노테이션이 적용된 메소드가 호출되거나, ‘DisposableBean’인터페이스의 ‘destroy()’ 메소드가 실행된다.
@PostConstruct
해당 어노테이션은
빈의 초기화
를 위해서 사용한다. 스프링 컨테이너가 모든 필수 속성을 설정하고 나서바로 실행되는 메소드
에 붙인다. 이 메소드는 빈이 생성되고 의존성 주입이 완료된 후한 번만 호출
된다. 즉,빈이 작업을 시작하기 전에 필요한 자원을 설정하거나 초기화하는 데 사용
된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyService {
@PostConstruct
public void init() {
// 초기화 로직
System.out.println("MyService가 초기화됩니다.");
// 예: 데이터베이스 연결 설정 등
}
// 서비스 로직
public void performService() {
System.out.println("서비스가 수행됩니다.");
// 서비스 관련 주요 로직
}
}
사용 이유
- 객체 생성 후 초기화 작업을 자동화하고자 할 때 사용한다. 예를 들어, 데이터베이스 연결을 설정하거나, 필요한 자원을 로드하는 등의 작업을 객체 생성 직후에 자동으로 수행할 수 있다.
- 이 어노테이션을 사용하면 개발자가 별도의 초기화 코드를 작성할 필요 없이, 스프링 프레임워크가 객체 생성 후 자동으로 해당 메소드를 호출 해준다.
- 이는 코드의 가독성을 높이고, 초기화 로직을 한 곳에 집중시켜 관리하기 쉽게 만들어 준다.
@PreDestroy
해당 어노테이션은
빈의 소멸
전에 사용된다. 스프링 컨테이너가 종료되기 전에 실행되는 메소드에 붙인다. 이 메소드는 빈이 제거되기 전에 호출되며, 주로사용된 자원을 정리하고 해제
하는데 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyService {
// 서비스 로직
public void performService() {
System.out.println("서비스가 수행됩니다.");
// 서비스 관련 주요 로직
}
// @PreDestroy 어노테이션이 적용된 메소드
@PreDestroy
public void cleanup() {
// 정리 로직
System.out.println("MyService가 정리됩니다.");
// 예: 데이터베이스 연결 해제, 자원 해제 등
}
}
사용 이유
- 객체가 소멸되기 전에 정리 작업을 자동화하고자 할 때 사용한다. 예를 들어, 열려 있는 파일 핸들을 닫거나, 네트워크 연결을 해제하는 등의 자원 정리 작업을 수행할 수 있다.
- 스프링 컨테이너가 종료되기 전에 자동으로 해당 메소드를 호출해 주므로, 개발자가 소멸 로직을 직접 관리핦 필요가 없다.
- 이는 자원 누수를 방지하고, 애플리케이션이 안정적으로 종료될 수 있도록 도와준다.
This post is licensed under CC BY 4.0 by the author.