Languege/Java & Spring / / 2022. 3. 17. 22:45

[김영한 스프링] 빈 생명주기 콜백

빈 생명주기 콜백 시작

DB 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션이 시작하는 시점에 연결하고, 종료되는 시점에 연결을 종료하는 작업을 하려면 객체의 초기화와 종료 작업이 필요합니다.

이번 강의에서는 스프링에서의 빈 생명주기 콜백을 공부했습니다.

 

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

  1. 스프링 컨테이너 생성
  2. 스프링 빈 생성
  3. 의존관계 주입
  4. 초기화 콜백
  5. 사용
  6. 소멸전 콜백
  7. 스프링 종료

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

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

 

객체의 생성과 초기화를 분리하자.

생성자는 필수 파라미터를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가집니다. 반면 초기화는 이렇게 생성된 값들을 이용해 외부 커넥션 연결 등 무거운 동작을 수행합니다. 따라서, 생성자 안에 무거운 초기화 작업을 함께 하는 것 보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋습니다.

(내부 변수들만 약간 변경하는 정도의 단순한 경우는 예외)

 

스프링이 지원하는 빈 생명주기 콜백

초기화 방법 중 가장 중요한 @PostConstruct, @PreDestroy 애노테이션 방법과 설정 정보 방법만 요약하겠습니다.

 

@PostConstruct, @PreDestroy 애노테이션 방법

@PostConstruct, @PreDestroy는 빈으로 등록된 객체의 콜백을 사용할 메서드에 @PostConstruct, @PreDestroy만 붙여주면 끝입니다.

[빈으로 등록된 Class, NetwrokClient]

[Bean으로 등록하는 설정정보와 테스트 코드]

위 이미지와 같이 Bean으로 등록하면 애플리케이션 시작시 컨테이너 생성-> 빈 생성 -> 의존관계 주입 ->초기화 콜백이 실행되고 애플리케이션이 종료되는 시점에 소멸 전 콜백이 발생하는것을 알 수 있었습니다.

 

설정 정보를 통한 방법

initMethod에 초기화 콜백 메서드명을 넣고, destoryMethod에 소멸 전 콜백 메서드명을 넣으면 됩니다. 그럼 두 가지의 차이점은 뭘까요?

 

설정 정보 사용 방법의 특징

  • 메서드 이름을 자유롭게 줄 수 있다.
  • 스프링 빈이 스프링 코드에 의존하지 않는다.
  • 코드가 아니라 설정 정보를 사용하기 떄문에 코드를 못고치는 외부 라이브러리도 메서드를 적용할 수 있다.

 

@PostConstruct, @PreDestroy 애노테이션 방법의 특징

  • 최신 스프링에서 가장 권장하는 방법이다.
  • 애노테이션 하나만 붙이면 되므로 매우 편리하다.
  • 스프링에 종속적인 기술이 아닌 자바 표준이라 다른 컨테이너에도 잘 동작한다.
  • 컴포넌트 스캔과 잘 어울린다.
  • 단점으로는 외부 라이브러리에는 적용하지 못한다. 외부 라이브러리 사용시 설정 정보를 통한 방법을 사용하자.
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유