Back-End/Spring

[Spring] 자바 스프링 Bean Scope 정리, 싱글톤 패턴 (singleton, prototype)

현기 2022. 10. 28. 17:12

스프링 빈의 주요 속성 중 하나인

scope(객체의 범위)에 대해 알아보겠습니다. 

 

<!-- A bean definition with scope-->
<bean id="..." class="..." scope="singleton"> </bean>
<bean id="..." class="..." scope="prototype"> </bean>

 


📝 Spring Bean Scope

 

⦁ 싱글톤?

스프링은 기본적으로 모든 bean을 singleton으로 생성하여 관리합니다. (기본 값이 싱글톤)

 

bean은 컨테이너에서 한 번 생성됩니다.

생성된 객체는 single beans cache에 저장되고,

해당 bean에 대한 요청과 참조가 있으면 캐시 된 객체를 반환합니다.

 

public class MainClass {
	public static void main(String[] args) {
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
		Student student1 = ctx.getBean("student", Student.class);
		System.out.println(student1.getName());
		System.out.println(student1.getAge());

		System.out.println("=======================");
		
		Student student2 = ctx.getBean("student", Student.class);
		student2.setName("홍길동");
		student2.setAge(15);
		
		//빈즈가 같기 때문에 같은 객체라고 한다.
		if(student1 == student2) {
			System.out.println("같은 객체");
		} else {
			System.out.println("다른 객체");
		}
	}
}

 

✔ 하나의 bean 객체를 getBean메서드를 통해 두 번 가져와도, 동일한 객체를 리턴합니다. 😀

 

 

⦁ Prototype

✔ 모든 요청에서 새로운 객체를 생성합니다.

    즉, Prototype 빈은 의존성이 주입 될 때 새로운 객체가 생성되어 주입됩니다.

 

 

request, session, global session

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

 이 3개의 Scope는 일반 Spring 애플리케이션이 아닌,

    Spring MVC Web 애플리케이션에서만 사용됩니다.

 



📝 싱글톤 패턴의 필요성

 

싱글톤 패턴이란 객체가 JVM 메모리 안에 하나만 있어야 하는 패턴입니다.

웹 애플리케이션에서 왜 싱글턴 패턴이 주로 사용될까요?

 

웹 사이트는 보통 여러 고객의 동시 요청이 매우 많기 때문입니다.

고객이 요청할 때마다 새로운 객체를 생성하면 그만큼

메모리 낭비가 매우 심합니다.

따라서 객체를 딱 1개만 생성하고 공유하도록 설계하는 것이 바로 싱글톤 패턴입니다.

 

✔ 스프링을 사용하지 않고 직접 자바에서 싱글톤 패턴을 구현하려면 static으로 선언하고
private 생성자를 통해 외부에서 임의로 new 키워드를 사용하지 못하도록 막는 방법이 있습니다.

 

⦁ 싱글톤으로 적합한 객체

1. 상태가 없는 공유 객체 : 상태를 가지지 않은 객체는 동기화 비용이 없다.

2. 읽기용으로만 상태를 가진 객체

3. 공유가 필요한 상태를 지닌 공유 객체

4. 쓰기가 필요하더라도, 사용 빈도가 매우 높은 객체 등

 

⦁ 프로토타입으로 적합한 객체

1. 쓰기가 가능한 상태를 지닌 객체 : 쓰기가 가능한 상태가 많아서 동기화 비용이 객체 생성 비용보다 클 경우

2. 상태가 노출되지 않은 객체 등

 


 


참고 문헌 : 

 

https://iagreebut.tistory.com/216

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html