-
김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.
콜백이 뭔지 헷갈리는 부분이 있어서 콜백의 정의를 먼저 찾아봤다
콜백의 정의
- 다른 코드의 인수로서 넘겨주는 실행가능한 코드
- 다른 함수에서 접근 가능하고 이를 실행한 함수 다음에 실행되는 함수
- 콜백을 넘겨받은 함수는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할수도 있다
- '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
*ac.close()를 쓰기 위해선 ConfigurableApplicationContext 컨테이너를 써야한다
InitializingBean은 afterPropertiesSet() 메소드로 초기화를 지원한다. 객체가 생성되고 난 직후에 실행된다.
DisposableBean은 destroy() 메소드로 소멸을 지원한다. 객체가 소멸되기 직전에 실행된다.
단점
- 스프링 전용 인터페이스다. 해당 코드가 스프링 전용 인터페이스에 의존한다.
- 초기화, 소멸 메소드의 이름을 변경할 수 없다.
- 내가 고칠 수 없는 외부 라이브러리에 적용할 수 없다
*인터페이스를 활용하는 방식은 스프링 초창기에 나온 방법들로 지금은 거의 사용하지 않는다
빈 등록 초기화, 소멸 메소드 지정
설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")를 지정해 초기화, 소멸 콜백을 지정 할 수 있다
* @Bean에 설정 정보를 세팅해주는 방식이다
특징
- 메소드 이름을 자유롭게 줄 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다
- 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메소드를 적용 할 수 있다.
종료메소드 추론
- @Bean의 destroyMethod 속성은 기본 값이 'infered'(추론)로 되어있다.
- destroyMethod를 따로 지정해주지 않는다고해도 추론 기능덕에 close, shutdown이라는 이름의 메소드를 자동으로 호출해준다. 이름 그대로 종료 메소드를 추론해서 호출해준다.
애노테이션 @PostContruct, @PreDestroy
*import 구문을 보면 Spring이 아니라 java의 표준을 따르고 있는것을 볼 수 있다
특징
- 최신 스프링에서 가장 권장하는 방법이다
- 사용하는 패키지가 javax.annotation.PostConstruct이다. 스프링에 종속적인 기술이 아니라 JSR-250이라는 자바 표준으로 스프링이 아닌 다른 컨테이너에서도 잘 동작한다
- 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자.
References
https://en.wikipedia.org/wiki/Callback_(computer_programming)
https://stackoverflow.com/questions/824234/what-is-a-callback-function/7549753#7549753
'스프링' 카테고리의 다른 글
빈 스코프 (0) 2021.09.17 의존관계 자동 주입 (0) 2021.09.06 컴포넌트 스캔 (0) 2021.09.01 싱글톤 패턴과 싱글톤 컨테이너 (0) 2021.08.28 스프링 빈과 스프링 컨테이너 (0) 2021.08.02