Anyway

[Spring] @Configuration 본문

Java/Spring

[Spring] @Configuration

dyana 2024. 8. 26. 17:19

[@Configuration Annotation 사용하기]

@Configuration 어노테이션은 Spring Boot에서 설정 클래스를 정의할 때 사용된다.

이 어노테이션이 붙은 클래스는 Spring의 IoC 컨테이너에서 Bean 정의를 위한 설정 정보로 사용된다. 즉, 애플리케이션의 환경 설정을 지정하거나 애플리케이션이 실행될 때 필요한 특정 Bean을 생성할 때 활용된다. 

 

1. @Configuration 어노테이션의 역할

  • Bean 정의
    @Configuration이 붙은 클래스는 Bean 어노테이션을 사용하여 스프링 Bean을 정의한다. 이 Bean들은 Spring IoC 컨테이너에 의해 관리되며 필요할 때 주입(DI)된다.
  • 환경 설정
    특정 환경에 맞게 애플리케이션의 설정을 구성하는 데 사용된다. 예를 들어 데이터베이스 연결, 외부 서비스와의 통신 설정 등을 이 클래스에서 설정할 수 있다. 

 

2. @Configuration의 사용 예시


```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("username");
        dataSource.setPassword("password");

        return dataSource;
    }
}
```

 

 

3. 동작 방식

  • @Configuration 어노테이션이 붙은 클래스는 Spring이 애플리케이션 컨텍스트를 초기화할 때 해당 클래스를 설정 클래스로 인식한다.
  • @Bean 어노테이션이 붙은 메서드가 반화하는 객체는 Spring 컨테이너에 의해 관리되며 다른 Bean에서 의존성 주입(DI)으로 사용될 수 있다. 

 

4. @Configuration을 사용할 때 고려해야 할 사항

  • Bean의 scope : 
    기본적으로 @Configuration 클래스에서 정의된 Bean은 싱글톤으로 관리된다. 즉, 한 번 생성된 빈은 Spring 컨테이너 내에서 동일한 인스턴스를 공유한다. 
  • 중복 정의 방지 :
    @Configuration 클래스는 여러 번 로드되어도 한 번만 로드된 것처럼 동작하여 중복 정의를 방지한다. Spring은 이를 위해 @Configuration 클래스의 CGLIB 프록시를 사용하여 빈이 중복 생성되지 않도록 관리한다.
  • Bean 간의 의존성 관리 :
    @Configuration 클래스 내부에서 정의된 Bean들이 서로 의존성을 가지는 경우 해당 의존성은 메서드 호출을 통해 처리할 수 있다. Spring은 이를 자동으로 처리하여 올바른 순서로 Bean을 초기화한다. 

[정리]

@Configuration 어노테이션은 Spring 애플리케이션에서 설정 클래스를 정의하는 데 사용된다.

이 어노테이션이 붙은 클래스는 Bean을 정의하고 환경 설정을 지정하는 데 사용되며, 이 클래스 내부의 @Bean 메서드를 통해 Spring 컨테이너가 관리하는 객체를 생성할 수 있다.

이러한 설정 클래스를 통해 애플리케이션이 실행될 때 필요한 다양한 설정과 Bean을 정의할 수 있다.