(인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.
<스프링 빈 생명주기 콜백 지원 방법>
1) 인터페이스(InitializingBean, DisposableBean)
2) 설정 정보에 초기화 메서드, 종료 메서드 지정
3) @PostConstruct, @PreDestroy 애노테이션 지원
3. 빈 등록 초기화, 소멸 메서드 지정
1. 설정 정보를 사용하도록 변경
기존에는 InitializingBean의 afterPropertiesSet(), DisposableBean의 destory()를 Overriding 하여 사용했는데, 이제는 원하는 이름으로 초기화, 소멸 메서드를 만들 수 있다.
package hello.core.lifecycle;
// 가상 네트워크 클라이언트
public class NetworkClient {
private String url; // 접속해야할 서버 url
// 디폴트 생성자
public NetworkClient() {
System.out.println("생성자를 호출, url = " + url);
}
// 외부에서 url 설정하기
public void setUrl(String url) {
this.url = url;
}
// 서비스 시작시 호출
public void connect() {
System.out.println("connect: " + url);
}
// 서버에 연결이 된 상태에서 서버에 메시지 던지기
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
// 서비스 종료시 호출(안전하게 서비스 연결 끊어짐)
public void disConnect() {
System.out.println("close: " + url);
}
// 초기화 메서드(의존관계 주입이 끝나면 호출)
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
// 소멸 메서드(빈이 종료될 때 호출)
public void close(){
System.out.println("NetworkClient.close");
disConnect();
}
}
- 초기화 메서드명 = init, 소멸 메서드명 = close
2. 설정 정보에 초기화, 소멸 메서드 지정
설정정보에 @Bean(initMethod = 초기화 메서드명, destroyMethod = 소멸 메서드명)를 지정한다.
public class BeanLifeCycleTest {
...
@Configuration
static class LifeCycleConfig {
// NetworkClient 수동 빈 등록
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev"); // 연결할 서버 url 설정
return networkClient;
}
}
}
3. 결과
이전 방식과 동일한 결과가 잘 나오는 것을 확인할 수 있다.
4. 설정 정보 사용 특징
- 메서드 이름을 자유롭게 지정할 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 코드가 아니라 설정 정보를 사용하기 때문에, 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
- 수동 빈 등록할 경우에만 지원하는 기능이다.
[참고] https://www.inflearn.com/questions/130179
5. 종료 메서드 추론 기능
라이브러리는 대부분 close, shutdown이라는 이름의 종료 메서드를 사용하는데,
@Bean의 destroyMethod 속성의 기본값은 (inferred)추론으로 등록되어 있다.
추론 기능은 이름이 close, shutdown 인 메서드를 소멸 메서드로 자동으로 호출해준다.
추론 기능을 사용하고 싶다면, destroyMethod 값을 지정하지 않으면 되고,
추론 기능을 사용하지 않고 싶다면, destroyMethod="" 으로 지정하면 된다.
Q. "스프링 빈이 스프링 코드에 의존하지 않을 때" 얻을 수 있는 이점이 무엇인가?
A. NetworkClient 코드처럼 NetworkClient 클래스 내 스프링과 관련된 코드가 전혀 없으면, 스프링이 아닌 다른 프레임워크에서 NetworkClient 클래스를 코드 변경없이 사용할 수 있다.
만약 스프링에 의존적인 코드로 작성됐다면, 다른 프레임워크에서 사용할 때 해당 클래스(NetworkClient) 내 스프링에 의존적인 코드를 걷어내는 작업 즉, 코드 변경이 필요하게 된다.
[출처] https://www.inflearn.com/questions/465579
Q. 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다는 것은 무슨 의미인가?
1번 방식은 내가 만든 클래스(NetworkClient)가 InitializingBean, Disposable 인터페이스를 implements하여 직접 해당 클래스(NetworkClient) 내에서 afterProperties(), destroy() 메서드 재정의를 하였고, 이를 통해 초기화, 소멸 콜백 함수가 호출되도록 하였다.
→ 외부 라이브러리의 클래스 객체를 빈으로 등록하여 사용하는 경우, 외부 라이브러리 코드를 고칠 수 없다. 즉, 해당 클래스를 이전처럼 implements하여 초기화, 소멸 메서드를 재정의해줄 수 없다는 뜻이다. 그래서 1번 방식은 외부 라이브러리에 적용할 수 없다.
2번 방식은 내가 만든 클래스(NetworkClient)에 원하는 이름으로 초기화, 소멸 메서드를 각각 만들고 빈을 직접 등록할 때 @Bean(initMethod = 초기화 메서드명, destroyMethod = 소멸 메서드명) 으로 지정해주면 된다. 그러면 스프링이 자동으로 해당 initMethod, destroyMethod 속성 값으로 들어온 메서드를 호출해준다.
→ 외부 라이브러리의 클래스 객체를 빈으로 등록하여 사용하는 경우, 외부 라이브러리 코드를 고칠 수 없다. 하지만 외부 라이브러리 클래스의 초기화, 소멸 메서드 명을 찾아서 @Bean의 속성에 값을 각각 지정해주면 스프링이 자동으로 호출해준다.
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[스프링 핵심 원리] 9. 빈 스코프 - 빈 스코프란? & 프로토타입 스코프 (0) | 2022.05.23 |
---|---|
[스프링 핵심 원리] 08. 빈 생명주기 콜백 - 애노테이션 @PostConstruct, @PreDestroy (0) | 2022.05.20 |
[스프링 핵심 원리] 08. 빈 생명주기 콜백 - 인터페이스 InitializingBean, DisposableBean (0) | 2022.05.20 |
[스프링 핵심 원리] 08. 빈 생명주기 콜백 - 빈 생명주기 콜백 시작 (0) | 2022.05.20 |
[스프링 핵심 원리] 07. 의존관계 자동 주입 - 자동, 수동의 올바른 실무 운영 기준 (0) | 2022.05.20 |