개요
Spring Framework 6.2에 추라될 기능 중 @Fallback에 대하여 알아본다.
AS-IS
Spring 컨테이너에 동일한 유형의 Bean이 여러개가 있고, autowited에 사용할 Bean을 경정하는 경우 @Primary 어노테이션 추가가 필요하다.
interface UserRepository {
String findNameById(String id);
}
class MysqlUserRepository implements UserRepository {
@Override
public String findNameById(String id) {
return "mysql " + id;
}
}
class MongoUserRepository implements UserRepository {
@Override
public String findNameById(String id) {
return "mongo" + id;
}
}
class UserService {
private static final Logger logger = LoggerFactory-getLogger (UserService.class);
private final UserRepository userRepository;
UserService (UserRepository userRepository) {
this.userRepository = userRepository;
logger. info("UserRepository " + userRepository);
}
public String findNameById(String id) {
return this.userRepository.findNameById(id);
}
}
@Configuration
class Appconfig {
@Bean
UserService userService (UserRepository userRepository) {
return new UserService (userRepository);
}
@Primary
@Bean
MysqlUserRepository mysqlUserRepository () {
return new MysqlUserRepository();
}
@Bean
MongoUserRepository mongoUserRepository () {
return new MongoUserRepository();
}
}
UserRepository 인터페이스를 구현한 MysqlUserRepository, MongoUserRepository가 있고 UserService에서는 UserRepository 타입의 객체를 생성자로 주입한다. 위 예제에서는 MysqlUserRepository 객체가 UserService에 생성자로 주입된다.
Bean 생성시 기존에는 동일한 타입의 객체가 있는경우 @Primary 어노테이션이 있는 Bean 객체를 우선하여 사용한다.
@Primary 어노테이션을 사용하지 않으면 Parameter e of method userservice in
org. igooo. spring . fallback.Appconfig required a single bean, but 2 were found: 오류가 밸생한다.
TO-BE
@Configuration
class Appconfig {
@Bean
UserService userService (UserRepository userRepository) {
return new UserService (userRepository);
}
@Bean
MysqlUserRepository mysqlUserRepository () {
return new MysqlUserRepository();
}
@Bean
@Fallback
MongoUserRepository mongoUserRepository () {
return new MongoUserRepository();
}
}
@Fallback 어노테이션을 사용하는 경우 UserRepository Bean이 정의되어 있지 않으면 MongoUserRepository가 사용된다. 위 예제를 그냥 실행하면 UserService 객체에 MysqlUserRepository 객체가 주입되고, 8라인에(MysqlUserRepository) @Bean을 주석처리하는 경우 MongouserRepository 가 UserService에 주입된다.
참고
- https://spring.io/blog/2024/04/11/spring-framework-6-2-0-m1-all-the-little-things
- https://blog.igooo.org/125
'dev > spring' 카테고리의 다른 글
Spring Boot Application Caching (0) | 2024.06.24 |
---|---|
Spring - Modulith - Working with Applicaton Events (0) | 2024.06.21 |
[Spring Framework 6.2] Bean Background Initialization (0) | 2024.06.13 |
Hello, Java 22! (0) | 2024.06.09 |
[Spring] Spring Framework CDS(Class Data Sharing) (Project Leyden) (0) | 2024.06.06 |