월루를 꿈꾸는 대학생

[핵심원리 - 기본] 빈 생명주기 콜백 본문

Programing/Spring Boot

[핵심원리 - 기본] 빈 생명주기 콜백

하즈시 2023. 7. 25. 22:53
728x90

빈 생명주기 콜백 시작

디비 커넥션 풀 (서버 올라올 때 미리 디비 연결시킴 - 요청올 때 바로 대응 가능 ), 네트워크 소켓처럼 미리 열어놔서 필요한 연결 미리 해두고 어플리케이션 종료 시점에 연결을 모두 종료하는 작업하려면 객체의 초기화와 종료 작업이 필요하다!

다음과 같은 예시로 어떻게 움직이는지 확인해보자

스프링 빈의 라이프 사이클
객체 생성 -> 의존관계 주입
일단 객체부터 만들어 놔야 그 다음에 의존관계 주입이 가능하지 (생성자 주입 예외)

스프링 빈은 객체를 생성하고 , 의존관계 주입 끝난 다음 필요한 데이터 사용 가능
초기화 : 객체에 필요한 값이 다 세팅되어 있는거

개발자가 의존관계 주입 완료 시점을 어떻게 알 수 있을까?

  • 스프링 빈에게 콜백 메서드를 통해서 초기화 시점 알려줌

스프링 빈의 이벤트 라이프 사이클

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

초기화 콜백 : 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출
소멸전 콜백 : 빈이 소멸되기 직전에 호출

객체 생성과 초기화는 분리하자!

  • 생성자는 파라미터받고 객체 생성하는 책임이 있다
  • 초기화는 생성된 값들 토대로 외부 커넥션 유지 등 무거운 동작을 수행
  • 생성자에 초기화까지 하는 건 좋지 않음 명확하게 나눠 분리하는 것이 유지보수에도 좋음

스프링 빈이 야 나 이제 초기화 끝냈어!! 야 나 곧 끝나는데 어떻게 처리할거냐? 이런 걸 어떻게 알려줄까?

  • 인터페이스(InitializingBean, DisposableBean)
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @PostConstruct, @PreDestroy 애노테이션 지원

총 3가지가 있고 밑에서 자세히 알아보자


인터페이스 InitializingBean, DisposableBean


public class NetworkClient implements InitializingBean , DisposableBean {

@Override  
public void afterPropertiesSet() throws Exception {  
    connect();  
    call("초기화 연결 메세지");  
}  

@Override  
public void destroy() throws Exception {  
    disconnect();  
}
생성자 호출, url = null
NetworkClient.afterPropertiesSet
connect: http://hello-spring.dev
call: http://hello-spring.dev message = 초기화 연결 메시지
13:24:49.043 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.destroy
close + http://hello-spring.dev

인터페이스를 받아서 해당 메서드를 구체화 시킴
afterPropertiesSet 은 빈의 의존관계 주입이 끝나면 자동 콜백 되는 함수
destroy 는 빈이 죽기 직전 호출되는 콜백 함수

먼가 플러터 생명주기랑 비슷하네 initState, destroy같이

단점

  • 스프링 전용이라 의존적임
  • 초기화 , 소멸 메서드 이름 변경 무리

요즘은 인터페이스 사용하지 않는다 참고로만 알고 있자!!

빈등록 초기화, 소멸 메서드 지정

@Bean(initMethod = "init", destroyMethod = "close"
빈에다가 초기화, 소멸 메서드를 따로 지정해주면 자동으로 콜백됨

편하네;

특징

  • 메서드 이름 변경이 자유롭다
  • 스프링 코드에 의존적이지 않음
  • 제일 큰 장점 : 코드 고칠수 없는 외부 라이브러리에도 적용 가능

종료 메서드 추론

  • @Bean destoryMethod가 있는데 임마는 종료 메서드를 알아서 판단 shutdown 혹은 close 이런 메서드 있으면 자동 추론해서 따로 등록 안해도 찾아서 실행시켜줌
  • 기능 실행하기 싫으면 destoryMethod="" 공백 넣어주면 됨

    @Bean(initMethod = "init") 이렇게 설정해도 알아서close 메서드 찾아서 실행시켜줌

하아... 결국 또 이거도 그렇게 안 쓰나보군
==애노테이션 쓰면 된다고 함!!==


애노테이션 @PostConstruct , @PreDestory


@PostConstruct  
public void init() {  
    connect();  
    call("초기화 연결 메세지");  
}  
@PreDestroy  
public void close() throws Exception {  
    disconnect();  
}

저렇게 애노테이션 넣기만 하면 됨

특징

  • 매우 편리하다 , 권장 방식
  • 컴포넌트 스캔과 잘 어울림
  • 외부 라이브러리에 적용하지 못하는 게 단점 외부라이브러리 초기화 종료 하려면 위에 @Bean 설정 쓰면 됨

@PostConstruct, @PreDestroy 애노테이션을 사용하자

출처
https://inf.run/wFfL

728x90