Java/Spring

[Spring] 03. Singleton(싱글톤)으로 객체 선언하기

담크 2021. 6. 14. 23:58

오늘은 스프링에서 싱글톤을 이용해서 객체 생성하는 방법을 알아보려고 합니다.

그렇다면 싱글톤이란 무엇인가 먼저 알아봐야겠죠?

 

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를 사용하면 ~~의 클래스 타입이다 와 같은 의미의 스프링에서 지원하는 문법이다.

라고 생각하시면 됩니다