웹 개발/error

[error/spring] BeanCreation, BeanDefinition 에러

dani0312 2024. 3. 24. 23:47

spring 공부를 진행하다가 빈 관련된 에러 두 가지를 마주치고 해결했던 것을 정리해보고자 한다.

 

1. BeanDefinition 에러

✔️Background

A디렉터리에서 작업하던 것을 그대로 B디렉터리에 복붙해오면서 작업하며 발생하게 된 에러이다. 컨트롤러, 서비스, 레포지토리 등을 복붙해와서 리팩토링을 하였기 때문이다. 스프링 빈은 유일해야 하는데 이름이 같기 때문에 빈 정의 오류가 발생한다. 

 

 

✔️해결과정

● A컨트롤러, A컨트롤러 → A컨트롤러, B컨트롤러

 

컨트롤러를 예로 든다면 A컨트롤러와 같이 동일한 이름의 컨트롤러가 2개 이상 존재하면 안된다. 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤(Singleton)으로 등록한다.

 

싱글톤 방식은 유일하게 하나만 등록해서 공유한다. 특별한 경우를 제외하면 대부분 싱글톤을 사용한다. 따라서 스프링 빈은 유일해야하는데, 같은 이름의 컨트롤러를 2개 선언하여 에러가 발생한 것이다. 하나의 컨트롤러의 이름을 변경하여 빈 정의 에러를 해결하였다. 이 에러의 대표적인 에러 원인은 다음과 같다고 한다.

 

 

✔️ BeanDefinition 주요 에러 원인

 

1. 빈 이름 충돌

: Spring 컨테이너에 같은 이름의 빈이 여러 개 등록되어 있을 때 발생할 수 있다. 

2. 의존성 주입 문제

: 빈이 필요로 하는 의존성을 주입할 때, 주입할 빈이 존재하지 않거나, 여러 개의 빈이 존재할 때 발생할 수 있다. `@Autowired`, `@Inject` 등을 사용하여 의존성을 주입할 때 발생할 수 있다.

3. 빈 설정 오류

: 빈의 설정이 올바르지 않아서 발생할 수 있다. 예를 들어, 필수 속성이 빠져 있거나, 잘못된 속성 값이 설정되어 있는 경우 발생할 수 있다. 

 

 




2. BeanCreation 에러

✔️Background

BeanDefinition 에러를 한 번 맞닥뜨리고 이를 해결하여 같은 이름의 컨트롤러, 서비스 등은 없는데 왜 BeanCreation에러가 날까? 생각을 해보면서 코드를 곰곰히 보았다. 

 

● A컨트롤러, A컨트롤러 → A컨트롤러, B컨트롤러

 

앞서 Bean Definition 오류를 위와 같이 해결하였는데, 컨트롤러의 api가 같은 path를 가지고 있었다. 그러니까, A컨트롤러의 path와 http메서드 이 2가지와 동일한 API가 B컨트롤러에도 존재하는 것이다. 마치 아래와 같은 상황이다.

 

 

 

두 API는 같은 HTTP method, 같은 PATH를 가지고 있다. PATH가 다른 것이 직접적인 원인은 아니지만, 이것으로 컨트롤러 충돌이 발생해 BeanCreation에러가 발생할 수 있다고 한다.

 

test() : GET /add

test2(): GET /add

 

 

✔️해결과정

두 개 이상의 컨트롤러 클래스가 동일한 API 경로를 매핑하는 경우 충돌이 발생하고, 이로 인해 빈이 생성되는 과정에서 충돌이 발생할 수 있다고 한다.

 

중복된 path를 다르게 설정해주어야한다. 두 메서드의 위치가 각각 다른 컨트롤러에 있었기 때문에 @RequestMapping부분에 /v1,/v2과 같이 구분을 해주어 다르게 path를 다르게 해주었다.

 

@RequestMapping 부분을 반드시 변경해주어야 하는 것은 아니고  각 메서드의 path를 변경해도 된다. 궁극적으로 path를 유니크하게 설정하여 각각의 API를 생성하는 것이 목적이다. 참고로, @RequestMapping를 자체를 사용하지 않고 개발하는 경우도 역시나 메서드의 path를 변경해주면 구별될 것이다. (이 어노테이션의 사용유무는 개발자의 취향이라고 한다.)

 

 

✔️ BeanCreation 에러

이 오류는 다양한 원인으로 발생할 수 있지만, 일반적인 원인 몇 가지는 아래와 같다고 한다. 

 

1. 의존성 주입 문제

: Spring이 빈을 생성하거나 초기화하는 동안 해당 빈이 필요로 하는 의존성을 주입하는데 실패할 경우 발생할 수 있다.

2. 빈 생성 시 예외 발생:

빈의 생성자나 초기화 메서드 중 하나에서 예외가 발생할 경우 BeanCreation에러가 발생할 수 있다. 빈이 필요한 자원을 초기화하는 중에 예외가 발생하여 빈의 생성이 중단되는 경우 발생할 수 있다.

3. 빈 구성 오류:

빈의 설정이 올바르지 않거나, 빈을 생성할 때 필요한 속성이 빠져있는 경우 발생할 수 있다. 

 


 

BeanCreation에러의 경우, 사실 내가 해결한 방법도 위의 에러원인에 해당하지 않는다. 그러나 이 글을 찾아오는 분들과 다음에 이 에러를 마주했을 경우 위의 경우에 해당할 수 있기 때문에 정리하였다.

 

이번 케이스의 경우 에러의 원인을 찾기 위해 검색부터 했으면 해결하는데 더 오래 걸렸을 것이다. (대표적인 에러 원인에 해당하지 않기 때문에🥲) 검색하기 전에 우선 내가 작성한 코드를 먼저 살펴보는 것이 좋은 듯 하다. 



 

 

 

 


Reference
스프링 빈과 컨테이너, 그리고 의존관계

Bean 등록 및 의존 관계 설정하기

chatgpt