[Spring] 김영한-스프링 핵심원리 기본
in Study on Spring & SpringBoot
김영한님의 “스프링 핵심 원리 기본” 강의 정리
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. 빈 스코프
빈이 존재할 수 있는 범위
빈 스코프 종류
- 싱글톤
- 기본 스코프
- 스프링 컨테이너 시작부터 종료까지 유지
- 프로토타입
- 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않음
- 웹 관련 스코프
- request : 웹 요청이 들어오고 나갈 때 까지 유지
- session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
- application : 웹의 서블릿 컨텍스트와 같은 범위로 유지
- 싱글톤
@Scope()
애노테이션을 활용
프로토타입 스코프
- 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상
새로운 인스턴스
를 생성해서 반환 - 스프링 컨테이너는 프로토타입 빈을
생성
하고 의존관계주입
,초기화
까지만 처리한다 - @PreDestroy 같은 종료 메서드가 호출되지 않음
- 프로토타입 빈은 클라이언트가 관리해야 함. 종료 메서드에 대한 호출도 클라이언트가 직접 해야 함
프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
- ❗ 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의
- 싱글톤 빈이 프로토타입 빈에 의존할 경우 문제 발생
- 싱글톤 빈 내부의 프로토타입 빈은 싱글톤 빈이 생성되면서 이미 주입이 끝난 빈
- 싱글톤 빈이 내부 프로토타입 빈을 사용할 때마다 생성되지 않음
- 해결방법
- 프로토타입 빈이 필요할 때마다 직접 생성되도록 한다.
- applicationContext 를 통해서 해당 프로토타입 빈을 조회해서 사용하도록 한다.
- 이처럼 직접 필요한 의존관계를 찾는 것을
Dependency Lookup
(DL) 이라고 한다.
Provider
로 해결할 수 있다- ObjectFactory, ObjectProvider 사용
- ObjectFactory의 기능을 확장한 것이
ObjectProvider
- 단순한 기능으로, 단위테스트, mock 코드 생성 용이
- 스프링에 의존적이라는 단점
- ObjectFactory의 기능을 확장한 것이
- JSR-330 Provider
- 자바 표준. 사용하려면
javax.inject:javax.inject:1
라이브러리 필수 - 자바 표준이기 때문에 스프링이 아닌 다른 컨테이너에서도 사용 가능
- 라이브러리 추가가 필요하다는 점에서 단점
- 자바 표준. 사용하려면
- ObjectFactory, ObjectProvider 사용
- 프로토타입 빈이 필요할 때마다 직접 생성되도록 한다.
❓프로토타입 빈은 언제 사용?
매번 사용할 때마다 의존관계 주입이 완료된 새로운 객체가 필요할 때 사용.
대부분의 문제는 싱글톤 빈으로 해결되기 때문에 실무에서 사용하는 일은 드묾.