다오의 개발일지

TIL-6 빈 생명주기 콜백 본문

Spring

TIL-6 빈 생명주기 콜백

다오__ 2023. 5. 18. 18:56

데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.

 

데이터베이스 커넥션

  관계형 데이터베이스를 쓰는데 미리 서버가 올라올 데이터베이스랑 미리 연결 놓는다 TCP나 핸드 쉐이킹동안 오      래 걸리기 때문에 미리 서버-DB간 연결을 10개~100개정도의 연결을 놓는다 클라이언트 요청이 들어오면 즉각 응답      해 줄 있다. 

 

 

스프링을 통해 초기화 작업과 종료 작업을 어떻게 진행하는지 예제로 알아보자.

 

간단하게 외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정해보자. 여기선 실제로 네트워크에 연결하는 것은 아니고, 단순히 문자만 출력하도록 했다. 'NetworkClient'는 애플리케이션 시작 'connect()'를 호출해서 연결을 맺어두어애야 하고, 애플리케이션이 종료되면 'disconnect'를 호출하여 연결을 끊어야 하는 클래스이다.

 

NetworkClient 클래스

 

 

 

NetworkClient클래스를 사용하는 Test

 

 

콘솔창을 보면 생성자 호출 url = null, connect = null, call = null이 나오는 것을 있다. 너무 당연한 이야기지만 생성자 부분을 보면 url정보 없이 connect 호출되는 것을 있다. 객체를 생성한 후에 setUrl()이 호출되어야 url이 존재하게 된다 하지만 생성자만 호출하여 모두 null값으로 출력이 되는 것을 볼 수 있다.

 

 

스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다.

객체 생성 -> 의존관계 주입

(생성자 주입 예외)

 

 

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

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

 

초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 호출

소멸 콜백 : 빈이 소멸되기 직전에 호출

 

스프링은 다양한 방식으로 생명주기 콜백을 지원한다.

 

 

세가지 방법으로 생명주기를 관리한다.

 

1. 인터페이스 InitializingBean, DisposableBean

 

앞서 작성했던 NetworkClient클래스에 InitializingBean 인터페이스를 implements한다.

 

 

메서드를 오버라이딩한다. 생성자에 있던 메서드들을 가져온다.

스프링의 의존관계 주입이 끝나면 호출되는 메서드이다.

 

마찬가지로 DisposableBean을 추가한다.

 

disconnect() 메서드를 destroy()콜백 메서드에 넣어준다.

스프링 컨테이너가 내려가서 종료하기 전에 호출된다.

 

 

 

출력결과

 

 

 

 

 

 

2. 설정 정보 사용 등록 초기화, 소멸 메서드

설정 정보에 '@Bean(initMethod = "init", destroyMethod = "close")' 처럼 초기화, 소멸 메서드를 지정할 있다.

 

설정 정보를 사용하도록 변경

 

NetworkClient.class에서 메서드를 설정 정보 바탕으로 메서드 정의

 

 

설정 정보 사용 특징

메서드 이름을 자유롭게 있다.

스프링 빈이 스프링 코드에 의존하지 않는다.

코드가 아니라 설정정보를 사용하기 때문에 코드를 고칠 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 있다.

 

종료 메서드 추론

 

 

3. 어노테이션 @PostConstruct @PreDestroy

결론부터 말하면 어노테이션을 사용하자.

 

 

호출메서드에 어노테이션 추가한 만으로 기능이 작동한다.

 

Import jakarta가 맞는지 확인하자 (강의에서는 javax)

 

@PostConstruct, @PreDestroy 특징

최신 스프링에서 가장 권장하는 방법이다.

어노테이션 하나만 붙이면 되므로 매우 편리하다.

스프링에 종속적인 기술이 아니라 JSR-250이라는 자바 표준이다 따라서 스프링이 아닌 다른 컨테이너에서도  동작한다.

컴포넌트 스캔과 어울린다.

유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다. 외부 라이브러리를 초기화, 종료 해야하면 @Bean의 기능(initMethod, destroyMethod)을 사용하자.