ballqs 님의 블로그
[Spring] @Configuration 란? 본문
@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 관련 객체를 생성하고 관리하도록 설정한 것입니다.
왜 사용하는가?
- 명시적이고 수동적인 설정:
- @Configuration을 사용하면 Java 코드로 명시적으로 설정할 수 있어서, 설정을 코드 내에서 쉽게 파악할 수 있습니다.
- XML 기반의 설정 대신 Java 기반으로 애플리케이션의 구성 요소를 관리할 수 있습니다.
- 의존성 주입:
- @Configuration 클래스에서 정의한 **빈(Bean)**들은 서로 의존성을 주입하여 사용할 수 있습니다.
- 예를 들어, redisTemplate()은 redisConnectionFactory()에서 만든 객체를 주입받아 사용합니다.
- 객체의 재사용과 관리:
- 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, 필터나 인터셉터 설정 등 다양한 컴포넌트를 수동으로 설정할 때 사용됩니다.
'코딩 공부 > Spring' 카테고리의 다른 글
[Spring] @TransactionalEventListener란? (0) | 2024.09.20 |
---|---|
[Spring] @Mock , @MockBean 의 차이점 (0) | 2024.09.14 |
[Spring] CORS란? (0) | 2024.09.14 |
[Spring] 테스트 코드 심화(Controller , Service) (0) | 2024.09.11 |
[Spring] AOP 동작 흐름 및 패턴 이해 (0) | 2024.09.10 |