Back-end Skill/Springboot

스프링 세션8_ 빈 생명주기 콜백

Sophie소피 2022. 2. 6. 13:42

빈 스코프란?

지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서

스프링 컨테이너가 종료될 때 까지 유지된다고 학습했다.

이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다.

스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.

스프링은 다음과 같은 다양한 스코프를 지원한다.

싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.

프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고

더는 관리하지 않는 매우 짧은 범위의 스코프이다.

웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다.

 

session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프

application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

 

//컴포넌트 스캔 자동 등록
@Scope("prototype")
@Component
public class HelloBean {}
//수정 등록 
@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
 return new HelloBean();
}

 

프로토타입 스코프  

싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.

반면에 프로토타입 스코프를 스프링 컨테이너에 조회하면

스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다

 

애노테이션 @PostConstruct, @PreDestroy

 

package hello.core.lifecycle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
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);
 }
 @PostConstruct
 public void init() {
 System.out.println("NetworkClient.init");
 connect();
 call("초기화 연결 메시지");
 }
 @PreDestroy
 public void close() {
 System.out.println("NetworkClient.close");
 disConnect();
 }
}
@Configuration
static class LifeCycleConfig {
 @Bean
 public NetworkClient networkClient() {
 NetworkClient networkClient = new NetworkClient();
 networkClient.setUrl("http://hello-spring.dev");
 return networkClient;
 }
}

//실행결과 
생성자 호출, url = null
NetworkClient.init
connect: http://hello-spring.dev
call: http://hello-spring.dev message = 초기화 연결 메시지
19:40:50.269 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.close
close + http://hello-spring.dev
//@PostConstruct , @PreDestroy 
이 두 애노테이션을 사용하면 가장 편리하게 
초기화와 종료를 실행할 수 있다.

@PostConstruct, @PreDestroy 애노테이션 특징

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

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

패키지를 잘 보면 javax.annotation.PostConstruct 이다.

스프링에 종속적인 기술이 아니라 JSR-250 라는 자바 표준이다.

따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.

컴포넌트 스캔과 잘 어울린다. 유일한 단점은 외부 라이브러리에는 적용하지 못한다는 것이다.

외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자.

정리 @PostConstruct, @PreDestroy 애노테이션을

사용하자 코드를 고칠 수 없는 외부 라이브러리를 초기화,

종료해야 하면 @Bean 의 initMethod , destroyMethod 를 사용하자