[Spring] 빈 생명주기 콜백

2022. 6. 2. 16:22·Back-End/Spring

빈 생명주기 콜백

💡 애플리케이션 시작 시, 필요한 연결을 미리 해두는 작업이 필요하다. 애플리케이션 종료 시, 객체의 초기화 및 종료작업이 필요하다. 콜백의 종류에는 2가지가 있다.

 

1. 초기화 콜백

  • 빈(Bean)의 생성과 의존관계 주입이 완료되고 완료 되었다고 호출 되는 작업
  • 초기화 작업은 반드시 빈 생성 및 의존 관계 주입이 모두 완료된 후에 시작 되어야 한다.
    → 의존 관계 주입이 된 빈들을 미리 세팅 해야 하기 때문!
  • 개발자가 이 시점을 알기 위해 필요한 것이 초기화 콜백 메서드 이다.

 

2. 소멸 콜백

  • 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하기 위한 과정
  • 개발자가 이 시점을 알기 위해 필요한 것이 종료 콜백 메서드

 

💡 객체의 생성과 초기화를 분리해야 하는 이유?

  • 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누어 유지보수 하기 쉽게 하기 위함!

생명주기 콜백의 변화

초기화 작업 및 종료 작업을 하기 위한 방법은 3가지가 있다.

  1. 인터페이스 상속
  2. 빈(Bean) 등록 초기화, 소멸 메서드
  3. 어노테이션 @PostConstruct / @PreDestroy

1. 인터페이스 상속(InitializingBean, DisposableBean)

package hello.core.lifecycle;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class NetworkClient implements InitializingBean, DisposableBean { 
    //InitializingBean, DisposableBean 인터페이스들을 상속받음
    private String url;

    public NetworkClient() {
        System.out.println("생성자 호출, 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);
    }
    @Override //InitializingBean에서 상속 받은 메서드, 빈 사용 준비가 완료 된 후 실행 됨
    public void afterPropertiesSet() throws Exception {
        connect();
        call("초기화 연결 메시지");
    }
    @Override //DisposableBean에서 상속 받은 메서드, 빈 종료 전에 실행 됨
    public void destroy() throws Exception {
        disConnect();
    }
}
  • InitializingBean 은 afterPropertiesSet() 메서드로 초기화를 지원한다. → 빈 사용 준비가 완료 된후 실행되는 메서드
  • DisposableBean 은 destroy() 메서드로 소멸을 지원한다. → 빈 소멸 준비가 완료된 후에 실행되는 메서드

단점

  • 스프링 전용 인터페이스에 의존
  • 초기화, 소멸 메서드의 이름을 변경할 수 없음
  • 개발자가 코드를 건드릴 수 없는 외부 라이브러리에 적용이 불가능

2. 빈(Bean) 등록 초기화, 소멸 메서드

  • 빈 설정 정보에 @Bean(initMethod = “init", destroyMethod = “close”) 처럼 초기화, 소멸 메서드를 지정 한다.
  • 초기화 메서드 : init , 소멸 메서드 : close 로 지정
@Configuration
static class LifeCycleConfig {
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}
  • 메서드 구현
package hello.core.lifecycle;

public class NetworkClient {
    private String url;
    public NetworkClient() {
        System.out.println("생성자 호출, 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() {  //init메서드 
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메시지");
    }
    public void close() {  //close메서드
        System.out.println("NetworkClient.close");
        disConnect();
 }

설정 정보 사용 특징

  • 메서드 이름을 자유롭게 설정 가능
  • 스프링 빈이 스프링 코드에 의존X
  • 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용 가능

종료메서드의 특별한 기능

  • destroyMethod 는 기본값이 inferred (추론) 으로 등록되어 있다.
  • destroyMethod는 명시하지 않을때, close / shutdown 이름의 종료메서드를 기본적으로 추론하여 사용
    → 대부분 라이브러리에서 close 또는 shutdown 이름으로 사용
  • 추론기능을 사용하지 않을 경우 detroyMethod=”” 으로 빈 공백을 지정

3. @PostConstruct, @PreDestroy 애노테이션의 사용

@PostConstruct
    public void init() throws Exception {
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메세지");
    }

 @PreDestroy
    public void close() throws Exception {
        System.out.println("NetworkClient.close");
        disconnect();
    }
  • @PostConstruct : 초기화 작업을 하는 메서드 위에 선언
  • @PreDestroy : 종료작업을 하는 메서드 위에 선언

  • 최신 스프링에서 가장 권장하는 방법
  • 외부 라이브러리에는 적용 불가 → @Bean의 기능을 사용해야 한다.

 

정리

  • @PostConstruct, @PreDestroy 애노테이션을 사용 할 것.
  • 외부 라이브러리를 초기화, 종료 해야할 시 @Bean의 initMethod / destroyMethod 를 이용
반응형
'Back-End/Spring' 카테고리의 다른 글
  • Jackson 라이브러리 - ObjectMapper, Object를 json으로 파싱하기
  • 빈 스코프(Bean Scope)와 프로토타입 스코프(Prototype Scope), 싱글톤에서의 프로토타입 스코프의 처리
  • [Spring] 의존관계 주입 방법
  • [Spring]컴포넌트 스캔, 컴포넌트 스캔 필터 by 인프런 김영한님
LightSource
LightSource
어제보단 발전한 오늘의 나를 위한 블로그
    반응형
  • LightSource
    LightSourceCoder
    LightSource
  • 전체
    오늘
    어제
    • 분류 전체보기 (152)
      • Git (4)
      • Language (6)
        • Java (6)
      • Back-End (63)
        • Spring Boot (4)
        • MyBatis (1)
        • Oracle (1)
        • PL SQL (3)
        • JPA (26)
        • Spring Data JPA (5)
        • Spring MVC (8)
        • Spring (12)
        • Spring Security (2)
        • Redis (1)
      • Front-End (38)
        • 아이오닉 (2)
        • JSP (7)
        • JavaScript (4)
        • React (16)
        • TypeScript (3)
        • Angular (6)
      • AWS (1)
      • CI & CD (1)
      • 개발지식 (13)
        • 네트워크 (9)
        • CS 지식 (4)
      • 데이터모델링 (2)
      • Tool (1)
      • 프로젝트 (5)
      • 독후감 (2)
      • 잡생각 (0)
      • 면접 준비 (1)
      • 알고리즘 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리액트
    배요소열추가
    배열요소삭제
    react
    배열요소수정
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
LightSource
[Spring] 빈 생명주기 콜백
상단으로

티스토리툴바