빈 생명주기 콜백 시작

  • 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.
    • 여기서 초기화 작업은 의존 관계 주입이 모두 완료되고 나서 호출이 되어야 한다. 개발자는 이 호출 시점을 알고 있어야 한다. 어떻게 파악할 수 있을까?
    • 스프링에서는 의존 관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공해준다. 
  • 스프링 빈의 이벤트 라이프사이클은 아래와 같다.
    • 생성 > 스프링 빈 생성 > 의존관계 주입 > 초기화 콜백 사용 > 소멸전 콜백 스프링 종료
      • 초기화 콜백을 사용하는것은 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출된다.
      • 소멸전 콜백을 사용하는것은 빈이 소멸되기 직전에 호출된다. 
  • 객체의 생성과 초기화를 분리하자.
    • 생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 갖게 된다. 
    • 초기화는 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 다소 무거운 동작을 수행한다. 
    • 따라서 생성자 안에서 무거운 초기화 작업을 함께 하는 것 보다는 객체를 생성하는 부분과 초기화 하는
      부분을 명확하게 나누는 것이 유지보수 관점에서 좋다.

스프링 빈

  • 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어 스프링 컨테이너가 종료될 때까지 유지합니다.
  • 싱글톤
    • 기본 스코프이며, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 입니다.
  • 프로토타입
    • 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지 관리하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
  • 싱글톤 vs 프로토타입 스코프의 차이
    • 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 반면에 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다. 
    • 프로토타입 스코프 종료 메서드가 호출되지 않는다.
  • 스프링 컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화까지만 처리한다는
    것이다. 클라이언트에 빈을 반환하고, 이후 스프링 컨테이너는 생성된 프로토타입 빈을 관리하지 않는다.
    프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. 
  • 싱글톤 빈은 스프링 컨테이너 생성 시점에 초기화 메서드가 실행 되지만, 프로토타입 스코프의 빈은 스프링
    컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행된다.
  • 싱글톤 빈과 스코프 빈이 함께 유지되는것이 문제다. > Provider 

웹 스코프

  • 웹 환경에서만 동작한다. 
  • 프로토타입 스코프랑 다르게 해당 스코프의 종료시점까지 관리한다. 종료 메서드가 호출된다. 
  • HTTP request가 요청될때 각 클라이언트의 빈이 생성되고 이것은 HTTP request 라이프사이클 (요청-종료) 시점까지 같은 빈으로 관리된다. 

'Spring' 카테고리의 다른 글

의존성 주입  (1) 2023.01.21
Spring Security  (0) 2021.12.14
의존관계 자동 주입  (0) 2021.12.13
컴포넌트 스캔  (0) 2021.12.12
싱글톤 컨테이너  (0) 2021.12.12