@Bean은 스프링 프레임워크에서 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 등록하고자 할 때 사용하는 어노테이션입니다.
@Configuration 어노테이션이 적용된 클래스의 메소드에 사용됩니다.import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public UserService userService(UserRepository userRepository) {
return new UserServiceImpl(userRepository);
}
}
@Bean: 개발자가 제어하지 못하는 외부 라이브러리를 빈으로 등록할 때 주로 사용합니다.@Component: 개발자가 직접 작성한 클래스를 빈으로 등록할 때 사용합니다.// @Bean 사용 예
@Configuration
public class AppConfig {
@Bean
public ThirdPartyService thirdPartyService() {
return new ThirdPartyService();
}
}
// @Component 사용 예
@Component
public class MyService {
// ...
}
기본적으로 메소드 이름이 빈 이름이 되지만, 직접 지정할 수도 있습니다:
@Bean(name = "mySpecialDataSource")
public DataSource dataSource() {
// ...
}
@Bean 메소드는 다른 빈을 파라미터로 받아 의존성을 주입할 수 있습니다:
@Bean
public UserService userService(UserRepository userRepository, EmailService emailService) {
return new UserServiceImpl(userRepository, emailService);
}
빈의 초기화와 소멸 시 호출될 메소드를 지정할 수 있습니다:
@Bean(initMethod = "init", destroyMethod = "cleanup")
public DatabaseConnection databaseConnection() {
return new DatabaseConnection();
}
@Conditional 어노테이션과 함께 사용하여 조건부로 빈을 등록할 수 있습니다:
@Bean
@Conditional(DataSourceCondition.class)
public DataSource dataSource() {
// ...
}
@Scope 어노테이션을 사용하여 빈의 스코프를 지정할 수 있습니다:
@Bean
@Scope("prototype")
public PrototypeBean prototypeBean() {
return new PrototypeBean();
}
@Bean으로 등록된 빈을 테스트할 때는 주로 @Configuration 클래스를 import하여 사용합니다:
@SpringBootTest
@Import(AppConfig.class)
class DataSourceTest {
@Autowired
private DataSource dataSource;
@Test
void testDataSourceConfiguration() {
assertNotNull(dataSource);
// 추가 검증 로직
}
}
@Configuration 클래스에 모아 관리하세요.@Bean 메소드가 단일 책임을 가지도록 설계하세요.@Bean 어노테이션은 스프링의 IoC 컨테이너에 의해 관리될 객체를 직접 정의하고 구성할 수 있게 해주는 강력한 도구입니다. 이를 통해 개발자는 외부 라이브러리나 복잡한 설정이 필요한 객체를 스프링의 관리 하에 둘 수 있으며, 애플리케이션의 구성을 보다 유연하고 세밀하게 제어할 수 있습니다.