DeveloPiano

[Spring] @Bean, @Component, @Configuration 이란 본문

Develop/Spring

[Spring] @Bean, @Component, @Configuration 이란

DevPi 2024. 11. 7. 13:53
반응형

Spring Framework에서는 객체를 스프링 빈(Sprint Bean)으로 관리하여 의존성 주입(DI)을 통해 애플리케이션을 구성합니다. 이를 위해 다양한 어노테이션을 제공하며, 그중 대표적으로 @Bean, @Component, @Configuration 어노테이션이 있습니다. 이들은 객체를 스프링 컨테이너에 등록하고 관리하는 데 중요한 역할을 합니다. 각각의 역할과 차이점에 대해 알아보겠습니다.


1. @Component

개요

  • @Component는 클래스 수준에서 사용하는 어노테이션으로, Spring이 해당 클래스를 빈으로 자동 등록하도록 합니다.
  • 컴포넌트 스캔(Component Scan)을 통해 Spring이 @Component가 붙은 클래스를 찾아서 빈으로 생성하고 컨테이너에 등록합니다.

특징

  • @Component는 Spring이 자동으로 감지하여 관리할 수 있는 빈을 생성하는 기본적인 어노테이션입니다.
  • 컨트롤러, 서비스, 리포지토리 등 여러 계층에서 사용할 수 있습니다.
  • Spring에서 제공하는 특화된 어노테이션(@Controller, @Service, @Repository)들도 사실상 @Component의 확장판으로, 역할에 따라 더 명확하게 구분하기 위해 사용됩니다.

사용 예시

import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Component is working");
    }
}

위 코드에서 @Component는 MyComponent 클래스를 빈으로 등록하며, 의존성 주입을 통해 다른 클래스에서 사용할 수 있습니다.


2. @Bean

개요

  • @Bean은 메서드 수준에서 사용되는 어노테이션으로, 해당 메서드가 반환하는 객체를 스프링 빈으로 등록합니다.
  • 주로 Java Configuration 클래스(예: @Configuration이 붙은 클래스) 내에서 사용하며, 특정 메서드의 리턴 값을 빈으로 등록하고자 할 때 사용됩니다.

특징

  • 개발자가 직접 생성한 인스턴스를 빈으로 등록하고자 할 때 유용합니다.
  • 객체 생성 로직을 세밀하게 제어할 수 있으며, 외부 라이브러리에서 제공되는 클래스 등을 빈으로 등록하고 싶을 때도 사용할 수 있습니다.
  • @Bean을 사용해 정의된 메서드는 싱글톤으로 관리되며, 스프링 컨테이너가 한 번만 호출하여 빈을 생성합니다.

사용 예시

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }
}

위 예시에서는 myComponent라는 이름으로 MyComponent 인스턴스를 빈으로 등록합니다. 이 빈은 애플리케이션 어디서든 의존성 주입을 통해 사용할 수 있습니다.


3. @Configuration

개요

  • @Configuration은 클래스 수준에서 사용되는 어노테이션으로, 해당 클래스가 스프링 컨테이너에 의해 하나 이상의 빈을 정의하는 설정 파일임을 나타냅니다.
  • 일반적으로 @Bean 메서드들을 포함한 Java Configuration 클래스에 사용되며, 애플리케이션 컨텍스트가 이 클래스의 빈 정의를 처리할 수 있도록 합니다.

특징

  • @Configuration이 붙은 클래스 내의 @Bean 메서드는 자동으로 싱글톤으로 관리됩니다.
  • @Configuration이 붙은 클래스는 프로토타입 빈을 생성하지 않으며, 여러 번 호출해도 동일한 인스턴스를 반환하도록 설계됩니다.
  • Spring에서는 XML 기반 설정을 Java 기반으로 대체하기 위해 @Configuration을 많이 사용합니다.

사용 예시

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyComponent myComponent() {
        return new MyComponent();
    }

    @Bean
    public MyService myService() {
        return new MyService(myComponent());  // MyComponent 빈을 주입하여 생성
    }
}

위 예시에서는 @Configuration을 통해 AppConfig 클래스가 설정 클래스임을 나타내고, 내부에 정의된 @Bean 메서드들이 스프링 컨테이너에 의해 관리되도록 합니다.


@Component, @Bean, @Configuration의 차이점

어노테이션 용도 위치 설명
@Component 컴포넌트 스캔을 통해 자동으로 빈 등록 Class 기본적인 빈 정의를 위한 어노테이션으로, 특정 역할을 구체화하기 위해 @Service, @Repository와 같은 어노테이션으로 확장됩니다.
@Bean 특정 메서드의 리턴 객체를 빈으로 등록 Method 외부 라이브러리나 인스턴스화 로직이 필요한 클래스 등을 빈으로 등록할 때 주로 사용합니다.
@Configuration 자바 기반의 설정 클래스 Class 클래스 내에 여러 @Bean 메서드를 포함하여, 설정 파일처럼 사용될 때 주로 사용합니다.

언제 사용해야 할까?

  1. @Component
    • Spring이 자동으로 관리해야 하는 빈을 간단히 정의하고 싶을 때 사용합니다.
    • 주로 서비스 클래스, 리포지토리 클래스, 유틸리티 클래스 등을 정의할 때 사용됩니다.
    • 예: @Service, @Repository, @Controller
  2. @Bean
    • 외부 라이브러리의 클래스와 같이 소스 코드에 직접 수정할 수 없는 클래스를 빈으로 등록하고자 할 때 유용합니다.
    • 또는 특정 인스턴스 생성 로직이 필요할 때 사용합니다.
    • @Configuration 클래스 내에서 @Bean 메서드를 정의하여, 객체 생성의 세부 사항을 조정할 수 있습니다.
  3. @Configuration
    • 전체 애플리케이션에 대해 여러 빈을 설정하고 관리할 때 사용합니다.
    • @Bean 메서드와 함께 자주 사용되며, Java 기반 설정을 구성하는 파일로 사용됩니다.
    • Spring에서 XML 기반 설정을 대체하는 Java 설정 클래스로 유용합니다.

요약

  • @Component : 클래스 수준에서 사용하며, 스프링 컴포넌트 스캔을 통해 자동으로 빈 등록을 수행합니다.
  • @Bean : 메서드 수준에서 사용하며, 메서드가 반환하는 객체를 스프링 빈으로 등록합니다.
  • @Configuration : 클래스 수준에서 사용하며, 여러 @Bean을 포함하는 Java 설정 클래스임을 나타냅니다.

이 어노테이션들을 이해하고 적절하게 사용하면, 애플리케이션의 의존성을 효율적으로 관리하고 유지 보수성을 높일 수 있습니다.

반응형