본문 바로가기
Study/WEB

[Spring Boot] Bean 이해하기 (With Spring Container)

by Becoming a Hacker 2022. 7. 25.
반응형

Bean을 이해하기 위해서는 먼저 Spring Container(또는 IoC Container 라고 불림)에 대해 알아야 합니다.

 

Spring Container는 Spring Framework로써 객체를 생성하고 객체와 의존성을 관리하는 컨테이너 입니다. Spring에서는 Bean 객체를 관리하는 BeanFactory와 해당 컨테이너를 상속하여 보다 다양한 기능을 지원하는 ApplicationContext가 이 역할을 담당하고 있습니다.

 

그렇다면 Bean이란 무엇일까요?

 

Bean은 Spring Container에 의해 생성된 객체를 의미합니다. Bean으로 등록된 객체는 ApplicationContext.getBean() 메서드를 이용하여 어디서나 해당 객체를 사용할 수 있습니다.

 

Spring Container가 구동되어 Bean이 등록되고 사용되는 과정은 다음과 같습니다.

1. 스프링 컨테이너가 구동됨

2. 컨테이너는 스프링 설정 파일을 확인하고 Bean 객체를 생성함

3. 해당 객체를 사용할 때는 getBean() 메서드를 이용하여 호출함

4. getBean에 의해 호출되면 컨테이너는 등록된 Bean을 반환함

 

Bean을 생성하는 방법은 appication.xml 파일에 Bean을 직접 등록하는 방법과 어노테이션을 이용하는 방법이 있습니다.

 

applicaiton.xml를 이용한 Bean 등록 방법

Bean을 등록할 때마다 xml을 수정하는 것은 상당히 번거로운 작업이기 때문에 현재는 잘 사용하지 않는 방법입니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
    // Bean을 등록하는 과정
    <bean id="bookService" class="com.test.testclass.testService">
        <property name="bookRepository" ref="bookRepository"/>
    </bean>
	
    // Bean을 의존성 주입(DI)하는 과정
    <bean id="bookRepository" class="com.test.testclass.testRepository"/>
</beans>

 

어노테이션을 이용한 Bean 등록 방법

Spring Boot의 경우 @Component, @Service, @Controller, @RestController, @Repository, @Bean, @Configuration 등 다양한 어노테이션을 통하여 Bean을 등록할 수 있습니다.

 

마지막으로 다양한 어노테이션을 이용하여 Bean의 동작 과정을 추가하거나 변경할 수 있는 기능들을 정리해 보았습니다.

1. init-method (@PostConstruct)

Spring Container가 Bean을 생성한 뒤 추가로 필요한 작업을 처리하기 위해 호출하는 메서드

 

2. destroy-method (@PreDestroy)

Spring Container가 등록된 Bean을 삭제하기 이전에 필요한 작업을 처리하기 위해 호출하는 메서드

 

3. lazy-init (@Lazy)

일반적인 Bean의 경우 애플리케이션이 실행될 때 컨테이너에 의해 생성되는데, lazy-init이 설정될 경우 getBean() 메서드를 이용하여 객체가 사용될 때 생성하도록 하는 기능

 

4. scope (@Scope)

기본적으로 Bean은 Singleton Pattern을 사용하는데 이를 Prototype Pattern으로 변경할 수 있는 기능

 

 

댓글