인프런의 토비의 스프링부트 강의를 수강하던 중 ApplicationContext에 빈 등록하는 과정이 Java와 Kotlin이 달라 혹시나 같은 에러 상황을 맞이하시는 분들을 위해 저의 해결 과정을 공유합니다.
GenericApplicationContext
의 registerBean
함수에 대해서 주입하려는 빈 객체의 생성자 인자가 없는 경우 beanClass
파라미터 1개만이 인자로 전달되게 됩니다. 이 경우에서 코틀린 컴파일러가 아래의 2가지 함수 중 하나를 선정하지 못하는 컴파일 에러가 발생하였습니다.
registerBean(beanClass: Class<TypeVariable(T)!>, vararg constructorArgs: Any!): Unit
registerBean(beanClass: Class<TypeVariable(T)!>, vararg customizers: BeanDefinitionCustomizer!)
저는 이것이 코틀린 컴파일러의 문제라고 생각하였습니다. 그래서 이를 해결하기 위해 customizers
파라미터의 타입인 BeanDefinitionCustomizer
를 람다 형식으로 정의해주어 컴파일러가 위 2번 함수를 사용하도록 강제하였습니다.
하지만 이게 좋은 방식이라고 생각하지 않아서 정확한 방식을 찾아보았습니다.
공식 문서를 찾아보니 코틀린의 경우 registerBean
이 확장함수로 재정의 되어 있었습니다. 이를 이용하여 정상적으로 빈을 등록할 수 있었습니다. (사진 및 링크 참고)
관련 링크 : https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/spring-framework-reference/kotlin.html