게으른 개발자의 끄적거림

Scope란? (feat. Page, Request, Session, Application)

끄적잉 2024. 9. 24. 00:23

Scope란? (feat. Page, Request, Session, Application)

 

웹 애플리케이션 개발에서 "스코프(Scope)"라는 개념은 특정 자원(데이터, 변수, 상태 등)에 접근할 수 있는 범위 또는 수명을 정의하는 중요한 개념입니다. 스코프는 자원의 가시성, 접근성, 그리고 그 자원이 유지되는 시간에 따라 네 가지 수준으로 나눌 수 있습니다: **Page Scope, Request Scope, Session Scope, Application Scope**. 각각의 스코프는 애플리케이션의 다른 부분에서 자원을 공유하거나 격리하는 방식에 따라 다르게 사용됩니다. 이 개념은 JSP(Java Server Pages), Servlet, Spring Framework 같은 다양한 웹 애플리케이션 개발 환경에서 자주 언급되며, 각 스코프의 특성을 이해하면 웹 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있습니다.

 


### 1. Page Scope
**Page Scope**는 가장 제한적인 스코프입니다. 이 스코프는 하나의 페이지 내에서만 변수나 객체를 사용할 수 있게 하며, 페이지가 끝나면 자원은 즉시 해제됩니다. 이 스코프는 JSP에서 주로 사용되며, `pageContext`라는 객체를 통해 관리됩니다. JSP 페이지 내에서 선언된 변수는 이 스코프에 속하며, 다른 페이지나 서블릿에서 접근할 수 없습니다. 이는 자원을 페이지 단위로 제한하여 다른 페이지와의 충돌을 방지하며, 특정한 페이지에서만 사용되어야 하는 데이터를 처리하는 데 유용합니다.

#### Page Scope의 특징:
- **수명**: 한 페이지가 로드되고 사용자에게 응답한 후, 그 자원은 자동으로 소멸됩니다.
- **가시성**: 같은 페이지 내에서만 접근 가능하며, 페이지 간에 데이터를 공유하지 않습니다.
- **주요 사용 사례**: 특정 JSP 페이지에서만 사용되는 임시 데이터나 변수를 저장할 때 유용합니다.


#### 예시:
```jsp
<% 
   String name = "John Doe"; // Page Scope에서만 사용 가능
%>
<jsp:useBean id="user" class="cohttp://m.example.User" scope="page" />
```

 

 


위의 코드에서, `name` 변수와 `user` 객체는 Page Scope에 속하며, 해당 페이지가 로드되고 클라이언트에게 응답이 끝나면 메모리에서 해제됩니다.

 


### 2. Request Scope
**Request Scope**는 특정 HTTP 요청에 따라 자원의 수명이 결정되는 스코프입니다. 즉, 클라이언트의 요청이 서버로 들어오고, 서버가 이 요청을 처리하여 응답을 반환할 때까지 자원이 유지됩니다. 이는 주로 다수의 페이지나 서블릿 간에 데이터를 공유해야 할 때 사용됩니다. 예를 들어, 폼 데이터를 처리하는 과정에서 여러 페이지가 연속으로 호출되는데, 이때 같은 요청 범위 내에서 데이터를 유지하는 데 유용합니다.

#### Request Scope의 특징:
- **수명**: 하나의 HTTP 요청에 종속되며, 요청 처리가 완료되면 자원이 해제됩니다.
- **가시성**: 같은 요청 범위 내에서 호출되는 다른 JSP 페이지나 서블릿 간에 데이터를 공유할 수 있습니다.
- **주요 사용 사례**: 클라이언트로부터 받은 요청 데이터를 여러 페이지나 컴포넌트에서 처리해야 할 때 유용합니다.

#### 예시:
```jsp
<jsp:useBean id="user" class="cohttp://m.example.User" scope="request" />
```

 


위의 코드는 `user` 객체를 Request Scope에서 선언한 것입니다. 클라이언트의 요청을 처리하는 동안 여러 서블릿이나 JSP 페이지에서 이 객체를 참조할 수 있습니다.

#### Request Scope의 유용성:
폼 전송 후 여러 페이지에서 같은 데이터를 참조할 필요가 있을 때 자주 사용됩니다. 예를 들어, 쇼핑몰에서 상품을 검색하고 검색 결과를 여러 페이지에 걸쳐 표시할 때, 각 페이지가 동일한 검색 결과 데이터를 공유해야 하는 상황에서 유용합니다.

 


### 3. Session Scope
**Session Scope**는 사용자와 서버 간의 **세션** 동안 자원을 유지하는 스코프입니다. 세션은 일반적으로 사용자가 웹 애플리케이션에 접근하여 로그인을 한 후부터 로그아웃할 때까지, 또는 세션이 만료될 때까지 지속됩니다. 이 스코프는 사용자가 여러 페이지를 넘나들며 작업할 때도 데이터를 유지해야 하는 경우에 유용합니다.

#### Session Scope의 특징:
- **수명**: 사용자 세션이 유효한 동안 자원이 유지되며, 세션이 종료되거나 만료될 때 자원이 해제됩니다.
- **가시성**: 같은 세션 내에서 호출되는 모든 JSP 페이지나 서블릿 간에 데이터를 공유할 수 있습니다.
- **주요 사용 사례**: 사용자 인증 정보, 쇼핑카트 정보, 사용자 환경설정 등을 저장하는 데 주로 사용됩니다.

#### 예시:
```jsp
<jsp:useBean id="user" class="cohttp://m.example.User" scope="session" />
```

 


위의 코드는 `user` 객체를 Session Scope에 선언한 것입니다. 사용자가 웹 애플리케이션에 로그인하여 여러 페이지를 이동할 때도 `user` 객체는 동일하게 유지됩니다.

#### Session Scope의 유용성:
사용자의 로그인 상태를 유지하거나 쇼핑몰에서 장바구니에 담은 상품을 여러 페이지에 걸쳐 참조할 수 있는 경우에 유용합니다. Session Scope는 사용자 개인화된 경험을 제공할 때 많이 활용됩니다.

 

 


### 4. Application Scope
**Application Scope**는 가장 넓은 스코프이며, 웹 애플리케이션 전체에 걸쳐 자원을 공유할 수 있습니다. 이는 서버가 시작되고 애플리케이션이 로드된 순간부터 애플리케이션이 종료될 때까지 자원이 유지됩니다. 모든 사용자와 세션에서 접근 가능하며, 이를 통해 애플리케이션 전역적으로 데이터를 공유할 수 있습니다. 

#### Application Scope의 특징:
- **수명**: 애플리케이션이 시작되고 서버가 실행되는 동안 유지되며, 서버가 종료될 때 자원이 해제됩니다.
- **가시성**: 애플리케이션 내 모든 페이지와 서블릿에서 접근할 수 있습니다.
- **주요 사용 사례**: 전역 설정, 애플리케이션의 공통 자원(예: 데이터베이스 연결 풀) 등을 저장하는 데 유용합니다.

#### 예시:
```jsp
<jsp:useBean id="appConfig" class="cohttp://m.example.Config" scope="application" />
```

 


이 코드는 `appConfig` 객체를 Application Scope에 선언한 것입니다. 애플리케이션 내의 모든 페이지와 서블릿은 이 객체를 참조할 수 있습니다.

#### Application Scope의 유용성:
애플리케이션 내 모든 사용자와 세션에서 공통적으로 접근해야 하는 데이터를 저장할 때 유용합니다. 예를 들어, 데이터베이스 연결 정보, 전역 설정값, 캐싱된 데이터 등이 있습니다. 이러한 정보는 모든 사용자가 공유할 수 있으므로, 중복된 데이터를 저장할 필요 없이 자원을 효율적으로 사용할 수 있습니다.

---

### 각 스코프의 비교

 

 


이 표는 각 스코프의 차이점을 명확히 보여줍니다. 개발자는 애플리케이션의 요구 사항에 따라 적절한 스코프를 선택하여 자원을 관리해야 하며, 스코프를 올바르게 사용하면 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있습니다.