빈 생명주기 콜백

  • 객체의 초기화와 종료 작업을 진행하는 메소드
  • 스프링 빈은 ‘객체 생성 -> 의존관계 주입’ 라이프사이클을 가진다.
  • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다.
  • 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.

스프링 빈의 이벤트 라이프사이클

  • 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
  • 초기화 콜백 - 빈이 생성되고, 빈의 의존 관계 주입이 완료된 후 호출
  • 소멸전 콜백 - 빈이 소멸되기 직전에 호출

@PostConstruct

@PostConstruct
   public void init() {
   System.out.println("NetworkClient.init");
   connect();
   call("초기화 연결 메시지");
}
  • 초기화 메서드를 @PostConstruct를 사용하여 지정한다.
  • 초기화 콜백 시점에 실행된다.

@PreDestroy

@PreDestroy
   public void close() {
   System.out.println("NetworkClient.close");
   disConnect();
}
  • 소멸 메서드를 @PreDestroy를 사용하여 지정한다.
  • 소멸전 콜백 시점에 실행된다.

빈 스코프

  • 스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때까지 유지되는데 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다.
  • 빈 스코프란 빈이 존재할 수 있는 범위를 뜻한다.
  • 스프링은 다음과 같은 다양한 스코프를 지원한다.
    • 싱글톤 - 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
    • 프로토 타입 - 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
    • 웹 관련 스코프
      • request - 웹 요청이 들어오고 나갈때까지 유지되는 스코프
      • session - 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
      • application - 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

빈 스코프 지정 방법

컴포넌트 스캔 자동 등록

@Scope("prototype")
@Component
public class Bean {}

수동 등록

@Scope("prototype")
@Bean
PrototypeBean Bean() {
   return new Bean();
}

프로토타입 스코프

  • 항상 같은 인스턴스의 스프링 빈을 반환하는 싱글톤 스코프와 다르게 프로토타입 스코프는 스프링 컨테이너를 통해 항상 다른 인스턴스가 반환된다.
  • 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다.
  • 클라이언트에 빈을 반환한 이후로 해당 빈은 스프링 컨테이너에서 관리되지 않는다. 따라서, 관리할 책임은 반환받은 클라이언트에게 있다.
  • 종료 메서드가 호출되지 않기 때문에 관리할 책임이 있는 클라이언트가 종료 메서드를 직접 호출해야한다.

프로토타입 빈 요청 image

  • 프로토타입 빈을 스프링 컨테이너에 요청하면 스프링 컨테이너는 이 시점에 프로토타입 빈을 생성하고, 의존관계를 주입한다.

image

  • 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환한다.
  • 클라이언트가 같은 프로토타입 빈을 요청하더라도 항상 새로운 프로토타입 빈을 반환한다.

웹 스코프

  • 웹 스코프는 웹 환경에서만 동작한다.
  • 웹 스코프는 스프링이 빈을 종료시점까지 관리한다. 따라서, 종료 메서드가 호출된다.
  • 웹 스코프 종류
    • request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈인스턴스가 생성되고, 관리된다.
    • session: HTTP Session과 동일한 생명주기를 가지는 스코프
    • application: 서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프
    • websocket: 웹 소켓과 동일한 생명주기를 가지는 스코프