관리 메뉴

ballqs 님의 블로그

[Spring] @Configuration 란? 본문

코딩 공부/Spring

[Spring] @Configuration 란?

ballqs 2024. 9. 14. 16:40

@Configuration 란?

Spring에서 사용되는 애노테이션 중 하나로, 빈(Bean) 정의와 의존성 주입을 수동적으로 설정할 때 사용되는 클래스에 붙입니다. Spring 애플리케이션에서 사용하는 Java 기반 설정 클래스를 정의할 때 사용되며, 주로 애플리케이션의 각종 설정을 명시적으로 관리하는 데 유용합니다.

 

정확한 의미

  • @Configuration 애노테이션이 붙은 클래스는 Spring IoC 컨테이너에서 하나의 설정 파일로 인식됩니다.
  • 이 클래스는 여러 개의 빈(Bean)을 생성하고 그 빈들이 서로 어떻게 의존하고 상호작용하는지를 설정할 수 있습니다.
  • 즉, 애플리케이션에서 사용할 객체(빈)를 생성하고, 그 객체들의 관계를 정의해주는 역할을 합니다.
@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

 

위 예시는 Redis와 관련된 설정을 @Configuration 클래스로 정의한 것입니다.

  • @Bean으로 정의된 메서드들은 Spring이 관리하는 빈이 되며, 이 빈들은 Spring IoC 컨테이너에 의해 관리됩니다.
  • redisConnectionFactory()와 redisTemplate() 메서드는 Spring 컨테이너에서 사용 가능한 Redis 관련 객체를 생성하고 관리하도록 설정한 것입니다.

왜 사용하는가?

  1. 명시적이고 수동적인 설정:
    • @Configuration을 사용하면 Java 코드로 명시적으로 설정할 수 있어서, 설정을 코드 내에서 쉽게 파악할 수 있습니다.
    • XML 기반의 설정 대신 Java 기반으로 애플리케이션의 구성 요소를 관리할 수 있습니다.
  2. 의존성 주입:
    • @Configuration 클래스에서 정의한 **빈(Bean)**들은 서로 의존성을 주입하여 사용할 수 있습니다.
    • 예를 들어, redisTemplate()은 redisConnectionFactory()에서 만든 객체를 주입받아 사용합니다.
  3. 객체의 재사용과 관리:
    • Spring 컨테이너는 @Configuration으로 정의된 빈을 하나만 생성하고 이를 재사용합니다. 이렇게 생성된 빈을 다른 클래스에서 자유롭게 주입받아 사용할 수 있습니다.

@Bean과 함께 사용

@Configuration 클래스 내에서 @Bean 애노테이션이 붙은 메서드는 Spring 컨테이너에서 관리되는 빈을 생성합니다.

  • @Bean: 이 애노테이션은 메서드에 붙어서, 해당 메서드가 반환하는 객체를 Spring 컨테이너에 빈으로 등록합니다.
  • @Bean을 사용하면 애플리케이션 실행 시 필요한 객체를 직접 생성하고, 이를 Spring이 관리할 수 있게 해줍니다.
@Bean
public JwtUtil jwtUtil() {
    return new JwtUtil("my-secret-key");
}

 

위 코드에서는 JwtUtil 객체를 생성하고, Spring 컨테이너가 이 객체를 관리할 수 있게 합니다. 이렇게 하면 다른 클래스에서 이 빈을 주입받아 사용할 수 있습니다.


실용적인 예시

1. AuthUserArgumentResolver와 같은 컴포넌트 등록

AuthUserArgumentResolver 같은 커스텀 리졸버는 Spring의 컨텍스트에 등록해서 사용합니다. 이때 @Configuration을 통해 설정할 수 있습니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthUserArgumentResolver authUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(authUserArgumentResolver);
    }
}

 

  • 여기서 WebConfig 클래스는 @Configuration을 통해 웹 애플리케이션의 설정을 관리하는 클래스입니다.
  • AuthUserArgumentResolver를 addArgumentResolvers 메서드로 등록하면, Spring MVC에서 이 리졸버를 사용하여 컨트롤러 메서드의 파라미터를 처리할 수 있습니다.

2. Redis 설정

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory());
        return template;
    }
}

위의 Redis 설정 예시에서 @Configuration과 @Bean을 통해 Redis 연결과 관련된 객체를 Spring에서 관리하도록 설정합니다. 이렇게 설정된 빈은 Spring 애플리케이션 내에서 언제든 주입받아 사용할 수 있습니다.


정리

  • @Configuration: Spring 컨테이너에 설정 클래스를 등록하여 여러 객체(빈)를 생성하고 관리하는 역할을 합니다.
  • @Bean: @Configuration 클래스 내에서 빈으로 등록할 객체를 생성할 때 사용되며, 이 빈은 Spring 컨테이너에서 관리됩니다.
  • 사용 예시: Redis 설정, 커스텀 Argument Resolver, 필터나 인터셉터 설정 등 다양한 컴포넌트를 수동으로 설정할 때 사용됩니다.