스프링

빈 생명주기 콜백

내일도무사히 2021. 9. 9. 12:03

김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주

www.inflearn.com


 

콜백이 뭔지 헷갈리는 부분이 있어서 콜백의 정의를 먼저 찾아봤다

 

콜백의 정의

  • 다른 코드의 인수로서 넘겨주는 실행가능한 코드
  • 다른 함수에서 접근 가능하고 이를 실행한 함수 다음에 실행되는 함수
  • 콜백을 넘겨받은 함수는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할수도 있다
  • 'callback' 함수보단 'called at the back' 함수로 생각하는게 이해하기 편하다

 

 

Example)

// 다른 함수를 인자로서 받는 함수
funct printANumber(int number, funct callbackFunction) {
  printout("The number you provided is : " + number);
}

// driver 메소드의 callback function에 변수로 넣을 함수
funct printFinishMessage() {
  printout("I have finished printing numbers.");
}

// driver method
funct event() {
  printANumber(6, printFinishMessage);
}

Output)

The number you provided is : 6
I have finished printing numbers.

 


빈 생명주기 콜백

객체를 생성하고 난 직후나 객체가 소멸되기 직전에 해둬야하는 일들이 있을때가 있다.

예를들면 데이터베이스 커넥션 풀이나 네트워크 소켓을 관리하는등의 일이 있을 수 있다

이를 위해 스프링빈에서는 이를 지원하기 위해 이전부터 다음과 같은 콜백들을 지원해왔다.

 

 

1. 인터페이스 InitializingBean, DisposableBean

 

networkclient.java

 

테스트코드

*ac.close()를 쓰기 위해선 ConfigurableApplicationContext 컨테이너를 써야한다

 

Output

 

InitializingBean은 afterPropertiesSet() 메소드로 초기화를 지원한다. 객체가 생성되고 난 직후에 실행된다.

DisposableBean은 destroy() 메소드로 소멸을 지원한다. 객체가 소멸되기 직전에 실행된다.

 

 

단점

  • 스프링 전용 인터페이스다. 해당 코드가 스프링 전용 인터페이스에 의존한다.
  • 초기화, 소멸 메소드의 이름을 변경할 수 없다.
  • 내가 고칠 수 없는 외부 라이브러리에 적용할 수 없다

*인터페이스를 활용하는 방식은 스프링 초창기에 나온 방법들로 지금은 거의 사용하지 않는다

 

 


 

 

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

 

설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")를 지정해 초기화, 소멸 콜백을 지정 할 수 있다

NetworkClient.java
Test

* @Bean에 설정 정보를 세팅해주는 방식이다

Output

 

 

특징

  • 메소드 이름을 자유롭게 줄 수 있다.
  • 스프링 빈이 스프링 코드에 의존하지 않는다
  • 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메소드를 적용 할 수 있다.

 

 

종료메소드 추론

  • @Bean의 destroyMethod 속성은 기본 값이 'infered'(추론)로 되어있다.
  • destroyMethod를 따로 지정해주지 않는다고해도 추론 기능덕에 close, shutdown이라는 이름의 메소드를 자동으로 호출해준다. 이름 그대로 종료 메소드를 추론해서 호출해준다.

 

 


 

애노테이션 @PostContruct, @PreDestroy

 

NetworkClient.java

*import 구문을 보면 Spring이 아니라 java의 표준을 따르고 있는것을 볼 수 있다

 

Test

 

output

 

 

 

특징

  • 최신 스프링에서 가장 권장하는 방법이다
  • 사용하는 패키지가 javax.annotation.PostConstruct이다. 스프링에 종속적인 기술이 아니라 JSR-250이라는 자바 표준으로 스프링이 아닌 다른 컨테이너에서도 잘 동작한다
  • 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자.

References

https://en.wikipedia.org/wiki/Callback_(computer_programming) 

 

Callback (computer programming) - Wikipedia

A function provided as an argument to another function to be called during its execution A callback is often back on the level of the original caller. In computer programming, a callback, also known as a "call-after"[1] function, is any executable code tha

en.wikipedia.org

https://stackoverflow.com/questions/824234/what-is-a-callback-function/7549753#7549753

 

What is a callback function?

What is a callback function?

stackoverflow.com