1. Spring Bean이란
Spring에서 POJO(Plain, old java object)를 bean이라 부른다
Spring은 자바 객체를 쉽게 관리할 수 있도록 Spring IoC 컨테이너에 등록하여 사용하는데,
이때 등록된 자바 객체를 bean이라고 한다.
- Bean은 애플리케이션의 핵심을 이루는 객체이며, Spring IoC(Inversion of Control) 컨테이너에 의해 인스턴스화, 관리, 생성된다.
- Bean은 우리가 컨테이너에 공급하는 설정 메타 데이터(XML 파일)에 의해 생성된다.
- 컨테이너는 이 메타 데이터를 통해 Bean 생성, Bean Life Cycle, Bean Dependency 등을 알 수 있다.
- 애플리케이션의 객체가 지정되면 해당 객체는 getBean() 메서드를 통해 가져올 수 있다.
Bean 주요 속성
- class(필수): 정규화된 자바 클래스 이름
- id: bean의 고유 식별자
- scope: 객체의 범위 (sigleton, prototype)
- constructor-arg: 생성 시 생성자에 전달할 인수
- property: 생성 시 bean setter에 전달할 인수
- init method와 destroy method
2. Scope
스프링은 기본적으로 모든 bean을 singleton으로 생성하여 관리
Spring Scope란?
스프링은 빈이라는 개념으로 자바객체를 만들고 싱글톤화 시켜 관리하여 줍니다.
이 객체들은 스프링 IoC 컨테이너의 의해 생성되고 소멸되는 등의 관리가 이루어 집니다.
이때 bean이 관리되는 범위
를 Bean scope
라고 합니다.
여기서 bean이 싱글턴화 되서 관리되는 이유는 spring bean의 기본 scope 전략이 Singleton 이기 때문입니다.
Spring Scope 종류
- 싱글톤: 스프링은 기본적으로 bean 등록시 따로 설정을 하지 않았다면 싱글턴으로 등록
- 애플리케이션 구동시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미
- 그래서 개발자는 스프링을 통해서 제공받은 bean은 언제나 동일한 객체라는 가정하에 개발하는 것
- 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
- @Component, @Configuration + @bean의 조합으로 등록된 bean들의 기본 scope이다.
- 프로토타입(prototype):
- 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
- 프로토타입을 받은 클라이언트가 객체를 관리하여 준다.
- 웹 관련 스코프: request, session, global session의 Scope는 일반 spring 어플리케이션이 아닌 SpringMVC Web Application에서만 사용된다.(웹환경에서만 동작하는 스코프)
- request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
- session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
- application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
1) Singleton
: 싱글톤 bean은 spring 컨테이너에서 한 번 생성된다
컨테이너가 사라질 때 bean도 제거된다.
- 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 빈을 반환한다.
- 컨테이너 생성 시점에 같이 생성되고 초기화
@Component
@Scope(value = "Singleton")
public class Singleton {
}
2) Prototype
- 프로토타입 스코프의 빈을 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다
- 스프링 컨테이너에서 빈을 조회할 때 생성되고 초기화 메서드도 실행
@Component
@Scope(value = "prototype")
public class ProtoType {
}
스코프 사용시 주의점
- 스코프마다 동작 방법이 다르므로 주의해서 사용해야 한다.
- 특별한 scope는 꼭 필요한 곳에만 최소화해서 사용하자, 무분별하게 사용하면 유지보수하기 어려워 진다
- Spring의 Bean은 별다른 설정이 없으면 Singleton Scope로 생성된다. 특정 타입의 Bean을 하나만 만들어 두고 공유해서 사용하기 위해서인데, 이러한 까닭에 Bean에 상태를 저장하는 코드를 작성하는 것은 동시성 문제를 유별하여 위험한 상황을 초래할 수 있다. 하지만 요구사항과 구현 기능 등의 필요에 따라서 비싱글톤이 필요한 경우도 많다. 그리고 이를 명시적으로 구분하기 위해서 scope라는 키워드를 제공한다.
Bean Scope와 종류에 대해 아는 만큼 설명해주세요.
Bean Scope
스프링은 빈이라는 개념으로 자바객체를 만들고 싱글톤화 시켜 관리해줍니다.
이 객체들은 스프링 IoC 컨테이너의 의해 생성되고 소멸되는 등의 관리가 이루어지는데
이때 bean이 관리되는 범위
를 Bean scope
라고 합니다.
bean이 싱글턴화 되서 관리되는 이유는 spring bean의 기본 scope 전략이 Singleton 이기 때문입니다.
Scope의 종류
- 싱글톤: 스프링은 기본적으로 bean 등록시 따로 설정을 하지 않았다면 싱글턴으로 등록
- 애플리케이션 구동시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미
- 그래서 개발자는 스프링을 통해서 제공받은 bean은 언제나 동일한 객체라는 가정하에 개발하는 것
- 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
- @Component, @Configuration + @bean의 조합으로 등록된 bean들의 기본 scope이다.
- 프로토타입(prototype):
- 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.
- 프로토타입을 받은 클라이언트가 객체를 관리하여 준다.
- 웹 관련 스코프: request, session, global session의 Scope는 일반 spring 어플리케이션이 아닌 SpringMVC Web Application에서만 사용된다.(웹환경에서만 동작하는 스코프)
- request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
- session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
- application : 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
참고