Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 빈 생명주기 본문

백엔드/스프링

[SpringBoot] 빈 생명주기

soeunkk 2021. 9. 13. 17:18

🌳 빈 생명주기

스프링 빈을 생성할 때 객체 생성 -> 의존관계 주입 단계를 거친다. 이때, 객체만 생성되고 의존관계 주입이 완료되기 전까진 빈이 초기화 되었다고 말할 수 없다. (중요 정보는 누락된 상태이므로) 따라서 모든 의존관계 주입이 완료된 이후에 데이터를 사용해야 한다. 그런데, 의존관계 주입이 모두 완료되었다는 것을 어떻게 알까?

 

스프링은 의존관계 주입이 완료됐을 때와 스프링 컨테이너가 종료되기 직전에 콜백을 준다. 

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료

 

🌳 생명주기 콜백 지원 방법

1. InitializingBean, DisposableBean 인터페이스

    ▪ 해당 빈 객체에 InitializingBean, DisposableBean 인터페이스를 implements 한다.

    ▪ 빈의 의존관계 주입이 끝나면 afterPropertiesSet() 함수를 호출하기 때문에 이를 오버라이딩 하여 초기화 한다.

    ▪ 빈이 종료되기 직전에 destroy() 함수를 호출하기 때문에 이를 오버라이딩 하여 안전하게 종료 준비한다.

   단점

    ▪ 스프링 전용 인터페이스에 의존하며, 메서드 이름을 변경할 수 없다.

    ▪ 클래스 내부에서 변경이 일어나기 때문에 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.

 

2. 설정 정보에 초기화 메서드, 종료 메서드 지정

    ▪ 빈을 등록할 때 @Bean(initMethod="[초기화 메서드 이름]", destroyMethod="[종료 메서드 이름]") 라고 지정한다

   장점

    ▪ 스프링 빈이 스프링 코드에 의존하지 않으며, 메서드 이름을 변경할 수 있다.

    ▪ 설정 정보를 사용하여 메서드를 지정하기 때문에, 코드를 고칠 수 없는 외부 라이브러리에도 적용할 수 있다.

    ▪ 특히, 라이브러리는 대부분 종료 메서드로 'close', 'shutdown' 이름을 많이 사용하는데 destroyMethod는 이를 추론하는 (inferred)가 디폴트로 설정되어 있기 때문에, 설정하지 않아도 해당 이름으로 된 메서드를 자동으로 호출해준다.

 

3. @PostConstruct, @PreDestroy 어노테이션

    ▪ 초기화 메서드의 함수 정의 부분에 @PostConstruct 어노테이션을 붙인다.

    ▪ 종료 메서드의 함수 정의 부분에 @PreDestroy 어노테이션을 붙인다.

   장점

    ▪ 어노테이션만 붙이면 완료되기 때문에 편리하다.

    ▪ 자바 표준이기 때문에 스프링이 아닌 다른 컨테이너에도 사용할 수 있다.

    ▪ @Bean을 사용하지 않아도 빈으로 자동 등록해주는 컴포넌트 스캔과 잘 어울린다.

   단점

    ▪ 클래스 내부에서 변경이 일어나기 때문에 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.

 

 

따라서,

대부분의 경우 @PostConstruct와 @PreDestroy 어노테이션을 사용하고,

외부 라이브러리에 적용하고 싶은 경우 @Bean의 initMethod와 destroyMethod를 사용하자!

'백엔드 > 스프링' 카테고리의 다른 글

[SpringBoot] 스프링 MVC  (0) 2022.01.19
[SpringBoot] 빈 스코프  (0) 2021.09.13
[SpringBoot] 롬복(Lombok)  (0) 2021.09.08
[SpringBoot] 자동주입(@Autowired)  (0) 2021.09.07
[SpringBoot] 의존관계 주입  (0) 2021.09.07
Comments