Study/spring

[Java] Spring Boot @Configuration과 @Bean 어노테이션 사용법

 

스프링 부트에서 @Configuration과 @Bean 어노테이션을 사용하는 방법에 대해 설명드리겠습니다.

스프링 부트 3 버전에서 진행되었지만, 2버전에도 적용이 가능합니다.

 

@Configuration 이란?

@Configuration은 @Bean이 정의되어있는 클래스에서 사용되는 어노테이션입니다.

스프링은 @Configuration 어노테이션이 선언되어있는 클래스에서 @Bean을 찾아서 빈으로 등록합니다.

 

스프링에서 빈(Bean)은 스프링 IoC 컨테이너에 의해 관리되는 객체를 의미합니다.

자주 사용되는 컨트롤러, 서비스, 리포지토리 객체도 어노테이션에 의해 자동으로 스프링 IoC 컨테이너에 의해 관리됩니다.

@Configuration과 @Bean 어노테이션을 사용하면 수동으로 빈을 등록할 수 있습니다.

 

일반적으로 객체를 생성할 때는 new 객체명()과 같이 객체를 생성하게 됩니다.

객체를 필요로 하는 곳에서 매번 생성하게 되면 관리가 번거롭고, 같은 내용을 가진 객체를 중복으로 생성하게 될 수도 있습니다.

스프링에 의해 빈으로 관리하게되면 빈으로 등록된 객체가 필요한 곳에서 자유롭게 가져다가 쓸 수 있게 됩니다.

 

예제

Configuration 어노테이션을 사용하기 위해 빈으로 등록할 객체를 준비합니다.

public class TestBean {

    private String name = "Test Bean Name";

    public TestBean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

빈으로 등록할 객체입니다.

생성자를 통해 이름을 주입받도록 했습니다.

 

TestBean이라는 클래스를 Bean으로 등록하겠습니다.

@Configuration
public class TestConfig {

    @Bean
    public TestBean testBean() {
        return new TestBean("Name From Config");
    }

}

@Configuration를 적용할 클래스(TestConfig)를 생성하고 내부에 TestBean을 빈으로 사용하였습니다.

 

이렇게 빈으로 등록하게되면 TestBean이라는 객체를 필요로 하는 곳에서 자유롭게 가져다가 쓸 수 있습니다.

 

빈으로 등록한 TestBean 클래스를 사용해보겠습니다.

@RestController
public class TestRestController {

    @Autowired
    private TestBean bean;

    @GetMapping("/bean")
    public String getBeanName() {
        return bean.getName();
    }
}

 

/bean API를 실행하면 TestBean에 있는 Name 값을 반환합니다.

참고로 필드에 @Autowired를 직접 사용하기보다는 생성자나 setter 방식으로 주입받는 것이 좋습니다.

 

이 상태로 스프링 부트를 실행하고 /bean API를 사용하면 다음과 같은 결과가 나옵니다.

등록한 bean 사용 결과
등록한 bean 사용 결과

TestConfig 파일에서 "Name From Config"라는 문자열을 name으로 사용하는 TestBean 객체를 빈으로 등록하였습니다.

그 빈에서 Name 값을 가져와서 API의 결과값으로 반환한 결과입니다. 

 

 

 

 

@Configuration 없이 @Bean을 사용한다면?

@Configuration 없이 @Bean을 사용하면 어떻게 되는지 확인해보겠습니다.

//@Configuration
public class TestConfig {

    @Bean
    public TestBean testBean() {
        return new TestBean("Name From Config");
    }

}

 

주석 처리 후에 스프링을 실행하면 어떻게 되는지 확인해보겠습니다.

@Configuration 없이 @Bean 사용 시 실행 실패
@Configuration 없이 @Bean 사용 시 실행 실패

실행 자체가 안됩니다.

TestBean이라는 빈이 TestRestController에서 필요한데, 찾을 수 없어서 실행이 되지 않았습니다.

그래서 설정에서 빈을 정의해야한다고 알려주고 있습니다.

 

@Configuration 없이 @Bean 등록하는 방법

@Component
public class TestConfig {

    @Bean
    public TestBean testBean() {
        return new TestBean("Name From Config");
    }

}

@Component 어노테이션과 함께 사용할 수 있습니다.

다만, @Component는 포괄적으로 사용되는 어노테이션이라서 용도를 구분하려면 용도에 맞는 어노테이션을 사용하는 것이 좋습니다.

예를 들면, 설정 파일은 @Configuration, 컨트롤러는 @Controller, 서비스는 @Service입니다.

각 어노테이션 내부에는 @Component가 선언되어 있어서 @Component와 같은 기능을 수행합니다. 

하지만 @Component와 다르게 각 기능에 특화되어있기도 해서 기능에 맞는 어노테이션을 사용하는 것이 좋습니다.

 

읽으면 좋은 글

[Java] Spring @ConfigurationProperties 어노테이션 사용법

 

[Java] Spring @ConfigurationProperties 어노테이션 사용법

스프링에서 @ConfigurationProperties 어노테이션은 외부의 값을 주입받기 위해 사용됩니다. @ConfigurationProperties로 변수 혹은 내부 객체에 매핑하는 방법에 대해 설명드리겠습니다. @ConfigurationProperties .p

priming.tistory.com

[Java] Spring @Value 어노테이션 사용법

 

[Java] Spring @Value 어노테이션 사용법

스프링의 @Value 어노테이션은 @ConfigurationProperties처럼 외부 설정 값을 가져오기 위해 사용됩니다. @ConfigurationProperties는 외부 설정 값을 객체로 매핑할 때 사용되고, @Value는 단일 값을 매핑할 때 사

priming.tistory.com

[Java] Spring @Component, @Service, @Controller 차이

 

[Java] Spring @Component, @Service, @Controller 차이

스프링에서 객체를 빈으로 등록해주는 어노테이션은 여러가지가 존재합니다. @Controller, @Service, @Component, @Repository 등의 어노테이션을 사용하는 객체는 스프링에 의해 자동으로 빈으로 등록됩니

priming.tistory.com

 

Reference

스프링 @Configuration 공식 문서