Intro
백엔드 과목평가 공부를 하면서, 웹 애플리케이션의 4종류의 scope에 대해 간단히 알고 넘어갔었다.
Spring에서도 scope의 종류가 동일한지 갑자기 궁금해졌다.
Main
📌 Scope
속성을 공유 할 수 있는 유효 범위
1. Servlet & JSP Scope
Servlet과 JSP에서는 Page, Request, Session, Application의 4가지 Scope가 있다.
scope 범위
⭐ page
< request
< session
< application
scope 종류
-
(JSP) Page Scope
📌 하나의 jsp 페이지 내에서만 객체를 공유하는 영역
- 실제 선언된 jsp 페이지 내에서만 사용
- 페이지 내에서 지역변수처럼 사용
- 지역변수처럼 사용된다는 이 점이 다른 Scope들과의 차이점이라 할 수 있다.
- pageContext 추상 클래스 사용
- jsp 페이지에서 pageContext라는 내장객체(Implicite Object)로 사용 가능하다.
- ex)
pageContext이름.setAttribute()
,pageContext이름.getAttribute()
- foward가 될 경우 해당 pageScope에 지정된 변수는 사용 불가함 → 어떤 페이지에서 들어온 요청을 처리하여 다른 페이지로 forward할 때, 이전 pageScope 내의 변수는 다음페이지의 pageScope로 사용할 수 없다.
- JSP에서 pageScope에 값을 저장한 후 해당 값을 EL 표기법 등에서 사용할 때, 지역 변수처럼 해당 JSP나 Servlet이 실행되는 동안에만 정보를 유지하고자 할 때 사용된다.
-
Request Scope
📌 요청을 받아서 응답하기까지 객체가 유효한 영역 (하나의 HTTP요청을 처리할 때 사용되는 영역)
- 클라이언트로부터 하나의 요청이 들어와서 서버가 일을 수행한 후 응답을 보낼 때까지 계속 사용할 수 있는 scope
- Web container 안에 있는 Servlet에 대한 http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용
- 모든 요청이 들어올 때마다, WAS는 request 객체와 response 객체를 만든다. forward 여부 등과 상관없이 하나의 요청이 들어와서 응답이 나갈 때까지 계속 유지
- Servlet의 service() 메소드가 끝날 때 Request Scope가 끝난다 (request 객체가 없어짐)
- 사용 방법
- JSP :
request
내장 변수 사용 - Servlet :
HttpServletRequest
객체 사용
- JSP :
- 생성 및 읽기
- 값 저장 :
request
객체의setAttribute()
메소드 사용 - 값 호출 :
request
객체의getAttribute()
메소드 사용
- 값 저장 :
- forward시 값을 유지하고자 사용
-
Session Scope
📌 같은 브라우저 내에서 요청되는 페이지들이 같은 객체를 공유하는 영역 (하나의 웹 브라우저와 관련된 영역)
- session 객체가 만들어져서 소멸될 때까지 유지
- request와 달리 하나가 아닌 여러 개의 요청이 들어와도 계속 남아있다.
- 웹 브라우저 별로 변수를 관리하고자 할 경우 사용
- 웹 브라우저의 탭 간에 세션정보(상태정보) 공유 가능하다.
- 하나의 클라이언트마다 객체 생성
- 사용 방법
- JSP :
session
내장 변수 사용 - Servlet :
HttpServletRequest
의getSession()
메소드를 이용하여session
객체 얻는다 →Request
의 메소드를 사용하는 이유 : Session 객체가 어떤 클라이언트의 요청인지 파악
- JSP :
- 생성 및 읽기
- 값 저장 :
session
객체의setAttribute()
메소드 사용 - 값 호출 :
**session**
객체의getAttribute()
메소드 사용
- 값 저장 :
- 쇼핑몰의 장바구니처럼 사용자 별로 유지되어야 할 정보가 있을 때 주로 쓰인다.
- session 객체가 만들어져서 소멸될 때까지 유지
-
Application Scope
📌 같은 애플리케이션 내에서 요청되는 페이지들은 같은 객체를 공유하는 영역 (하나의 웹 어플리케이션과 관련된 영역)
- 하나의 application이 생성되고 소멸될 때까지 계속 유지
- Eclipse에서 하나의 Project가 하나의 Application이라고 생각하면 되고, 하나의 Server에는 여러 개의 Web Application이 존재할 수 있다.
- 웹 어플리케이션이 시작되고 종료(혹은 다시 시작)될 때까지 변수를 사용할 수 있음
- ServletContext 인터페이스를 구현한 객체를 사용
- 사용 방법
- JSP :
application 내장 객체
이용 - Servlet :
getServletContext()
메소드를 이용하여application 객체
이용
- JSP :
- 웹 어플리케이션 하나당 하나의 application 객체가 사용됨
- 생성 및 읽기
- 값 저장 :
application
객체의setAttribute()
메소드 사용 - 값 호출 :
application
객체의getAttribute()
메소드 사용
- 값 저장 :
- 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 쓰인다. (하나의 application scope는 여러 클라이언트들이 사용할 수 있기 때문)
- 하나의 application이 생성되고 소멸될 때까지 계속 유지
2. Bean Scope
Spring Bean이란
Spring에서 POJO
(plain, old java object)를 Beans
라고 부른다.
Beans
는 애플리케이션의 핵심을 이루는 객체이며, Spring IoC
(Inversion of Control) 컨테이너에 의해 인스턴스화, 관리, 생성된다.
Beans
는 우리가 컨테이너에 공급하는 설정 메타 데이터(XML 파일)에 의해 생성된다.
컨테이너는 이 메타 데이터를 통해 Bean의 생성, Bean Life Cycle, Bean Dependency(종속성) 등을 알 수 있다.
애플리케이션의 객체가 지정되면, 해당 객체는 getBean()
메서드를 통해 가져올 수 있다.
일반적으로 Spring Bean은 xml 파일
에 정의한다.
📌 주요 속성
- class(필수) : 정규화된 자바 클래스 이름
- id : bean의 고유 식별자
- scope : 객체의 범위 (sigleton, prototype)
- constructor-arg : 생성 시 생성자에 전달할 인수
- property : 생성 시 bean setter에 전달할 인수
- init method와 destroy method
Scope 종류
Spring에는 다음과 같은 Scope들이 존재한다.
-
Singleton
- Spring 프레임워크에서 기본이 되는 스코프
- 스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨
-
Prototype
- 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
- 요청이 오면 항상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
- 프로토타입을 받은 클라이언트가 객체를 관리해야 함
-
Web
request
: 각각의 요청이 들어오고 나갈때가지 유지되는 스코프session
: 세션이 생성되고 종료될 때 까지 유지되는 스코프application
: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
Scope 설정
-
어노테이션으로 설정
@Scope
어노테이션으로 설정 가능하다.1 2 3 4 5 6
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component @Scope("prototype") public class Proto { }
-
xml 파일에서 설정
bean 객체 생성 시, 태그 안에 scope 속성 값을 주어 설정 가능하다.
1
<bean id="kor" class="com.ssafy.hello.di4.HelloMessageKor" scope="prototype"></bean>
scope를 설정하면, 해당 scope당 하나의 객체를 생성한다.
이 속성 값을 따로 정해주지 않으면 기본은 싱글톤으로 설정됨.
결론
기존에 알고있던 웹
의 네가지 Scope = Web의 Scope
Spring
하며 추가된 두가지 Scope = Bean의 Scope