Scope란?

Scope란 프로그래밍 할 때 가장 중요한 개념이라고 생각된다.

Scope란 변수 혹은 객체가 존재가능한 유효 범위를 의미한다.

이번 포스팅에서는 Spring에서의 Bean 객체의 scope에 대해 알아볼 것이다.

Bean의 범위

우선 Bean의 Scope는 bean 속성값에 따라서 다르다.

속성설명
singleton(Default) 하나의 bean 정의가 DI 컨테이너마다 하나의 객체를 유지한다.
prototype하나의 bean 정의가 다수의 객체 인스턴스 범위를 가진다.
request하나의 bean 정의가 하나의 HTTP 요청이 들어올때 생성되고 완료시 소멸된다.
session하나의 bean 정의가 HTTP session의 라이프 사이클의 범위를 가지며, ApplicationContext의 컨텍스트에서만 유효하다.
global session하나의 빈 정의가 전역적인 HTTP session의 라이프 사이클의 범위를 가진다. ApplicationContext의 컨텍스트에서만 유효하다.

이번 포스팅에서는 singleton과 prototype에 대해서만 다뤄보고자 한다.

singleton

scope 속성을 지정하지 않으면 기본적으로 singleton 범위가 적용된다.

<bean id="person" class="com.bbo.example.Person">
    <constructor-arg>
        <value>bbo</value>
    </constructor-arg>
    <constructor-arg>
        <value>23</value>
    </constructor-arg>
</bean>

아래 예제는 singleton의 범위를 가지는 person이라는 빈 객체를 가져와서 수정 전과 수정 후의 값을 비교해본다.

public static void main(String[] args) {
    AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
 
    Person person1 = ctx.getBean("person", Person.class);
    System.out.println(person1.getName());
    System.out.println(person1.getAge());
 
    Person person2 = ctx.getBean("person", Person.class);
    person2.setName("john");
    person2.setAge(22);
 
  // TEST 부분 - person2를 수정했는데 person1이 수정이 될까? 말까?
 
  System.out.println(person1.getName());
    System.out.println(person1.getAge());
}

결론적으로는 하나의 인스턴스만 유지하기 때문에 person1과 person2는 같은 객체이기 때문에 값이 변경된다.

prototype

scope를 prototype으로 값을 지정해보자.

<bean id="person" class="com.bbo.example.Person" scope="prototype">
    <constructor-arg>
        <value>bbo</value>
    </constructor-arg>
    <constructor-arg>
        <value>23</value>
    </constructor-arg>
</bean>

결론적으로는 singleton에서의 예제와는 달리 person1과 person2는 다른 객체이기 때문에 수정이 되지 않는다.

정리

bean의 범위는 scope 속성 값에 따라 달라진다. 이번 포스팅에서는 간략하게 singleton과 prototype 만을 다루었는데, request와 session에 대해서도 다루어보길 바란다.

참고 자료

Outsider's Dev story

+ Recent posts