본문 바로가기

SpringBoot

[Spring Boot] @Configuration vs @Component

 

@Component는 주로 개발자가 작성한 코드 내에서 스프링 빈을 자동으로 등록하기 위해 사용합니다. 스프링이 클래스의 인스턴스를 자동으로 생성하고, 스프링 빈으로 관리합니다.

- @Componen에 지정을 한다면 @Bean을 사용한 메소드의 반환 값이 싱글턴을 보장해주지 못할 수 있다고 한다.

 

@Configuration은 복잡한 설정이 필요하거나 개발자의 직접적인 제어가 어려운 외부 라이브러리 등을 스프링 빈으로 등록할 때 사용합니다. 설정 클래스 내에서 @Bean 어노테이션을 사용해 개별 빈들을 정의하고 생성합니다.

- @Configuration이 붙은 클래스는 스프링의 CGLIB 프록시를 사용해서 정의했던 @Bean를 호출하면 싱글턴을 보장해준다고 한다.

 

 

빈(Bean)으로 등록하는 방법

Spring Bean이란?

- Spring에서는 Spring의 DI Contrainer에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다.

 

@Bean과 @Configuration

- TestA 클래스를 스프링 컨테이너에 등록하고자 하자

public class TestA {

}

 

이 클래스를 빈으로 등록하기 위해서는 명시적으로 설정 클래스에서 @Bean 어노테이션을 사용해 수동으로 스프링 컨테이너에 빈을 등록하는 방법이 있다. 설정 클래스는 다음과 같이 @Configuration 어노테이션을 클래스에 붙여주면 되는데, @Bean을 사용해 수동으로 빈을 등록해줄 때에는 메소드 이름으로 빈 이름이 결정된다. 

 

@Configuration
public class TestConfig {

    @Bean
    public TestA testA(){
        return new TestA();
    }
}

 

스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아서 빈을 생성해줍니다. 하지만 어떤 임의 클래스를 만들어서 @Bean 어노테이션을 붙인다고 되는 것이 아니고, @Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.

 

1. 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때

2. 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때

3. 다형성을 활용하여 여러 구현체를 등록해주어야 할 때

 

 

@Component 어노테이션

스프링에서는 특정 어노테이션이 있는 클래스를 찾아서 빈으로 등록해주는 컴포넌트 스캔 기능을 제공한다. 스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해준다. 우리가 직접 개발한 클래스를 빈으로 편리하게 등록하고자 하는 경우에는 @Component 어노테이션을 활용하면 된다.

@Component
public class TestA {

}

 

 

 

@Configuration 안에 있는 @Component에 의해 설정 클래스 역시 자동으로 빈으로 등록이 되고, 그래서 @Bean이 있는 메소드를 통해 빈을 등록해줄 수 있었던 거이다.

 

스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다. 또한 직접 개발한 클래스는 @Component를 통해 해당 클래스를 빈으로 등록함을 놀출하는 것이 좋다. 왜냐하면 해당 클래스에 있는 @Componet만 보면 해당 빈이 등록되도록 잘 설정되었는지를 바로 파악할 수 있기 때문이다. 

'SpringBoot' 카테고리의 다른 글

[Spring Boot] Validation Annotation (DTO)  (0) 2024.04.29
[Spring Boot] fetch API와 Server 데이터 서버  (0) 2024.04.29
[Spring Boot] CORS 설정하기  (0) 2024.04.28