Framework/Spring

[Spring] Bean Scope 가 뭘까?

KOOCCI 2022. 7. 29. 00:14

목표 : Bean Scope에 대해 설명할 수 있다.


Bean Scope라는 것은 Bean의 범위인데, 아마 바로는 이해가 쉽지 않을 것이다.

Bean Scope는 객체를 만들 때, 컨테이너가 이 객체를 한번만 호출하는지, 아니면 호출 할 때마다 여러번 만드는지에 대한 내용이다.

 

그래서 문서 상에 여러 Scope가 있는 걸 볼 수 있고, 대부분 singleton 혹은 prototype이다.

 

이 두가지를 알아보기 전에 한가지 정리가 필요하다.

 

용어부터 정리해보자.

Identity (동일성) 그리고 equals (동등성) 두가지가 있다

 

Identity (동일성) 객체의 주소가 같다.

이 말은  obj1 == obj2 && obj2 == obj3 를 했을 때, true가 나오는 Hashcode가 동일한 것이다.

 

equals(동등성) 객체의 값이 같은 것이다.

equals는 obj1.equals(obj2) == ture 와 같이 그 값들이 같은 것이다.

 

equals는 객체의 equals에 대해 Overload에 따라 달라질 수 있고, 그 내부 정보가 같다면 같을 수 있지만, Identity는 그 주소가 같다는 것으로 Singleton일 때는 하나의 객체를 재사용하므로 같을 것이다.

Singleton

Default로서, Spring IoC container에서 호출될 때 딱 하나의 객체만 만들어서 재사용하는 것이다.

그럼 위에서 배운 Identity(동일성)을 확인해보도록 하자.

<bean id="A" class="com.something.A"/>

위 처럼 선언된 bean을 getBean으로 가져와, 비교를 해볼 것이다.

ApplicationContext context = new ClassPathXmlApplicationContext("test.xml");

A a1 = context.getBean("A", A.class);
A a2 = context.getBean("A", A.class);

log.info("result Identity = " + (a1 == a2)); // true

 

Prototype

Spring IoC Container가 호출될 때마다 객체를 만드는 것(new 로 만드는 것과 동일)이다.

이 역시, Identity(동일성)을 확인해보도록 하자.

<bean id="B" class="com.something.B" scope="prototype"/>
ApplicationContext context = new ClassPathXmlApplicationContext("test.xml");

B b1 = context.getBean("B", B.class);
B b2 = context.getBean("B", B.class);

log.info("result Identity = " + (b1 == b2)); // false

 

Wrap Up

 

간단하게 Bean Scope에 대해 알아보았다.

IoC Container에서 Bean이 어떻게 생성되는가에 대한 내용이고, 가장 대표적인 2가지를 알아보았다.