Spring 빈(Bean) 등록 방법 ( XML, Annotation, Java 설정 클래스 )

반응형

https://yeo-computerclass.tistory.com/268

 

Spring 스프링 컨테이너: IoC 컨테이너

스프링 컨테이너( IoC 컨테이너 ) 스프링 컨테이너는, 어플리케이션에서 사용되는 객체들을 생성하고 관리합니다. 객체들은 스프링 컨테이너에 의해 생성되고, 컨테이너가 객체의 생명주기를 관

yeo-computerclass.tistory.com

위 내용에서 컨테이너는 BeanDefinition을 기반으로 빈을 생성하고 구성한다 하였습니다.

즉 빈을 등록하기 위해서는 BeanDefinition이라는 메타데이터를 구성해주면 됩니다. BeanDefinition이란 객체 메타데이터를 직접 생성할 수도 있지만, Spring은 XML문서, Annotation, 프로퍼티 파일과 같은 외부 리소스로 빈(Bean) 메타 정보를 작성하고 이를 어플리케이션 컨테스트가 사용할 수 있는 정보로 변환해주는 방법을 사용합니다.

 


XML 설정 파일을 사용한 등록

XML 설정 파일을 사용하여 빈을 등록하는 방법은 예전부터 사용된 기존 방식입니다. 설정 파일에 빈의 정보를 정의하고 등록하는 코드는 다음과 같습니다.

<!-- XML 설정 파일 (예: applicationContext.xml) -->
<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 id="myBean" class="com.example.MyBean"/>
</beans>
  • `id`: 빈 식별자
  • `class`: 빈의 클래스 지정
  • 필요에 따라 생성자 주입이나 프로퍼티 주입 설정해주면 됩니다.
  • 설정 정보를 담고 있는 빈은 핵심 로직과의 구분을 위해 <bean>태그 대신 네임스페이드와 전용 태그를 사용합니다.

 

 


어노테이션을 사용한 등록: @Component

Spring 2.5부터 어노테이션을 사용하여 빈을 등록할 수 있습니다.

빈으로 등록할 클래스에 어노테이션(`@Component`)을 부여해줍니다.

아래는 MyBean 클래스를 @Component 어노테이션으로 빈 등록해준 것입니다. 이러면 이제 스프링 컨테이너는 MyBean을 인식하고 필요한 곳에서 해당 빈을 주입할 수 있습니다.

@Component
public class MyBean {
    // ...
}

@Component 어노테이션은 클래스 수준에서 사용되고, 별도의 이름 속성을 지정하지 않으면 빈의 이름은 클래스 이름의 첫 글자를 소문자로 한 것으로 자동 설정됩니다. 위 MyBean 클래스는 myBean 이름의 빈으로 등록됩니다.

 

등록된 빈은 다른 빈에서 의존성 주입을 받거나 @Autowired 어노테이션을 사용하여 사용할 수 있습니다. 예를 들어 다음과 같이 MyBean을 사용하는 클래스에서 다음과 같이 의존성 주입을 받을 수 있습니다.

@Component
public class TestClass {

    @Autowired
    private MyBean myBean;
    
    // ...
}

 

컴포넌트 검색(Component Scan)을 통해 스프링 컨테이너가 자동으로 @Component 어노테이션이 부여된 클래스들을 스캔하여 빈으로 등록할 수 있습니다.

컴포넌트 검색(Component Scan)을 수행하는 방법은 다음 3가지가 있습니다.

  1. 빈 스캐너를 내장한 어플리케이션 컨텍스트를 사용하는 방법
  2. XML을 이용한 빈 스캐너 등록: `<context:component-scan>`
  3. `@ComponentScan` 어노테이션 사용하여 검색 대상 패키지를 지정하는 방법
    `@ComponentScan` 자세히보기 링크!!
<!-- XML 설정 파일 -->
<context:component-scan base-package="com.example"/>
// @ComponentScan 사용
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // ...
}

 

 

@Component 어노테이션은 일반적인 컴포넌트 역할을 하는 빈을 등록할 때 많이 사용됩니다.

@Component 어노테이션을 확장하여 특정 목적의 클래스를 빈으로 등록하기 위해도 사용합니다. 물론 이러한 특정 어노테이션들도 @Component와 동일한 방식으로 빈으로 등록됩니다. 단지 보다 명확한 의미와 추가적인 기능을 제공할 뿐입니다.

 

@Component를 확장한 어노테이션으로는 `@Controller`, `@Service`, `@Repository`이 있습니다.

스테레오타입 어노테이션들은 @Component 메타 어노테이션을 갖고 있기 때문에 빈 스캐너가 해당 어노테이션을 만날 경우 자동으로 빈을 등록해줍니다.

스테레오타입 어노테이션 적용 대상
@Repository 데이터 액세스 계층의 DAO 또는 레포지토리 클래스에 사용된다. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서도 사용된다.
@Service 서비스 계층의 클래스에 사용된다.
@Controller 프레젠테이션 계층의 MVC 컨트롤러에 사용된다. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다.

 

💡스테레오타입 어노테이션

스테레오타입 어노테이션(Stereotype Annotation)은 스프링 프레임워크에서 여러 개의 어노테이션 그룹화하여 특정 목적을 가진 빈을 등록하기 위해 사용하는 어노테이션입니다. 스테레오타입 어노테이션은 일련의 어노테이션을 하나의 애노테이션으로 간단하게 사용할 수 있도록 도와줍니다. 스테레오타입 어노테이션을 사용하여 클래스에 해당 어노테이션을 부여하면, 해당 클래스는 스프링 컨테이너에 빈으로 등록되어 관리됩니다. 또한, 스테레오타입 어노테이션은 보다 명확한 의미와 역할을 부여하여 코드의 가독성과 유지보수성을 향상시킵니다.

위 스테레오타입 어노테이션들은 @Component 메타 어노테이션을 갖고 있기 때문에 빈 스캐너가 해당 어노테이션을 만날 경우 자동으로 빈을 등록해준다.

 

 


자바 설정 클래스를 사용한 빈 등록: @Configuration & @Bean

@Configuration
public class AppConfig {

    // 빈 등록에 필요한 설정 및 메서드 정의
    
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
    
    // ... 
}
  • @Bean 어노테이션이 부여된 메서드는 하나의 빈(Bean)으로 등록되고 이때 메서드 이름이 빈의 이름이 됩니다.
  • return되는 오브젝트를 빈으로 활용합니다.

 

@Configuration & @Bean 사용하기 위한 설정

스프링 컨테이너에는 @Configuration & @Bean을 이용해 새로운 빈을 등록해주는 기능이 없습니다. 따라서 스프링 컨테이너의 기능을 확장(추가)시키기 위해 설정을 다음 설정을 추가해주어야 합니다.

 

<!-- XML 설정 -->
<context:annotation-config />

<context:annotation-config /> 태그를 추가해주면 다음 어노테이션들을 사용할 수 있습니다.

  • @Configuration / @Bean
  • @Autowired
  • @PostConstruct

 

 


자바 코드에 의한 빈 등록: 일반 빈 클래스 & @Bean 메소드

@Configuration이 붙은 클래스가 아닌 POJO 클래스에도 @Bean을 사용할 수 있습니다. 

[@Configuration클래스 & @Bean메소드]와 [POJO클래스 & @Bean메소드]의 차이점은 바로 싱글톤입니다.

여러 번 호출돼도 하나의 오브젝트만 리턴되는 것을 보장하는 싱글톤은 @Configuration 클래스 안에서 사용된 @Bean인 경우만 해당됩니다. 이에 대한 설명은 따로 포스팅하도록 하겠습니다.

 

반응형