FireDrago
[Spring] 빈 생명주기 콜백 본문
빈 생명주기 콜백
스프링 컨테이너에 객체가 생성되고 , 의존성이 주입되어 초기화 되면 빈을 사용할 준비가 된다.
싱글턴으로 생성된 빈은 스프링 컨테이너가 사라질때까지 빈으로 유지되지만,
프로토타입으로 생성된 빈은 생성, 의존성 주입되면 스프링컨테이너가 빈을 유지하지 않는다.
이처럼 빈은 어떻게 생성되느냐에 따라 각자 다른 생명주기를 가진다.
스프링은 빈이 초기화되었을때와 소멸될때등 빈 생명주기의 특정 단계에서 미리 설정한 기능 실행할 수 있다.
이를 빈 생명주기 콜백 이라고 한다. 예를들어 데이터베이스 연결을 사용하는 빈이 있다면,
의존성 주입이 완료될때, 데이터베이스와 연결을 시작하고, 빈이 소멸준비 되었을때, 데이터베이스 연결을 끊을 수 있는 것이다.
빈 생명주기 콜백 사용방법
| 인터페이스 | - 거의 사용하지 않는다. 초기 스프링의 기술 |
| @Bean 애너테이션에 메서드 지정 (initMethod = "init", destroyMethod = "close") |
- 외부 라이브러리는 내가 코드를 변경할 수 없다. 외부 라이브러리 코드 변경 없이 콜백 사용 할 수 있다. - 라이브러리는 대부분 close , shutdown 이라는 이름의 종료 메서드를 사용하 는데, close, shutdown 이름의 종료메서드를 자동으로 찾아서 호출한다. 설정해주지 않아도 기본값으로 동작한다. 이름을 지정해서 찾을 수도 있다. |
| @PostConstruct, @PreDestroy | - 기본적으로 이 방법을 가장 많이 사용한다. 외부 라이브러리가 필요할때@Bean 설정방법을 고려하자 - 자바표준을 따르고 있으므로, 스프링 환경이 아니어도 동작한다. - 컴포넌트 스캔(자동 빈 등록) 에 적합한 방식이다. |
<@Bean 애너테이션에 메서드 지정>


위 코드는 @Bean (initMethod = "[초기화 이후 실행될 메서드]" destroyMethod = "[소멸 직전 실행될 메서드]")
형식을 사용하여 빈 생명주기 콜백을 실행한다. close 메서드는 기본값으로 동작하므로
destroy = "close" 부분을 삭제해도 정상적으로 동작한다.
1. lifeCycleTest() 메서드를 실행하면, LifeCycleConfig 설정 정보를 바탕으로 NetworkClient 빈을 생성한다.
2. NetworkClient 객체를 먼저 생성하고, setUrl() 메서드를 통해 url 값을 초기화한다.
3. 초기화가 완료된 이후 init() 메서드가 실행된다. init() 메서드에서는 connect() 메서드를 호출하여
네트워크 연결을 수행하고, call() 메서드를 호출하여 초기화 메시지를 출력한다.
4. ac.close() 메서드를 통해 스프링 컨테이너가 닫히기 직전에 close() 메서드가 실행된다.
close() 메서드에서는 disconnect() 메서드를 호출하여 네트워크 연결을 해제한다.
-------------------------------------------------------------------------------------------------------------------
< @PostConstruct, @PreDestroy 사용>


@Bean 설정과 달라진 점은 컴포넌트 스캔으로 자동 빈 주입을 사용한 것과,
init 메서드와 close 메서드에 각각 @PostConstruct, @PreDestroy 애너테이션을 붙인것이다
기본적으로 가장 많이 사용되는 방식이다. 단지 외부라이브러리에서는 사용할 수 없으니 그때만 @Bean 설정을 고려하자
'프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] Spring 기본기능 (0) | 2024.01.30 |
|---|---|
| [Spring] Spring MVC 기본구조 (0) | 2024.01.26 |
| [Spring] 의존성 자동주입 (0) | 2024.01.09 |
| [Spring] 스프링 컨테이너와 싱글턴 (0) | 2024.01.06 |
| [Spring] 스프링 컨테이너와 스프링 빈 (0) | 2024.01.05 |
