들어가기
한 이주일 정도 지났나 면접준비 때문에 오랜만에 프로젝트를 실행하니 Bean관련해서 폴더 구조를 팩토링해 특정 Controller가 Bean 중복이 되어 충돌이 생기는 문제가 발생하였으며 이때문에 Gradle을 clean하고 build했지만 여전히 안된다 쓰발.. 여러번 해줘야 하나 했는데도 아니더라요 우선 문제를 확인해 보겠다.
메인 에러에 가보면 BeanCreationException가 발생되었다는 내용과 아래에 코드와 같은 에러가 나오는 걸 확인할 수 있다.
> Task :test FAILED
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///C:/Users/sun/IdeaProjects/GB/build/reports/tests/test/index.html
* Try:
> Run with --scan to get full insights.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
For more on this, please refer to https://docs.gradle.org/8.7/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
BUILD FAILED in 23s
8 actionable tasks: 2 executed, 6 up-to-date
이걸 해석하면
> 작업 :테스트 실패
작업 ':test'를 실행하지 못했습니다.
> 실패한 테스트가 있습니다. 보고서 참조: file:///C:/Users/sun/IdeaProjects/GB/build/reports/tests/test/index.html
* Try:
> --scan으로 실행하여 전체 인사이트를 확인하세요.
이 빌드에서는 더 이상 사용되지 않는 Gradle 기능이 사용되었으므로 Gradle 9.0과 호환되지 않습니다.
'--warning-mode all'을 사용하여 개별 사용 중단 경고를 표시하고 해당 경고가 자체 스크립트 또는 플러그인에서 발생하는지 확인할 수 있습니다.
이에 대한 자세한 내용은 Gradle 문서의 https://docs.gradle.org/8.7/userguide/command_line_interface.html#sec:command_line_warnings 을 참조하세요.
23초 만에 빌드 실패
실행 가능한 작업 8개: 2개 실행 완료, 6개 최신 상태
Translated with http://www.DeepL.com/Translator (free version)
우선 build --scan을 해줘야겠다.
그럼 그렇지 실패다욧~
그럼 호환문제? 인걸로 갈고 docs를 뒤져보자... gradle 버전 문제인 것 같은 경우에는 처음이기도 하고 이게 뭐지 싶긴 하지만 지원해주는 docs를 확인해봤지만 별다를게 없었다..
그래서 그냥 clean 하고 다시 실행해보기로 하였고 실행해봤더니
1. Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'ruleController' method
2. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Ambiguous mapping. Cannot map 'ruleController' method
라는 두 애러가 눈에 띄었다. 'requestMappingHandlerMapping'이라는 이름의 빈을 생성하는 동안 오류가 발생했습니다: 모호한 매핑. 'ruleController' 메서드를 매핑할 수 없습니다. 라는 거였다.
그럼
@RequestMapping 이란?
요청방식(GET, POST, PUT, DELETE)을 지정하지 않고 URL이 일치하는 요청을 처리.
동작방식
1. Spring boot 애플리케이션이 실행되면 애플리케이션에서 사용할 Bean들을 담을 applicationContext를 생성하고 초기화 한다.
2. ApplicationContext가 refresh되는 과정에서 @RequestMapping이 붙은 Method들이 Handler에 등록이 된다.
3. 그 이후 Bean으로 등록된 것들을 RequestMapping HandlerMapping 이라는 클레스가 RequestMapping 이라는 어노테이션을 통해 요청 매핑 정보를 관리하고 요청이 왔을때 이를 처리하는 대상으로 지정하여 Adapter을 거쳐 실행하게 된다.
문제 해결
이만 본론으로 돌아와서. 이를 통해 알수 있듯이 RequestMapping도 Bean을 통해 관리되며 Mapping을 하여 처리하기에 중복에 관한 문제가 발생한 것이라고 생각하였고
문제가 발생하였던 ruleController에서 requestMapping에 대한 리소스 중복을 확인하였고 아래와 같이 수정해주었다
이후 build를 해주었더니 정상적으로 작동되는 것을 확인 할 수 있었다.