Bean

김태훈·2024년 1월 3일
0

Spring

목록 보기
8/16

Spring에서는 Spring Container, Ioc Container라는 개념을 사용합니다.
Container는 인스턴스의 생명 주기를 관리하며, 생성된 인스터스들에거 추가적인 기능을 제공하도록 하는 것입니다.
즉, Container는 개발자가 작성한 코드의 처리 과정을 위임받은 독립적인 존재이며, 적절한 설정만 되어있다면 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤합니다.

Spring Container는 Spring Framework의 핵심부에 위치하며, 종속 객체 주입을 이용하여 Application을 구성하는 Componenet들을 관리합니다.
이 때, Spring Container에서 생성되는 객체를 Bean이라고 합니다.

Bean

Bean은 Spring IoC Container에 존재하는 객체를 말하며, DI(의존성 주입)을 통해 Bean 객체를 사용할 수 있도록 해줍니다.
Spring에서 Bean은 보통 Singleton으로 존재합니다.

  • Singleton : 어떤 Class가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴

Spring에서 POJO(Plain Old Java Object)를 Beans라고 부릅니다.

  • POJO : 자바의 장점을 살리는 특정 '기술'에 종속되어 동작하는 것이 아닌 '오래된' 방식의 '순수한' 자바객체

Beans는 Application의 핵심을 이루는 객체이며, 대부분 Container에 공급하는 설정 메타 데이터(XML 파일)에 의해 생성됩니다.
Container는 이 메타 데이터를 통해 Bean의 생성, Bean Life Cycle, Bean Dependency(종속성) 등을 알 수 있습니다.
new 연산자로 생성하는 객체는 Bean이 아니고, ApplicationContext.getBean()으로 얻어질 수 있는 객체는 Bean입니다.

즉, Spring에서의 Bean은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미합니다.

Bean의 생성 방식

Component Scanning

Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할 때 사용하는 Interface들을 LIfe Cycle Callback 이라고 합니다.

LIfe Cycle Callback 중에는 @Component이 붙어 있는 모든 Class의 Instance를 생성해 Bean으로 등록하는 작업을 수행하는 Annotation Processor가 등록 되어있습니다.

이 때, @ComponentScan 이 붙어있는 Class가 있는 package 부터 모든 하위 package의 모든 클래스를 찾아다니며 @Component가 부여된 Class를 찾아 자동으로 Bean으로 등록하여 줍니다.

  • 3Layer의 @Contoller, @Service, @Repository 등도 Bean에 등록되지만 이 Annotation들은 내부적으로 모두 @Component Annotation을 사용합니다.

@Controller를 구현한 코드

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

@Configuration @Bean

Java Class에서 @Configuration Annotation을 사용해서 직접 @Bean을 등록해주는 방법입니다.

일반적으로 xxxxConfiguration와 같이 명명하며 @Bean 을 사용해 직접 Bean을 정의하면 자동으로 Bean으로 등록됩니다.
이렇게 Bean을 직접 정의해서 등록하면 @Component Annotation을 붙이지 않아도 됩니다.

@Configuration
public class ExampleConfiguration {
    @Bean
    public ExampleController exampleController() {
        return new ExampleController;
    }
}

위의 예시에서 exampleController() 에서 리턴되는 Object ExampleController가 IoC Container 안에 Bean으로 등록되게 됩니다.

@Configuration 또한 내부적으로 @Component를 사용하기 때문에 @ComponentScan의 검색 대상이 되고 그에 따라 Bean을 정의한@Configuration이 읽힐 때, 그 안에 정의한 Bean들이 IoC Container에 등록됩니다.

Bean Scope

Spring에서 기본적으로는 모든 Bean을 Singleton으로 생성하여 관리합니다.

Singleton Bean은 Spring Container에서 한 번 생성 후, Container가 사라질 때 같이 Bean도 제거됩니다.
생성된 하나의 Instance는 Single Beans Cache에 저장되고, 해당 Bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환하며, 하나만 생성되기 때문에 동일한 것을 참조합니다.
구체적으로는 Application 구동 시 JVM 안에서 스프링이 Bean마다 하나의 객체를 생성하는 것을 의미합니다.
그래서 Spring을 통해서 Bean을 주입 받으면 언제나 주입받은 Bean은 동일한 객체라는 가정하에서 개발합니다.

reference

https://velog.io/@gillog/Spring-Bean-%EC%A0%95%EB%A6%AC

0개의 댓글