Search
Duplicate
🫘

Bean

개요

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으로 생성할 필요가 없다.
이들의 의존성 관리는 비즈니스 로직으로 프로그래머가 직접 담당해야 한다.
빈을 등록해야한다면 객체의 생성, 의존성, 생명주기에 관리에 대한 책임을 누가 가져야하는지 고민해보자.
정적 메소드의 경우도 비슷하다.