티스토리 뷰

코프링으로 개발 시 마주친 bean name 충돌 관련 포스팅입니다.

개발 환경은 다음과 같습니다.

  • Spring Boot Version : 3.0.1
  • Java Version : 17
  • Kotlin Version : 1.8.21

배경

레거시 API와 분리하기 위해 API를 버저닝하기로 결정했습니다.

Repository는 같이 쓰되, Service 레이어와 Controller 레이어는 버전을 나누기로 했습니다.

다음 이미지는 Controller 레이어의 버저닝 디렉터리 예시입니다.

CafeController에서 버전만 v2로 바꾸고, 실행시켜보면 다음과 같은 에러가 발생합니다.

에러메시지를 읽어보면 BeanDefinition이 Conflict났다고 알 수 있습니다.

BeanName은 @Component이 붙은 클래스의 이름으로 짓는 게 default입니다.

그렇기 때문에 cafeController라는 BeanName이 충돌한 것이죠.

해결 방법

결론은 BeanName만 다르게 해주면 됩니다.

제가 사용한 방법은 Bean Naming 방식을 변경해주는 방법입니다.

import org.springframework.beans.factory.support.BeanDefinitionRegistry
import org.springframework.beans.factory.config.BeanDefinition
import org.springframework.beans.factory.support.BeanNameGenerator

class FullBeanNameGenerator : BeanNameGenerator {
    override fun generateBeanName(
        definition: BeanDefinition,
        registry: BeanDefinitionRegistry?
    ) = definition.beanClassName
}

위 코드는 빈 이름을 패키지까지 포함한다는 내용입니다.

그 뒤에 SpringBootApplication이 시작되는 Application 클래스로 가서 다음 코드를 추가해줍니다.

@ComponentScan(nameGenerator = FullBeanNameGenerator::class)

전체 코드는 다음과 같습니다.

package com.laboratorykkoon9.kotlinspring

import com.laboratorykkoon9.kotlinspring.config.FullBeanNameGenerator
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.ComponentScans

@SpringBootApplication
@ComponentScan(nameGenerator = FullBeanNameGenerator::class)
class CafeApiApplication

fun main(args: Array<String>) {
    runApplication<CafeApiApplication>(*args)
}

이렇게 되면 잘 실행되는 걸 볼 수 있습니다.

결론

저번 회사에서 리팩터링 작업을 진행하면서 겪었던 오류라 금방 해결할 수 있었습니다.

허나, CafeApiAppication 내 main 함수에도 FullBeanNameGenerator를 파라미터로 구성할 수 있는데, 이렇게 하게 되면 Test code에서는 동일한 BeanDefinition Conflict가 나니 주의바랍니다~!

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함