티스토리 뷰
코프링으로 개발 시 마주친 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가 나니 주의바랍니다~!
'개발 노트' 카테고리의 다른 글
깃허브(Github) Main 화면에 티스토리 최근 글 목록 자동으로 업데이트 해주기 (4) | 2023.11.23 |
---|---|
[스프링+코틀린] kotest beforeSpec 테스트 격리에 대하여 (2) | 2023.11.08 |
[스프링+코틀린] Optional 코틀린스럽게 구하기 - 엘비스 연산자 (2) | 2023.10.18 |
[스프링+코틀린] kotest와 @Sql 어노테이션 같이 사용 불가 - kotest에서 통합 테스트하기 (4) | 2023.10.02 |
[스프링+코틀린] jdbcSqlSyntaxErrorException column not found (0) | 2023.09.30 |
- Total
- Today
- Yesterday
- 백준
- 디자인 패턴
- 코테
- programmers
- 프로그래머스
- Kotlin
- Algorithm
- 클린 아키텍처
- kkoon9
- C++
- 디자인패턴
- MSA
- 정규표현식
- node.js
- Spring Boot
- 이펙티브 자바
- Java
- kotest
- JPA
- Olympiad
- 이팩티브 자바
- 클린 코드
- BAEKJOON
- 객체지향
- Effective Java
- BOJ
- 알고리즘
- AWS
- 테라폼
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |