6장. 빈 라이프사이클과 범위

2021. 10. 6. 13:17Spring

728x90

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

스프링 컨테이너는 아래와 같은 라이프 사이클을 가짐.

초기화 → 사용 → 종료

// 1. 컨테이너 초기화 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(설정파일.class); // 2. 컨테이너에서 getBean() 메소드를 통해 빈 객체를구해서 사용 대상클래스 obj = ctx.getBean("객체명", 대상클래스명.class); // 3. 컨테이너 종료 ctx.close();

컨테이너 초기화, 종료시 다음의 작업도 함께 수행됨.

  • 컨테이너 초기화 → 빈 객체의 생성, 의존주입, 초기화
  • 컨테이너 종료 → 빈 객체의 소멸

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

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

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

  • 객체 생성 : 빈 객체를 생성한다.
  • 의존 설정 : 의존 자동주입을 통한 의존 설정이 이 시점에 수행된다.
  • 초기화 : 빈 객체를 초기화 하기위해 스프링은 빈 객체가 지정된 메서드를 호출한다.
  • ⇒ org.springframework.beans.factory.InitializingBean 인터페이스의 afterPropertiesSet() 호출
  • 소멸 : 스프링 컨테이너를 종료하면 빈 객체의 소멸을 처리한다. 이때도 지정한 메서드를 호출한다.
  • ⇒ org.springframework.beans.factory.DisposableBean 인터페이스의 destory() 호출

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

빈 객체를 구성할때 초기화와 소멸 과정에서 작업이 필요하다면 해당하는 인터페이스를 구현한 후 메서드를 재정의 하면 동적 바인딩에 의해 컨테이너가 자동 호출해 준다.

public class Client implements InitializingBean, DisposableBean{ @Override public void afterPropertiesSet() throws Exception{ // ~~ 필요한 초기화 작업 구현 } @Override public void distory() throws Exception{ // ~~ 필요한 소멸 작업 구현 } }

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

직접 구현한 클래스는 InitializingBean , DisposableBean 을 상속받아 작업을 수행하면 되지만, 외부에서 제공받은 클래스를 스프링 객체로 설정하고 싶을때도 있다.

⇒ 스프링 설정파일에서 @Bean 태그의 initMethod 속성과 destroyMethod 속성을 사용해서 초기화 메서드와 소멸 메서드의 이름을 지정.

↓Bean 클래스

public class Client2 // 초기화와 소멸작업에 지정할 클래스는 파라미터를 가지면 안됨. // => 파라미터가 있다면 Exception 발생 public void connect(){ // ~~ 필요한 초기화 작업 구현 } public void close(){ // ~~ 필요한 소멸 작업 구현 } }

↓설정파일

@Bean(initMethod = "connect", destroyMethod = "close") public Client2 client2(){ // ~~ 빈 설정 구성 }

스프링 인터페이스 상속구현한 메서드와, 커스텀 메서드는 수행 시점이 다름.

⇒ 두개 방법 다 구현하면 문제 발생 가능.


3. 빈 객체의 생성과 관리범위

2장에서 우리는 빈 객체는 기본적으로 싱글톤 범위(scope)를 가진다고 배웠다.

  • 자바 싱글톤 : 클래스 식별자에 대해서 클래스당 하나의 객체만 생성하도록 보장
  • 스프링 싱글톤 : 컨테이너에서 빈 id별로 하나의 빈 객체만 생성하도록 보장

싱글톤이 아닌 프로토타입의 scope를 가지도록 빈을 설정할 수도 있다.

⇒ 프로토타입 : 빈 객체를 구할때마다 매번 새로운 객체를 생성.

특정 빈을 프로토타입 범위로 지정하려면 @Scope 어노테이션의 값으로 "prototype"을 @Bean 어노테이션과 함께 사용하면 됨.

↓설정파일

@Bean @Scope("prototype") public Client client(){ // ~~ 빈 설정 구성 }

싱글톤 범위를 명시적으로 지정하고 싶다면 @Scope 어노테이션 값으로 "singleton"을 주면 됨.

※ 프로토 타입 범위를 갖는 빈은 완전한 라이프사이클을 따르지 않는것에 주의해야함.

⇒ 프로토 타입의 빈 객체를 설정하고 초기화 작업까지는 수행하지만, 컨테이너를 종료한다고 해서 생성한 프로토타입 빈 객체의 소멸 메서드를 실행하지는 않음.

⇒ 즉 프로토타입 Scope의 빈 객체를 사용할 때에는 빈 객체의 소멸 처리를 개발자가 코드로 직접 해줘야함.

 

출처 : 최범균,『스프링5 프로그래밍 입문』, 가메출판사

728x90