빈 스코프
스프링의 DI컨테이너가 관리하는 Bean의 생존기간을 의미한다.
스프링에서 설정할 수 있는 Bean의 스코프는 다음과 같다:
singleton | 디폴트값이다. 하나의 인스턴스가 생성되고, 이후에는 해당 인스턴스를 공유하게 된다. |
prototype | DI에 Bean에대한 요청이 들어올때 마다 Bean을 생성한다. 멀티스레드 환경에서 사용되는 Bean에 많이 쓰인다. |
request | HTTP 요청이 들어올 때 새로운 Bean을 생성한다. 웹에서만 쓰인다. |
session | HTTP 세션이 생성될 때 새로운 Bean을 생성한다. 웹에서만 쓰인다. |
global session | 글로벌 HTTP세션이 생성될 때 Bean을 생성한다. 포틀릿 웹에서만 쓰인다. |
application | 서블릿 컨텍스트가 만들어질 때 Bean을 생성한다. 웹에서만 쓰인다. |
custom | 스코프의 이름, 규칙을 개발자가 직접 정의한다. |
빈의 스코프는 다음과 같이 @Scope를 사용해 설정할 수 있다.
(자바 설정 및 xml에서도 설정 가능)
@Component
@Scope("prototype")
public class UserSErviceImpl implements UserService {
...
}
생존기간은 상황이나 Scope마다 다르지만 보통은 request < session < prototype < singleton 순이다.
빈 생명주기
Bean은 일종의 생명주기를 가지는데 이는, 초기화 → 사용 → 종료 순이다.
이 중 대부분은 사용 단계에서 시간을 가져간다.
초기화
초기화 단계는 크게 세가지로 나뉜다.
- Bean 설정
- Bean 인스턴스화 및 의존성 주입
- Bean 생성 뒤 후처리
먼저 설정 단계에서는 설정파일로부터 설정을 읽어오게 된다.
그리고 설정 정보를 수집했다면, 해당 설정을 보완하는 작업을 한다.
빈의 정보를 성공적으로 읽어왔다면, 인스턴스로 생성하게 되고,
앞선 포스팅에서 언급한 생성자 기반, 필드 기반, Setter 기반의 의존성을 주입힌다.
마지막으로는 생성 작업이 끝난 뒤의 후처리를 해주기 위한 작업을 한다.
이는 @PostConstruct 애노테이션을 통해 사용자가 직접 작업을 수행할 수도 있다.
종료
빈의 생명주기가 다하거나, DI 컨테이너가 파괴될 때는 빈도 함께 파괴되어야 한다.
파괴 단계가 실행되기 전에 무언가 해줘야할 작업이 있다면,
이 역시 @PreDestroy 애노테이션으로 해결이 가능하다.
빈 설정
빈의 설정은 여러 파일로 분할되어 이뤄질 수도 있다.
자바 파일을 사용해 여러 파일로 분할하고, 하나의 파일에서 취합하는 방법은 다음과 같다.
다음과 같이 두개의 설정이 각각 다른 파일에 나눠져있다고 가정하면,
@Configuration
public class DomainConfig {
@Bean
UserService userService() { ... }
}
@Configuration
public class InfrastructureConfig {
@Bean
DataSource dataSource() { ... }
}
다음과 같이 @Import를 사용하여 취합할 수 있다.
@Configuration
@Import({DomainConfig.class, InfrasturctureConfig.class})
public class AppConfig {
...
}
이러한 방법 외에도, 스프링의 프로파일을 통한 분할 역시 가능하다.
참고자료
스프링 철저 입문, 위키북스
'서버 개발 > 스프링' 카테고리의 다른 글
[스프링 클라우드] 서비스 디스커버리 (0) | 2024.10.03 |
---|---|
스프링 프레임워크 - (4) 데이터 바인딩 (0) | 2019.09.10 |
스프링 프레임워크 - (3) AOP (0) | 2019.09.10 |
스프링 프레임워크 - (1) 의존성 주입 (DI) (0) | 2019.09.02 |