오늘은 스프링에서 싱글톤을 이용해서 객체 생성하는 방법을 알아보려고 합니다.
그렇다면 싱글톤이란 무엇인가 먼저 알아봐야겠죠?
Singleton(싱글톤) 이란? 간단하게 말하면
"객체의 인스턴스가 단 1개만 생성되는 패턴을 의미한다." 입니다.
그렇다면 왜 싱글톤을 사용할까요?
싱글톤의 장점으로는
- 객체의 인스턴스가 1개만 생성되기 때문에 고정된 메모리 영역을 사용하여 메모리 낭비를 방지할 수 있습니다.
- 싱글톤은 전역으로 사용되는 인스턴스를 가지기 때문에 다른 클래스간의 데이터 공유가 비교적 간단합니다.
이제 본격적으로 코딩해볼게요!!
이번에는 Spring03이라는 프로젝트를 새로 만들어주시고 그 안에 com.test01이라는 패키지를 만들어 주세요
AbstractTest.java
package com.test01;
import java.util.Calendar;
import java.util.GregorianCalendar;
public abstract class AbstractTest {
public abstract String dayInfo();
public static AbstractTest getInstance() {
GregorianCalendar cal = new GregorianCalendar();
int day = cal.get(Calendar.DAY_OF_WEEK);
switch(day) {
case 1: return new Sunday();
case 2: return new Monday();
case 3: return new Tuesday();
case 4: return new Wednesday();
case 5: return new Thursday();
case 6: return new Friday();
case 7: return new Saturday();
}
return null;
}
}
Sunday.java
package com.test01;
public class Sunday extends AbstractTest {
@Override
public String dayInfo() {
return "일요일";
}
}
Sunday부터 Saturday까지는 만드는 방법이 동일합니다.
(마우스를 가져다 대면 그림과 같이 Create class 버튼이 있는데 눌러서 각 요일에 맞춰서 작성해줍니다.)
MTest.java
package com.test01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test01/applicationContext.xml");
AbstractTest today = factory.getBean("singleton", AbstractTest.class);
System.out.println("오늘은 " + today.dayInfo() + " 입니다.");
}
}
applicationContext.xml
<?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="singleton" class="com.test01.AbstractTest" factory-method="getInstance"></bean>
</beans>
코드 실행결과 (코드 실행일자에 따라 다르게 출력됩니다.)
가장 먼저 abstract클래스를 살펴보면
abstract 클래스는 추상클래스로 추상클래스를 만들 때 가장 중요한것은 객체를 생성할 수 없고, 상속받은 곳에서 반드시 구현해야 한다는 것입니다.
그렇기 때문에 applicationContext의 factory-method에서 new연산자 말고 getInstance연산자를 호출해서 singleton이라는 변수를 만들어서 객체를 생성한 것 입니다.
한마디로 <bean id="singleton" class="com.test01.AbstractTest" factory-method="getInstance"></bean> 이 코드는 추상클래스에서 생성자를 만들 수 없기때문에 사용한 것 입니다.
( AbstractTest singleton = AbstractTest.getInstance와 같다. 라고 생각하시면 될것같습니다. )
스프링에서는 applicationContext에 bean으로 등록한 애들을 싱글톤 레지스트리로 만들어서 연동시켜 줍니다.
** 싱글톤 레지스트리
- 스프링이 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다.
(스프링이 빈 오브젝트는 내부적으로 싱글톤 레지스트리를 만들어서 연동한다.)
마지막으로 이 코드를 보시면
AbstractTest today = factory.getBean("singleton", AbstractTest.class);
평소와는 뭔가 다르게 쓴거같죠? 바로 형변환을 사용하지 않고 객체를 호출 했는데요
이처럼 .class를 사용하면 ~~의 클래스 타입이다 와 같은 의미의 스프링에서 지원하는 문법이다.
라고 생각하시면 됩니다
'Java > Spring' 카테고리의 다른 글
[Spring] 05. <bean> 속성 사용하기 (0) | 2021.06.18 |
---|---|
[Spring] 04. 생성된 객체 가져오기 (0) | 2021.06.16 |
[Spring] 02. bean 객체 생성하기(02) (0) | 2021.06.12 |
[Spring] 02. bean 객체 생성하기(01) (0) | 2021.06.11 |
[Spring] 01. DI / IoC 강결합 약결합 (0) | 2021.06.09 |