출처: https://jeong-pro.tistory.com/86 [기본기를 쌓는 정아마추어 코딩블로그]
스프링 설정 파일의 < bean > 엘리먼트 중 scope를 학습하며...
< bean >의 여러 속성들
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다.
메모리 낭비를 방지 가능하다.
DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.
(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체등)
싱글톤 패턴의 문제점
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)
따라서 수정이 어려워지고 테스트하기 어려워진다.
또한 멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있음
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 스프링 설정 파일 -->
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"/>
</beans>
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args)
{
// 1. Spring 컨테이너를 구동한다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
TV tv1 = (TV) factory.getBean("tv");
TV tv2 = (TV) factory.getBean("tv");
TV tv3 = (TV) factory.getBean("tv");
// 3. Spring 컨테이너를 종료한다.
factory.close();
}
}
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:26:56 KST 2021]; root of context hierarchy
===> SamsungTV 객체 생성
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:26:56 KST 2021]; root of context hierarchy
반대로 scope 속성을 "prototype"으로 지정하면 매번 새로운 객체를 생성하여 반환한다.
<bean id="tv" class="polymorphism.SamsungTV" scope="prototype"/>```