Home Scope
Post
Cancel

Scope

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 종류

  1. (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이 실행되는 동안에만 정보를 유지하고자 할 때 사용된다.
  2. Request Scope

    📌 요청을 받아서 응답하기까지 객체가 유효한 영역 (하나의 HTTP요청을 처리할 때 사용되는 영역)

    • 클라이언트로부터 하나의 요청이 들어와서 서버가 일을 수행한 후 응답을 보낼 때까지 계속 사용할 수 있는 scope
    • Web container 안에 있는 Servlet에 대한 http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용
    • 모든 요청이 들어올 때마다, WAS는 request 객체와 response 객체를 만든다. forward 여부 등과 상관없이 하나의 요청이 들어와서 응답이 나갈 때까지 계속 유지
    • Servlet의 service() 메소드가 끝날 때 Request Scope가 끝난다 (request 객체가 없어짐)
    • 사용 방법
      • JSP : request 내장 변수 사용
      • Servlet : HttpServletRequest 객체 사용
    • 생성 및 읽기
      • 값 저장 :  request 객체의 setAttribute() 메소드 사용
      • 값 호출 :  request 객체의 getAttribute() 메소드 사용
    • forward시 값을 유지하고자 사용
  3. Session Scope

    📌 같은 브라우저 내에서 요청되는 페이지들이 같은 객체를 공유하는 영역 (하나의 웹 브라우저와 관련된 영역)

    • session 객체가 만들어져서 소멸될 때까지 유지
      • request와 달리 하나가 아닌 여러 개의 요청이 들어와도 계속 남아있다.
    • 웹 브라우저 별로 변수를 관리하고자 할 경우 사용
      • 웹 브라우저의 탭 간에 세션정보(상태정보) 공유 가능하다.
    • 하나의 클라이언트마다 객체 생성
    • 사용 방법
      • JSP :  session 내장 변수 사용
      • Servlet :  HttpServletRequest의 getSession() 메소드를 이용하여 session 객체 얻는다 → Request의 메소드를 사용하는 이유 : Session 객체가 어떤 클라이언트의 요청인지 파악
    • 생성 및 읽기
      • 값 저장 : session 객체의 setAttribute() 메소드 사용
      • 값 호출 : **session** 객체의 getAttribute() 메소드 사용
    • 쇼핑몰의 장바구니처럼 사용자 별로 유지되어야 할 정보가 있을 때 주로 쓰인다.
  4. Application Scope

    📌 같은 애플리케이션 내에서 요청되는 페이지들은 같은 객체를 공유하는 영역 (하나의 웹 어플리케이션과 관련된 영역)

    • 하나의 application이 생성되고 소멸될 때까지 계속 유지
      • Eclipse에서 하나의 Project가 하나의 Application이라고 생각하면 되고, 하나의 Server에는 여러 개의 Web Application이 존재할 수 있다.
    • 웹 어플리케이션이 시작되고 종료(혹은 다시 시작)될 때까지 변수를 사용할 수 있음
    • ServletContext 인터페이스를 구현한 객체를 사용
    • 사용 방법
      • JSP : application 내장 객체 이용
      • Servlet : getServletContext() 메소드를 이용하여 application 객체 이용
    • 웹 어플리케이션 하나당 하나의 application 객체가 사용됨
    • 생성 및 읽기
      • 값 저장 : application 객체의 setAttribute() 메소드 사용
      • 값 호출 : application 객체의 getAttribute() 메소드 사용
    • 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 쓰인다. (하나의 application scope는 여러 클라이언트들이 사용할 수 있기 때문)

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들이 존재한다.

  1. Singleton

    • Spring 프레임워크에서 기본이 되는 스코프
    • 스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨
  2. Prototype

    • 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
    • 요청이 오면 항상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
    • 프로토타입을 받은 클라이언트가 객체를 관리해야 함
  3. Web

    • request: 각각의 요청이 들어오고 나갈때가지 유지되는 스코프
    • session: 세션이 생성되고 종료될 때 까지 유지되는 스코프
    • application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프

Scope 설정

  1. 어노테이션으로 설정

    @Scope 어노테이션으로 설정 가능하다.

    1
    2
    3
    4
    5
    6
    
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    
    @Component @Scope("prototype")
    public class Proto {
    }
    
  2. 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

Outro


  1. Spring Bean의 개념과 BeanScope 종류
  2. 웹 어플리케이션의 4가지의 영역(scope)
  3. JSP, Servlet에서의 4가지 Scope
  4. Spring의 3가지 Scope
This post is licensed under CC BY 4.0 by the author.