빈 라이프사이클과 범위

이영섭·2024년 11월 20일

컨테이너 초기화와 종료

// 1. 컨테이너 초기화
AnnotationConfigApplicationContext ctx = 
	new AnnotationConfigApplicationContext(AppContext.class);
	
// 2. 컨테이너에서 빈 객체를 구해서 사용
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);

// 3. 컨테이너 종료
ctx.close();
  • 컨테이너 초기화 → 빈 객체의 생성, 의존 주입, 초기화
  • 컨테이너 종료 → 빈 객체의 소멸

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

빈 객체의 라이프 사이클 :

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

[ 기본 방법 ]

스프링 컨테이너를 초기화 할 때,

  1. 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존을 설정

  2. 모든 의존 설정이 완료되면, 빈 객체의 초기화를 수행(빈 객체의 지정된 메서드 호출)

    InitializingBean 인터페이스의 afterPropertiesSet() 호출

  3. 컨테이너 종료 시, 빈 객체의 소멸을 처리(지정한 메서드 호출)

    DisposableBean 인터페이스의 destroy() 호출

// InitializingBean, DisposableBean 상속받음
public class Client implements InitializingBean, DisposableBean {

    private String host;

    public void setHost(String host) {
        this.host = host;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Client.destroy() 실행");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Client.afterPropertiesSet() 실행");
    }

    public void send() {
        System.out.println("Client.send() to " + host);
    }
}

[ 커스텀 메서드 ]

@Bean 어노테이션의 initMethod, destroyMethod 속성을 사용한다.

@Bean(initMethod = "connect", destroyMethod = "close")
public Client2 client2() {
    Client2 client = new Client2();
    client.setHost("host");
    return client;
}

☠️ 초기화 메서드를 직접 실행할 때 초기화 메서드가 두 번 불리지 않도록 주의 ☠️

  • 인터페이스를 상속받아 직접 만들거나, initMethod를 지정하거나 둘 중 하나만

프로토타입의 빈

@Scope(”prototype”)

프로토타입 범위를 갖는 빈은

스프링 컨테이너가 프로토타입의 빈 객체를 생성하고 프로퍼티를 설정하고 초기화 작업까지는 수행하지만, 컨테이너가 종료된다 하더라도, 소멸 메서드를 실행하지 않는다.

따라서 소멸처리를 직접 코드에서 해야한다.

  1. Singleton (기본값)
    • 스프링 컨테이너 시작 시 바로 생성됨
    • 컨테이너당 하나의 인스턴스만 생성
    • 매번 같은 인스턴스가 반환됨
  2. Prototype
    • getBean() 호출 시점에 생성됨
    • 매번 새로운 인스턴스가 생성됨
    • 스프링 컨테이너 시작 시에는 생성되지 않음

[ 빈 스코프 ]

  • 싱글톤 : default, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프
  • 프로토타입 : 스프링 컨테이너는 빈의 생성과 의존성 주입까지만 관여하고, 더 이상 관리하지 않는 짧은 범위의 스코프
  • 웹 관련 스코프 : request, session, application 등 여러 스코프가 존재한다.
    • 예를 들어, request는 웹 요청이 들어오고 나갈 때까지만 유지되는 스코프이다.

참고

책 - 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문
Claude.ai

profile
성장과 발전에는 열려있고, 안주와 정체에는 닫혀있는 개발자 이영섭입니다.

0개의 댓글