목표 : 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가지를 알아보았다.
'Framework > Spring' 카테고리의 다른 글
[Spring] Annotation Configuration은 어떻게 할까? (0) | 2022.08.01 |
---|---|
[Spring] Bean의 LifeCycle는 어떻게 될까? (0) | 2022.07.31 |
[Spring] 스프링의 DI가 뭘까? (0) | 2022.07.26 |
[Spring] 스프링의 Bean을 어떻게 쓸 수 있을까? (0) | 2022.07.23 |
[Spring] 스프링의 IoC Container가 뭘까? (0) | 2022.07.23 |