본문 바로가기
Develop/Spring

Spring Bean Scope

by 코딩의성지 2021. 11. 2.

일반적으로 Spring Bean은 xml 파일에 정의 된다.

Spring bean 속성에는

- class : 정규화된 자바 클래스 명

- id : bean의 고유 식별자

- scope : 객체의 범위

- constructor-arg : 생성될 때  생성자에 전달될 인수

- property : 생성될 때 setter에 전달될 인수

- init-method : 초기화 메서드

- destory-method : 소멸 메서드

 

오늘 이 많은 속성 중에 scope에 대해 좀 자세하게 정리해두려고 한다.

 

스프링의 scope는 singleton, prototype, request, session, global session 이렇게 다섯 종류가 있다.

scope Description
singletone 하나의 빈 정의에 대해 IoC 컨테이너 내에 하나의 객체만 존재함.
prototype 하나의 빈 정의에 대해 다수의 객체가 존재할수 있음
request 하나의 빈 정의에 대해 하나의 HTTP request 생명주기 안에서는 단 하나의 객체만 존재
각각의 HTTP request 는 각각 자신만의 객체를 가짐
Web-aware Spring ApplicationContext 안에서만 유효함
session 하나의 빈 정의에 대해 하나의 HTTP Session 생명주기 안에서는 단 하나의 객체만 존재
Web-aware Spring ApplicationContext 안에서만 유효함
global session 하나의 빈 정의에 대해 하나의 global HTTP Session 생명주기 안에 단 하나의 객체만 존재
보통 portlet context 안에서 유효하고 Web-aware Spring ApplicationContext 안에서만 유효함

여기서 singletone과 prototype의 차이는 아는것이 좋다. 한번 알아보자.

 

1. singleton

singleton 빈은 컨테이너에서 딱 한번 생성된다. 컨테이너가 사라지면 빈도 없어진다.

생성된 하나의 인스턴스는 single beans cache에 저장되고 이 빈에 요청이나 참조가 있으면 캐시에서 객체를 반환한다. 각 요청과 참조는 동일한 빈에 대한 것이다. 만약 여러분이 scope를 따로 명시하지 않으면 이 singleton 으로 설정된다.

 

 

보통 언제 쓰냐면 읽기전용의 객체나 반드시 상태가 공유되어야하는 객체, 혹은 상태가 없는 객체 등에서 사용을한다. 다만 쓰기라도 사용빈도가 높다면 동기화비용을 감수하고 싱글톤을 사용해도 괜찮다. (보통 객체 생성 비용 > 쓰기 비용 일때 사용)

설정은 xml 상에서 하는 방법 과 어노테이션으로 설정하는 방법이 있다.

<bean id = "..." class = "..." scope="singleton"/>
@Scope("singleton")

 

2. prototype

prototype 빈은 모든 요청에서 새로운 객체를 생성한다. 즉 의존 관계 빈에 주입이 될때마다 새로운 객체가 생성되어 주입되는 것이다. 생성된 bean 은 gc 에 의해 소멸된다.

 

 

프로토 타입은 보통 쓰기가 가능한 객체 (동기화 비용 > 객체생성 비용 일 경우 사용), 상태가 노출되지 않는 객체 등에서 사용한다.

설정은 xml상에서 하는 방법 과 어노테이션으로 설정이 가능하다.

<bean id = "..." class = "..." scope="prototype"/>
@Scope("prototype")

 

 

 

반응형

댓글