본문 바로가기
Spring

[Spring] BeanDefinitionStoreException: Failed to parse configuration class 에러 해결

by worldcenter 2024. 11. 8.

 

 

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 코드
}

 

해당 내용을 알고 있었으나 개발 과정에서 예외를 맞닥뜨리니 확실히 기억하게 되었습니다.