스프링 빈의 주요 속성 중 하나인
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
✔ 이 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
'Back-End > Spring' 카테고리의 다른 글
[Spring Boot] 스프링부트 JVM 충돌 해결방법 (Java Runtime Environment (JRE), 인텔리제이) (0) | 2023.07.26 |
---|---|
[Spring] 자바 스프링 AOP란?, AOP 개념 정리 (프록시, AspectJ) (0) | 2022.10.27 |
[Spring] 자바 스프링 한글 깨짐 해결 (filter) (0) | 2022.10.27 |
[Spring] 자바 스프링 프로퍼티(properties) 파일 데이터 가져오기 (0) | 2022.10.27 |
[Spring] DI(의존성 주입) @Configuration @Bean 어노테이션 사용방법 (0) | 2022.10.26 |