스프링 부트에서 @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를 사용하면 다음과 같은 결과가 나옵니다.
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");
}
}
주석 처리 후에 스프링을 실행하면 어떻게 되는지 확인해보겠습니다.
실행 자체가 안됩니다.
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 @Value 어노테이션 사용법
[Java] Spring @Component, @Service, @Controller 차이