본문 바로가기
dev/spring

[Spring Framework 6.2] Support for fallback beans

by igooo 2024. 6. 15.
728x90

개요

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에 주입된다.

 

참고