Bean, Component와 Configuration의 차이

eunsiver·2023년 4월 27일
0

Spring boot 구현

목록 보기
8/12
post-custom-banner

Component, Configuration, Bean?

@Component

  • 개발자가 직접 작성한 클래스를 빈으로 등록하고 싶을 때 사용
  • class 단위로 지정할 수 있다.(그렇지 않으면 컴파일에러)
  • @Controller, @Service, @Repository.. 내부에 @Component가 정의되어 있다.
  • 즉, 개발자가 작성한 class를 Bean으로 만든다.

@Configuration

  • 개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정의 위한 클래스를 빈으로 등록할 때 사용
  • 1개 이상의 @Bean을 제공하는 class의 경우 @Configuration을 명시해야 한다.
  • @Configuration 내부에 @Component가 정의 되어 있으므로 별도의 개념으로 보면 안된다.

@Bean

  • 개발자가 직접 제어가 불가능한 외부 라이브러리를 사용할 때 사용한다.
  • @Configuration을 선언한 class 내부에서 사용한다.
  • 메서도 단위로 지정할 수 있다.(그렇지 않으면 컴파일에러
  • 즉, 개발자가 작성한 메서드를 통해 반환되는 객체를 Bean으로 만든다.

정리

개발자가 직접 컨트롤이 안되는 라이브러리에 class들을 Bean으로 지정하고 싶을 때는 메서드에 @Bean + @Configuration 어노테이션을 사용하고, 개발자가 직접 만든 class를 Bean으로 지정하고 싶을 때@Component 어노테이션을 사용하면 된다.

@Component
public class RedisConfig {

    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

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

}

RedisConfig를 설정하는데 오류가 발생했다.

다시 보니 class에 @Component로 설정이 되어 있었다.

개발자가 직접 컨트롤 할 수 없기에 @Configuration을 사용한다.
메서드를 Bean으로 등록하기 위해서는 @Bean 어노테이션을 사용했으며 1개 이상의 @Bean을 제공하는 class인 경우이기 때문에 @Configuration을 사용한다.

@Component를 @Configuration으로 변경하니 잘 작동하는 것을 확인할 수 있었다.

profile
Let's study!
post-custom-banner

0개의 댓글