Server/Spring (Boot & Framework)

[Spring] Bean Scope와 Bean Life Cycle

ooeunz 2020. 5. 26. 20:39
반응형

 

스프링에서는 Bean으로 지정된 객체는 기본적으로 싱글톤 객체로 관리하게 됩니다. 하지만 요구사항에 따라 싱글톤이 아닌 방법으로 빈을 구성해야 하는 경우가 있는데, 이와 같은 경우를 명시적으로 구분하기 위해 스프링에서는 scope라는 키워드를 사용합니다.

 

빈 스코프

Spring에서 별도의 설정을 하지 않을 경우 default bean scope는 singleton으로 구성됩니다.

 

  • singleton : 스프링 default bean scope
  • prototype : 애플리케이션 요청시 ( getBean() 메서드가 호출될 때마다) 스프링이 새 인스턴스를 생성합니다.
  • request : HTTP 요청별로 인스턴스화 되며 요청이 끝나면 소멸됩니다.
  • session : HTTP 세션별로 인스턴스화 되며 세션이 끝나면 소멸됩니다.
  • global session : 포틀릿 기반의 웹 애플리케이션 용도로 전역 세션 스코프가 빈과 같은 스프링 MVC를 사용한 포탈 애플리케이션 내의 모든 포틀릿 사이에 공유를 할 수 있습니다.
  • thread : 새 스레드에서 요청하면 새로운 bean 인스턴스를 생성합니다. 같은 스레드의 요청에는 항상 같은 인스턴스가 반환됩니다.
  • custom : org.pringframework.beans.factory.config.Scope를 구현하고 커스텀 스코프를 스프링의 설정에 등록하여 사용합니다.

 

※ request, session, global session의 스코프는 일반 spring 애플리케이션이 아닌 Spring MVC Application에서만 사용되는 용도입니다.

 

빈 스코프를 지정하는 방법은 XML을 이용한 방법과 애노테이션을 이용한 방법이 있습니다.

 

XML

<bean id="memberBean" class="com.java.Member" scope="singleton"/>

 

Annotation

package com.java.pojo;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
 
@Service("memberBean")
@Scope("singletone")
public class Member {
}

 


Bean Life Cycle

빈 라이프 사이클은 기본적으로 생성, 의존 설정, 초기화, 소멸의 단계를 거칩니다. 하지만 어떤 컨테이너를 사용하느냐에 따라 차이가 있습니다.

Bean Factory는 기본적인 의존성 주입을 지원하는 가장 간단한 형태의 컨테이너이고, getBean() 메서드가 호출될 때까지 빈의 생성을 미룹니다. Application Context는 BeanFactory를 상속한 형태로 BeanFactory의 모든 기능을 가지며 추가적인 기능을 가지는 컨테이너 입니다. Application context는 context가 시작하기 전에 모든 빈을 생성하고 로딩해서, 원하는 시기에 언제든지 가져다가 쓸 수 있습니다.

 

 

Initialize & Destory 메서드

Bean Initialize 메서드는 Bean Object가 생성되고 DI를 마친 후 실행되는 메서드입니다. 일반적으로 Object의 초기화 작업이 필요한 경우 생성자에게 처리하지만 DI를 통해 Bean이 주입된 후에 초기화 후에 초기화 작업이 있다면 초기화 메서드를 이용해서 초기화를 진행합니다.

 

@PostConstruct

초기화하고 싶은 메서드에 @PostConstruct 애노테이션을 붙여주면 Spring이 해당 메서드를 초기화시에 호출하게 됩니다.

@Slf4j
@Component
public class SimpleBean {

    @PostConstruct
    public void postConstruct() {
        log.info("postConstruct");
    }
}

 

@PreDestroy

@PreDestroy는 컨테이너가 종료될 때 실행하고 싶은 메서드에 애노테이션을 붙여주면 Spring이 컨테이너 종료 시 해당 메서드를 호출합니다.

@Slf4j
@Component
public class SimpleBean {

    @PreDestroy
    public void preDestroy() {
        log.info("preDestroy");
    }
}
반응형