Spring Bean 충돌
배달 서비스 개발 시 사업자와 이용자가 이용하는 기능이 다르기 때문에 다음과 같이 패키지를 나누어서 개발을 진행하였습니다.
├─common
│ ├─config
│ ├─entity
│ ├─enums
│ ├─exception
│ ├─security
│ └─util
└─domain
├─customer -> 장재혁, 박가온누리
│ ├─controller
│ ├─dto
│ ├─repository
│ └─service
├─member -> 김동주
│ ├─controller
│ ├─dto
│ ├─repository
│ └─service
└─seller -> 이은영, 백현욱
├─controller
├─dto
├─repository
└─service
이 때 Seller와 Customer 패키지 안에 클래스 명들이 서로 동일하게 개발을 진행하였고 dev 브랜치에서 Merge를 진행한 뒤 통합 테스트를 위해 실행을 하니 다음과 같은 에러가 발생했습니다.
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.musubi.teammusubi.TeamMusubiApplication]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179) ~[spring-context-6.1.14.jar:6.1.14]
Spring은 기본적으로 클래스 이름을 기준으로 Bean 이름을 자동 설정하는데, 두 클래스 모두 동일한 클래스 이름을 가지다 보니 중복된 Bean 이름이 충돌이 일어난 것입니다.
이를 해결하는 방법이 2가지가 존재합니다.
1. 동일한 Class 이름 변경
2. Bean 이름을 명시적으로 지정하기
@Component 나 @RestController 어노테이션에 빈 이름을 직접 지정하여 클래스를 구분할 수 있습니다.
@RestController("sellerMenuController")
public class MenuController {
// 판매자용 MenuController 코드
}
@RestController("customerMenuController")
public class MenuController {
// 고객용 MenuController 코드
}
해당 내용을 알고 있었으나 개발 과정에서 예외를 맞닥뜨리니 확실히 기억하게 되었습니다.
'Spring' 카테고리의 다른 글
[Spring] Servlet Container와 Servlet의 관계 (1) | 2024.11.10 |
---|---|
[Spring] LazyInitializationException 해결 방법 (3) | 2024.11.08 |
[Spring] 일정관리 앱 코드 Fix (1) | 2024.10.30 |
[Spring] a foreign key constraint fails 에러 발생 (0) | 2024.10.17 |
[Spring] Ambiguous handler methods mapped 에러 해결 (1) | 2024.10.04 |