챕터 6: 빈 라이프사이클과 범위

binary_j·2023년 10월 2일
0

컨테이너 초기화와 종료


스프링 컨테이너의 라이프사이클

컨테이너 초기화 -> 객체 사용 -> 컨테이너 종료

https://velog.io/@binary_j/%EB%B9%88-%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4

스프링 빈 객체의 라이프사이클


스프링 컨테이너는 빈 객체의 라이프 사이클을 관리한다.

빈 객체의 라이프 사이클은 다음과 같다.

객체 생성 -> 의존 설정 -> 초기화 -> 소멸

빈 객체의 초기화와 소멸: 스프링 인터페이스

  • InitializingBean: 빈 객체를 생성한 뒤 초기화 과정이 필요하면 해당 인터페이스를 상속하고 afterPropertiesSet() 메서드를 구현하면 됨
  • DisposableBean: 빈 객체의 소멸 과정이 필요하면 해당 인터페스를 상속하고 destory() 메서드를 구현하면 됨

스프링 컨테이너는 빈 객체 생성을 마무리한 뒤 초기화 메서드를 실행한다. 스프링 컨테이너가 종료되면 소멸 메서드가 실행된다.

빈 객체의 초기화와 소멸: 커스텀 메서드

앞서 설명한 InitializingBean 인터페이스와 DisposableBean 인터페이스를 사용하지 않고 스프링 설정에서 직접 메서드를 지정할 수 있다. @Bean 애노테이션의 속성값으로 설정 가능하다.

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

initMethod에 초기화 할 때 사용할 메서드 이름을, destroyMethod에 소멸할 때 사용할 메서드 이름을 설정해주면 된다.

초기화 메서드의 경우 그냥 빈 설정 코드에서 직접 실행시켜도 된다. 다만 초기화 메서드가 여러번 사용되지 않도록 주의하자.

빈 객체의 생성과 관리 범위


별도로 설정을 하지 않는 경우 스프링 빈은 항상 싱글톤 범위를 갖는다. 동일한 이름을 가진 빈 객체는 동일한 빈 객체를 참고한다. 이 외에 프로토타입 범위의 빈을 설정하는 것도 가능하다.

@Bean
@Scop("prototype")

이렇게 @Scope 애노테이션의 설정값으로 "prototype" 값을 주면 프로토타입 범위로 빈 설정이 가능하다. 프로토타입으로 빈의 범위를 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성한다. 프로토타입 범위의 빈은 컨테이너를 종료한다고 소멸 메서드를 실행하지 않기 때문에 빈 객체의 소멸 처리를 코드에서 직접 해야 한다.

** 참고
프로토타입 빈의 경우 더 이상 사용되지 않을 경우 알아서 garbage-collected 된다고 한다. 그러나 메모리 누수 등의 문제가 발생할 수 있으므로 사용이 완료된 프로토타입 빈을 소멸시킬 필요가 있다.

(출처: https://stackoverflow.com/questions/50681027/do-spring-prototype-beans-need-to-be-destroyed-manually)

** 참고 2
스프링 공식 문서에 따르면 Scope 애노테이션으로 설정 가능한 빈 범위는 다음과 같다.

  • singleton : Scopes a single bean definition to a single object instance per Spring IoC container.
  • prototype : Scopes a single bean definition to any number of object instances.
  • request : Scopes a single bean definition to the lifecycle of a single HTTP request.
  • session : Scopes a single bean definition to the lifecycle of a HTTP Session.
  • global session : Scopes a single bean definition to the lifecycle of a global HTTP Session.

0개의 댓글