개요
•
Spring IoC 컨테이너가 관리하는 자바 객체를 의미하며 재사용 가능한 소프트웨어 컴포넌트이다.
•
제어권이 역전되었기 때문에 객체의 생성과 관리의 권한을 스프링 프레임워크에서 위임받아 대신 처리해주는 것이다. 프로그래머는 더이상 신경쓰지 않아도 된다.
•
이처럼 Spring 프레임워크에 의해 생성, 관리되는 자바 객체를 Bean이라 하며 Bean을 얻기 위해서는 ApplicationContext.getBean()과 같은 메소드를 사용한다.
등록방법
•
자바 어노테이션을 사용하여 등록하는 방법
◦
@Component 어노테이션을 사용하는 방법이 있다.
▪
@Service, @Controller 등 우리도 모르는 사이에 Bean으로 등록이 되던 친구들을 살펴보면 다들 @Component 어노테이션을 가지고 있다.
◦
이 경우, Spring 프레임워크가 Anotation을 확인하고 자체적으로 Bean으로 등록해준다.
•
Bean Configuration File에 직접 등록하는 방법
◦
@Configuration과 @Bean 어노테이션을 사용하여 Bean을 등록할 수 있다.
◦
다음과 같이 작성하면 해당 객체는 Bean으로 등록된다.
// Hello.java
@Configuration
public class UserConfiguration {
@Bean
public UserController sampleController() {
return new SampleController();
}
}
Java
복사
범위(Scope)
•
Bean이 Spring IoC 컨테이너에 의해서 생성되고 존재하고 적용되는 범위를 의미한다.
•
스프링은 싱글톤, 프로토타입, 웹 관련 등 총 6개의 Bean Scope를 지원하며 커스텀 범위를 생성하여 사용할 수도 있다.
◦
싱글톤
▪
스프링 컨테이너 내에서 오직 하나의 인스턴스만이 공유되어 관리된다.
◦
프로토타입
▪
해당 빈에 대한 요청이 들어올 때마다 새로 생성된다.
▪
즉, 다른 빈에 주입되거나 getBean() 메소드로 호출되는 모든 순간 새로운 인스턴스가 생성되어 반환된다.
▪
다른 범위들과 달리 프로토타입 범위는 스프링 컨테이너에서 생명주기를 관리하지 않는다.
•
생성과 의존관계 주입, 초기화까지는 컨테이너에서 관리하나 생성 이후 반환된 프로토타입 범위의 빈은 더이상 관리되지 않으므로 @PreDestroy같은 종료 메소드가 호출되지 않는다.
▪
따라서 이를 사용하는 객체는 반드시 프로토타입 범위의 객체를 정리하고 해당 빈이 가진 자원을 해제해야 한다.
•
만약 싱글톤 빈에서 해당 범위의 빈을 사용하는 경우, 싱글톤 빈이 요청을 처리할 때마다 생성될 것이다.. 적절한 처리가 없다면 메모리가 나가버릴지도..
◦
웹 관련
▪
종류
•
Request
◦
HTTP 요청 수행될때까지 유지되는 스코프로 각 HTTP 요청마다 별도의 Bean 객체가 생성되고 관리된다.
•
Session
◦
HTTP Session과 생명주기를 함께하는 범위다.
•
Application
◦
ServletContext와 동일한 생명주기를 가지는 범위다.
•
WebSocketScope
◦
WebSocket과 동일한 생명주기를 가지는 범위다.
▪
이들은 싱글톤과 다르게 요청이 들어오거나 세션이 생성되는 경우에 생성된다.
•
따라서 이들이 싱글톤 빈을 사용하게되는 경우, 이슈가 생길 수 있다.
Error creating bean with name 'XXX': Scope 'request' is not active for the
current thread; consider defining a scoped proxy for this bean if you intend to
refer to it from a singleton;
Java
복사
그외
•
어떤 객체를 Bean으로 사용해야할까?
◦
제어를 맡겨야하는 객체들을 Bean으로 사용해야할 것이다.
◦
도메인 패키지 내부나 utils과 같이 POJO의 경우는 굳이 제어를 맡길 필요가 없으므로 Bean으로 생성할 필요가 없다.
◦
이들의 의존성 관리는 비즈니스 로직으로 프로그래머가 직접 담당해야 한다.
◦
빈을 등록해야한다면 객체의 생성, 의존성, 생명주기에 관리에 대한 책임을 누가 가져야하는지 고민해보자.
◦
정적 메소드의 경우도 비슷하다.