몬그로이

Bean의 생명주기와 그것을 알게 되었을 때의 이점 본문

Organizing Docs/Spring Docs

Bean의 생명주기와 그것을 알게 되었을 때의 이점

Mon Groy 2024. 5. 23. 20:00

Step 1. 사용되기 위한 준비단계 
스프링 컨테이너 생성     객체(빈) 생성 → 의존관계 주입(예외: 생성자)

   스프링이 초기화 콜백(알림) → 빈 초기화(필요값이 다 들어 있는 상태로 일을 시작할 수 있는 상태)

 

Step  2. 사용에서 소멸까지의 단계 

초기화 상태 → 빈 사용 → 스프링이 소멸 콜백(알림)     빈 소멸  

 

**선 준비 (Step1) 후 사용 (Step2)

더보기

자바에서 사용 준비를 마치고 (데이터 세팅을 마치고)

동작하는 등의 행위는 별도의 초기화 메서드로 분리해놓는 것이 좋음 

동작할 때는 외부 커넥션 등을 거치므로 초기화 된 상태에서 시작하는 것이 좋음

물론 단순한 코드의 경우는 예외 

**콜백하는 방법 (하단 기술)

인터페이스(InitializingBean, DisposableBean)

설정 정보에 초기화 메서드, 종료 메서드 지원

@PostConstruct, @PreDestroy annotation 지원

 

이를 통해서 개발자는 어떤 메서드를 어디에 사용할지를 고려한 로직을 짤 수 있게 된다

데이터베이스 연결 설정이나 캐시 초기화 등은 초기화 메서드에 맞춰서 수행하도록 하면 되고

소멸한 후에 맞춰서 빈이 사용하고 남겨진 리소스를 해제하거나 정리할 수 있다

이런식으로 작업을 분리하여 작성하므로 모듈화를 통한 재사용성을 높일 수 있다

 

 


 

콜백하는 방법 1.

 

인터페이스(InitializingBean, DisposableBean) 사용 - 요즘 잘 안씀

 

아래의 메서드를 적을 클래스에 implements InitializingBean, DisposableBean 를 붙여준 후 메서드 작성

 

implements InitializingBean 의 초기화 메서드 : afterPropertiesSet()

@Override
public void afterPropertiesSet() throws Exception {
    connect();
    call("초기화 연결 메세지");
}

 

 

implements DisposableBean 의 종료 메서드: destroy()

@Override
public void destroy() throws Exception {
    disconnect();
}

 

**스프링 전용 인터페이스

스프링 빈이 스프링 코드에 의존(implements)

초기화, 소멸 메서드의 이름을 변경할 수 없음

코드를 수정할 수 없는 외부 라이브러리에 적용 불가

 

콜백하는 방법 2.

 

초기화와 소멸시 발동하는 메서드를 미리 만들어 뒀다가

Bean으로 등록한 객체 위에 아래와 같이 설정하면 초기화와 소멸시 해당 메서드들이 발동한다

@Bean(initMethod = "init", destroyMethod = "close")

 

메서드 이름 자유롭게 설정 가능

스프링 빈이 스프링 코드에 의존하지 않음

코드를 고칠 수 없는 외부 라이브러리에도 적용 가능 (∵설정 정보 사용)

**destroyMethod = "(inferred)" 가 기본 설정값인데 이는 외부 라이브러리에 적용 시 유용함

close, shutdown 의 이름을 가진 메서드들을 자동으로 호출해주기 때문

추론 기능을 사용하고 싶지 않을 때는 "" 로 공백을 주면 됨

 

콜백하는 방법 3.

 

시작 메서드와 종료 메서드에 @PostConstruct 와 @PreDestroy 를 달아준다

 

초기화 메서드

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

 

종료 메서드

@PreDestroy
public void close() {
    System.out.println("NetworkClient.destroy");
    disconnect();
}

 

**최신 스프링에서 가장 권장하는 방법

javax.annotation.PostConstruct 패키지 소속

스프링이 아닌 다른 컨테이너에서도 잘 동작함

컴포넌트 스캔과 잘 어울림

외부 라이브러리에 적용 불가!

 

'Organizing Docs > Spring Docs' 카테고리의 다른 글

QueryDSL  (0) 2024.06.30
Entity-Table 에 사용하기 좋은 어노테이션 기능  (0) 2024.06.30
MVC 의 annotation 들  (0) 2024.05.25
HTTP 메서드  (0) 2024.05.20
Spring - SOLID  (0) 2024.05.19