본문 바로가기

웹/Spring

[메모] Spring 원리 (3) 빈 생명주기 콜백, 빈 스코프

 - 빈 생명주기 콜백 - 

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

 - 초기화, 소멸 인터페이스 - 

  • InitializingBean - afterPropertiesSet()
  • DisposableBean  - destory()
  • 인터페이스 방식의 단점
    • 스프링 전용 인터페이스라 스프링에만 의존하여 사용가능
    • 초기화, 소멸 메서드의 이름 변경 불가능
    • 코드를 고칠 수 없는 외부 라이브러리에서는 사용 불가능

 - 빈 초기화, 소멸 - 

  • 메서드 이름을 자유롭게 부여가능
  • 스프링 빈이 스프링 코드에 의존하지 않음
  • 코드가 아닌 설정 정보를 이용하기 때문에, 외부 라이브러리에도 적용 가능

 - Annotation 초기화, 소멸 - 

  • @PostConstruct, @PreDestory
    • 가장 권장되는 방식
    • 유일한 단점은 외부 라이브러리에는 적용이 불가능

 - 빈 스코프 - 

  • 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때 까지 유지됨
    -> 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문
  • 스코프: 빈이 존재할 수 있는 범위

 - 스프링이 지원하는 스코프 - 

  • 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
  • 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프

  • 웹 관련 스코프
    • request: 웹 요청이 들어오고 나갈 때 까지 유지되는 스코프
    • session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
    • application: 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프
  • 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리

 - 프로토타입 빈의 특징 - 

  • 스프링 컨테이너에 요청할 때 마다 새로 생성
  • 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지만 관여
  • 종료 메서드는 호출 X
  • 프로토타입 빈은 해당 빈을 조회한 클라이언트가 관리해야함. (종료 메서드에 대한 호출도 클라이언트가 직접해야함)

 - 싱글톤 빈에서 프로토타입 빈 사용 - 

  • 스프링은 일반적으로 싱글톤 빈 사용 -> 싱글톤 빈이 프로토타입 빈을 사용하게 됨
  • 싱글톤 빈은 생성 시점에만 DI를 받기 때문에, 프로토타입 빈이 해당 시점에 생성되어 함께 계속 유지되는 문제 발생
  • 해당 문제의 해결을 위한 기능들
    • ObjectFactory: 기능이 단순, 별도의 라이브러리 필요 없음, 스프링에 의존
    • ObjectProvider: ObjectFactory 상속, 옵션, 스트림 처리등 편의 기능이 많고, 별도의 라이브러리 필요 없음, 스프링에 의존
    • jaavx.inject.Provider
      • get() 메서드 하나로 기능이 매우 단순하다.
      • 별도의 라이브러리가 필요하다.
      • 자바 표준이므로 스프링이 아닌 다른 컨테이너에서도 사용할 수 있다.

 - 웹 스코프 - 

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