Spring Framework/SpringBoot

java.lang.IllegalStateException: Ambiguous handler methods mapped for '/favicon.ico':

Razelo 2022. 1. 24. 21:28

illegalStaeException 은 여러번 본적이 있지만 /favicon.ico는 뭘까? 

 

배포중에 문제가 생겨 다시 로컬에서 부트를 띄우던 도중에 갑자기 위와 같은 에러가 발생했다. 

 

사실 이전에 restapi 들의 경로를 바꿔주었던 작업에서 계속 작은 문제들이 잇따라 발생했는데 혹시 거기서 또 뭔가 발생하지 않았나 짐작하긴했었다. 

 

결론부터 말하면 맞다. Controller의 경로가 중복되었을때 발생하는 고질적인 문제이다. 꼭 경로가 중복된 상황에서만 발생하는게 아니라 이외의 상황에서도 발생할 수 있는 에러이긴 하다. 

 

그런데 신기한 점은 Ambiguous하다는 로그에 있다. 왜 모호하다는 표현을 썼을까?  

 

위의 두 사진을 보면 api의 mapping에서 한군데는 filename이라고 되어있고 한군데는 nickname이라고 되어있다. 나는 이것이 어찌되었든 PathVariable로 받든 뭐로받든 어잿든 명칭 자체가 다르게 되어있기에 문제가 될 소지가 없을 것이라고 생각했다. 그런데 에러 로그에 뜬 Ambiguous하다는 말을 곰곰히 생각해보면 정말 애매모호하게 해석될 여지가 있기에 IllegalStateException이 뜨는게 당연할 수 있겠다라는걸 알 수 있다. 

 

즉 바로 이전 포스트에 언급했듯이 @PathVariable과 @RequestParam에서 @RequestParam의 경우 특정 조건을 충족하는 무언가를 정렬 혹은 조회하기위해 사용하고 @PathVariable같은 경우는 리소스를 가져오겠다고 말할때 쓰는 것이 좋다고 했다. 

 

그러니 위의 {nickname}은 특정 값으로 전달될 것이고 마찬가지로 {filename}도 특정 값으로 전달된다면 어떤 값이 올지 모르는 (어떤 값이 올지 모르겠다기 보다는 얘가 뭔지 의미 자체를 스마트하게 알지 못하기 때문에라고 보는게 좀더 정확하겠다. Controller는 사람이 아니니까. ) spring 입장에서는 얘가 어느 Controller의 것인지 알기 애매모호하다는 뜻으로 해석할 수 있는 것이다. 

 

그래서 Ambiguous하다는 로그가 뜨지 않았나 싶다. 

 

그런데 한가지 아쉬운 점은 class위에 RestController로 경로를 이미 선언해줬는데 이 어노테이션에 기입된 경로까지 읽어서 좀더 스마트하게 판별하지 못한 점이 아쉽다. 당연히 RestController에 경로가 다르니 얘네는 다른 애들이구나 라고 스마트하게 판별하길 원했다. 만능은 아닌가보다. 아니면 내가 사용법을 조금 잘못알고 있거나 둘중 하나이다. 

 

내가 모르는 기능이 있거나 주의사항을 어겼구나 중 하나인것 같은데 이부분에 대해 조금 더 살펴봐야겠다. 

 

 

 

반응형