26/07/07 IL(I Learned) - Step 4

Bean Scope(Request, Session)와 Scope의 생명주기 이해

1) Bean Scope란?

Spring에서는 Bean이 언제 생성되고 언제 소멸되는지를 Scope를 통해 결정한다.

기본적으로 Spring Bean은 Singleton으로 생성된다.

@Component
public class ExampleBean {
}

@Scope를 지정하지 않으면 Singleton으로 관리된다.

이번 예제에서는 기존 Singleton 외에

  • Request Scope
  • Session Scope

두 가지 Scope를 학습하였다.


2) Request Scope

Request Scope Bean은

@Component
@RequestScope
public class RequestScopeBean {
}

HTTP 요청이 들어올 때마다 새로운 Bean이 생성된다.

즉,

GET /scope

↓

RequestScopeBean 생성

↓

응답 완료

↓

Bean 소멸

요청이 끝나면 Bean도 함께 제거된다.

새로고침(F5)을 하면

첫 번째 요청

↓

RequestScopeBean A
두 번째 요청

↓

RequestScopeBean B

처럼 항상 새로운 객체가 생성된다.


3) RequestScopeBean에서 UUID를 사용하는 이유

RequestScopeBean에는

private final String uuid;

가 존재한다.

생성자에서

UUID.randomUUID();

를 호출하여 고유한 UUID를 생성한다.

UUID를 사용하는 이유는

매 요청마다 새로운 Bean이 생성되었는지 확인하기 위해서이다.

예를 들어

첫 번째 요청

UUID

A123...

두 번째 요청

UUID

F928...

UUID가 계속 바뀌는 것을 통해 새로운 Bean이 생성되었음을 확인할 수 있었다.


4) 생성 시간을 저장하는 이유

RequestScopeBean에서는

private final ZonedDateTime creationTime;

도 함께 저장한다.

생성자에서

creationTime = ZonedDateTime.now();

를 실행한다.

즉,

요청

↓

Bean 생성

↓

생성 시간 저장

이 된다.

새로고침할 때마다 생성 시간이 계속 변경되는 것을 확인할 수 있었다.


5) Session Scope

Session Scope Bean은

@Component
@SessionScope
public class SessionScopeBean {
}

으로 선언하였다.

Session Scope는

사용자(Session)마다 하나의 Bean을 생성한다.

즉,

브라우저 접속

↓

Session 생성

↓

SessionScopeBean 생성

이후에는

새로고침을 여러 번 해도

같은 Bean을 계속 사용한다.


6) SessionScopeBean의 count

SessionScopeBean에는

private int count = 0;

가 존재한다.

그리고

public void increment() {
    count++;
}

를 호출할 때마다

0

↓

1

↓

2

↓

3

으로 값이 증가한다.

새로고침을 반복해도 count가 유지되는 이유는

Session Scope Bean이 동일한 객체를 계속 사용하기 때문이다.


7) ScopeController

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로 전달한다.


8) Request Scope와 Session Scope 차이

이번 예제에서 가장 중요한 내용은

두 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

↓

브라우저 응답

Singleton · Request · Session Scope 비교

Scope생성 시점유지 기간사용 예시
Singleton서버 시작서버 종료까지Service, Repository
Request요청마다요청 종료까지요청별 임시 데이터
SessionSession 생성Session 종료까지로그인 정보, 장바구니
profile
예 마 함 가보입시더

0개의 댓글