Spring been lifecycle

개요

  • Spring Bean 라이프 사이클에 대해 알아본다.

개념

IoC (Injection of Control)

  • Spring에서는 Spring Container, IoC Container라는 개념을 사용한다.
    • Container는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
    • Spring Container는 Spring Framework의 핵심부에 위치하며, 객체 주입을 이용하여 Application을 구성하는 Component들을 관리한다.
  • 이때 Spring Container에서 생성되는 객체를 Bean이라고 한다.
    • 어플리케이션 전반에서 Spring IoC 컨테이너를 받아서 사용한다면 그 인스턴스들은 항상 같은 객체일 것이며, 메모리 면에서도 효율적이고 런타임시에 성능 최적화에도 좋다.

빈(Bean)

  • Spring IoC 컨테이너가 관리하는 Java 객체를 빈(Bean) 이라는 용어로 부른다.
    • Spring Bean Container에 존재하는 객체

빈(Bean) 의 생성방식

  • Component Scanning
    • Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할때 사용하는 Interface들을 Life Cycle Callback이라고 부른다.
    • 이때, @ComonentScan Annotation이 붙어있는 Class가 이에 해당한다.
    • @ComponentScan은 어느 지점부터 Component를 찾으라고 알려주는 역할을 하고,
    • @Component는 실제로 찾아서 Bean으로 등록할 Class를 의미한다.

  • 일반적으로 컴포넌트 클래스들에 @Component를 붙일 수 있지만, @Repository, @Service, @Controller를 붙인다면
    도구들이 클래스들을 처리하는데 더 적합하도록 할 수 있고 관점(aspects)에 더 연관성을 부여할 수 있다

  • 빈(Bean) 설정 파일에 직접 빈을 등록

    • 빈 설정 파일은 XML 과 자바 설정파일로 작성할 수 있는데, 추세는 자바 설정파일이 많이 사용되고 있다고 함

빈 라이플 사이클과 빈 범위 (Scope)

  • 스프링 컨테이너는 빈 객체를 생성하고, 프로퍼티를 할당하고 초기화를 수행, 사용이 끝나면 소멸시키는 일련의 과정을 관리한다.
    • 객체 생성 - 초기화 - 사용 - 소멸 순으로 유지
    • 스프링에서는 init 이벤트와 destroy 이벤트가 주로 사용됨
      • 해당 시점에 이벤트를 캐치하는 방법은 세가지가 존재함
        • Interface 구현
        • 커스텀 init 메소드 (Bean 정의)
        • Annotation 지정

인터페이스 구현

public class ViewrainService implements InitializingBean, DisposableBean{
 
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("bean 생성 및 초기화 : afterPropertiesSet() 호출됨");
    }
 
    @Override
    public void destroy() throws Exception {
        System.out.println("bean 생성 소멸 : destroy 호출됨");
    }
 
    // 중략...
}

Bean 정의시 메소드 지정

<bean id="BBean" class="com.example.viewraintoy.service.ViewrainService"
                      init-method="init" destroy-method="destroy"/>

어노테이션 지정

@PostConstruct
public void init() {
    System.out.println("======================================");
    System.out.println("bean 생성 및 초기화 : init() 호출됨");
    System.out.println("======================================");
}

@PreDestroy
public void destroy() {
    System.out.println("======================================");
    System.out.println("bean 생성 소멸 : destroy 호출됨");
    System.out.println("======================================");
}

Bean Scope

  • 스프링에서 Bean으로 지정된 객체는 기본적으로 singleton(싱글톤) 객체로 관리된다.
  • scope(범위) 키워드
스코프 종류설명
singleton기본 싱클톤 스코프
prototype어플리케이션에서 요청시(getBean()) 마다 스프링이 새 인스턴스를 생성
requsetHTTP 요청별로 인스턴스화 되면 요청이 끝나면 소멸(spring mvc webapplication 용도)
sessionHTTP 세션별로 인스턴스화 되면 세션잉 끝나며 소멸(spring mvc webapplication 용도)
global session포틀릿 기반의 웹 어플리케이션용도, 전역 세션 스코프의 빈은 같은 스프링 MVC를 사용한 포탈어플리케이션 내의 모든 포틀릿 사이에서 공유 할 수 있다.
thread새 스레드에서 요청하면 새로운 bean 인스턴스를 생성, 같은 스레드에 대해서는 항상같은 bean 인스턴스가 반환
customorg.pringframework.beans.factory.config.Scope를 구현하고 커스텀 스코프를 스프링의 설정에 등록하여 사용

Scope의 종류

  • 싱글톤
    • Spring 프레임워크에서 기본이 되는 스코프
    • 스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨
  • 프로토타입
    • 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
    • 요청이 오면 항상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
    • 프로토타입을 받은 클라이언트가 객체를 관리해야 함
    • request : 각 요청이 들어오고 나갈때까지 유지되는 스코프
    • session : 세션이 생성되고 종료될 때까지 유지되는 스코프
    • application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

참고

  • 싱글톤으로 적합한 객체
    • 상태가 없는 공유 객체
    • 읽기용으로만 상태를 가진 공유 객체
  • 비 싱글톤으로 적합한 객체
    • 쓰기가 가능한 상태를 지닌 객체
    • 상태가 노출되지 않은 객체

좋은 웹페이지 즐겨찾기