웹/Spring
[메모] Spring 원리 (3) 빈 생명주기 콜백, 빈 스코프
겨울철한정
2023. 5. 26. 20:56
- 빈 생명주기 콜백 -
- 스프링 빈의 이벤트 라이프 사이클
- 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
- 초기화 콜백: 빈이 생성되고, 의존관계의 주입이 완료된 이후 호출
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
- 초기화, 소멸 인터페이스 -
- 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: 웹 소켓과 동일한 생명주기를 가지는 스코프
'웹/Spring' Related Articles