Spring에서는 Bean이 언제 생성되고 언제 소멸되는지를 Scope를 통해 결정한다.
기본적으로 Spring Bean은 Singleton으로 생성된다.
@Component
public class ExampleBean {
}
@Scope를 지정하지 않으면 Singleton으로 관리된다.
이번 예제에서는 기존 Singleton 외에
두 가지 Scope를 학습하였다.
Request Scope Bean은
@Component
@RequestScope
public class RequestScopeBean {
}
HTTP 요청이 들어올 때마다 새로운 Bean이 생성된다.
즉,
GET /scope
↓
RequestScopeBean 생성
↓
응답 완료
↓
Bean 소멸
요청이 끝나면 Bean도 함께 제거된다.
새로고침(F5)을 하면
첫 번째 요청
↓
RequestScopeBean A
두 번째 요청
↓
RequestScopeBean B
처럼 항상 새로운 객체가 생성된다.
RequestScopeBean에는
private final String uuid;
가 존재한다.
생성자에서
UUID.randomUUID();
를 호출하여 고유한 UUID를 생성한다.
UUID를 사용하는 이유는
매 요청마다 새로운 Bean이 생성되었는지 확인하기 위해서이다.
예를 들어
첫 번째 요청
UUID
A123...
두 번째 요청
UUID
F928...
UUID가 계속 바뀌는 것을 통해 새로운 Bean이 생성되었음을 확인할 수 있었다.
RequestScopeBean에서는
private final ZonedDateTime creationTime;
도 함께 저장한다.
생성자에서
creationTime = ZonedDateTime.now();
를 실행한다.
즉,
요청
↓
Bean 생성
↓
생성 시간 저장
이 된다.
새로고침할 때마다 생성 시간이 계속 변경되는 것을 확인할 수 있었다.
Session Scope Bean은
@Component
@SessionScope
public class SessionScopeBean {
}
으로 선언하였다.
Session Scope는
사용자(Session)마다 하나의 Bean을 생성한다.
즉,
브라우저 접속
↓
Session 생성
↓
SessionScopeBean 생성
이후에는
새로고침을 여러 번 해도
같은 Bean을 계속 사용한다.
SessionScopeBean에는
private int count = 0;
가 존재한다.
그리고
public void increment() {
count++;
}
를 호출할 때마다
0
↓
1
↓
2
↓
3
으로 값이 증가한다.
새로고침을 반복해도 count가 유지되는 이유는
Session Scope Bean이 동일한 객체를 계속 사용하기 때문이다.
Controller에서는
@RequiredArgsConstructor
@Controller
@RequestMapping("/scope")
public class ScopeController {
를 사용하였다.
생성자 주입을 통해
private final RequestScopeBean requestScopeBean;
private final SessionScopeBean sessionScopeBean;
을 주입받는다.
그리고
sessionScopeBean.increment();
를 호출하여 방문 횟수를 증가시킨다.
이후
model.addAttribute(...)
를 이용하여
Request Bean과 Session Bean 정보를 View로 전달한다.
이번 예제에서 가장 중요한 내용은
두 Scope의 생명주기 차이였다.
새로고침을 했을 때
Request Bean은
UUID
A
↓
B
↓
C
처럼 계속 변경된다.
반면
Session Bean은
UUID
X
↓
X
↓
X
로 유지된다.
또한 count 역시
1
↓
2
↓
3
처럼 계속 증가한다.
이를 통해 Request Scope는 요청마다 새로 생성되고,
Session Scope는 같은 Session 동안 유지된다는 점을 확인하였다.
브라우저
↓
GET /scope
↓
DispatcherServlet
↓
ScopeController
↓
RequestScopeBean 생성
↓
SessionScopeBean 조회
↓
count 증가
↓
Model 저장
↓
scope.jsp
↓
브라우저 응답
| Scope | 생성 시점 | 유지 기간 | 사용 예시 |
|---|---|---|---|
| Singleton | 서버 시작 | 서버 종료까지 | Service, Repository |
| Request | 요청마다 | 요청 종료까지 | 요청별 임시 데이터 |
| Session | Session 생성 | Session 종료까지 | 로그인 정보, 장바구니 |