[Spring] 김영한-스프링 핵심원리 기본

김영한님의 “스프링 핵심 원리 기본” 강의 정리
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

9. 빈 스코프

  • 빈이 존재할 수 있는 범위

  • 빈 스코프 종류

    1. 싱글톤
      • 기본 스코프
      • 스프링 컨테이너 시작부터 종료까지 유지
    2. 프로토타입
      • 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않음
    3. 웹 관련 스코프
      • request : 웹 요청이 들어오고 나갈 때 까지 유지
      • session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
      • application : 웹의 서블릿 컨텍스트와 같은 범위로 유지

@Scope() 애노테이션을 활용

프로토타입 스코프

  • 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환
  • 스프링 컨테이너는 프로토타입 빈을 생성하고 의존관계 주입, 초기화까지만 처리한다
  • @PreDestroy 같은 종료 메서드가 호출되지 않음
  • 프로토타입 빈은 클라이언트가 관리해야 함. 종료 메서드에 대한 호출도 클라이언트가 직접 해야 함

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

  • ❗ 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의
  • 싱글톤 빈이 프로토타입 빈에 의존할 경우 문제 발생
    • 싱글톤 빈 내부의 프로토타입 빈은 싱글톤 빈이 생성되면서 이미 주입이 끝난 빈
    • 싱글톤 빈이 내부 프로토타입 빈을 사용할 때마다 생성되지 않음
  • 해결방법
    1. 프로토타입 빈이 필요할 때마다 직접 생성되도록 한다.
      • applicationContext 를 통해서 해당 프로토타입 빈을 조회해서 사용하도록 한다.
      • 이처럼 직접 필요한 의존관계를 찾는 것Dependency Lookup(DL) 이라고 한다.
    2. Provider로 해결할 수 있다
      1. ObjectFactory, ObjectProvider 사용
        • ObjectFactory의 기능을 확장한 것이 ObjectProvider
        • 단순한 기능으로, 단위테스트, mock 코드 생성 용이
        • 스프링에 의존적이라는 단점
      2. JSR-330 Provider
        • 자바 표준. 사용하려면 javax.inject:javax.inject:1 라이브러리 필수
        • 자바 표준이기 때문에 스프링이 아닌 다른 컨테이너에서도 사용 가능
        • 라이브러리 추가가 필요하다는 점에서 단점

❓프로토타입 빈은 언제 사용?
매번 사용할 때마다 의존관계 주입이 완료된 새로운 객체가 필요할 때 사용.
대부분의 문제는 싱글톤 빈으로 해결되기 때문에 실무에서 사용하는 일은 드묾.