java.net.MalformedURLException: no protocol 'url' 로 시작하여 illegal character: '\ufeff' 로 끝나는 오류 해결 기록
개요
회사에서 프로젝트를 진행하는 중이었다.
외부api를 연결해야 했는데 뜬금없이
java.net.MalformedURLException: no protocol 'url' 로 시작하는 오류 메시지가 뜨면서 api연결이 되지 않았다.
다른 api연동시엔 전혀 문제없이 되던 것이었고 이러한 오류가 뜬 적이 없어 매우 당황스러웠다.
문제파악
바로 구글링을 해본 결과 URL 처음에 http://를 붙여야 한다는 해결 말고는 별다른 방법이 없었다.
(혹시나 호출하려는 api의 url에 http://가 빠져있다면 앞에 추가시켜보자.)
하지만 나의 케이스는 처음부터 잘 붙어 있어서 별다른 도움이 되지 못했다.
결국 url을 잘못 입력하여 난 오류라는 얘긴데, 이리보고 저리보고 3번봐도 url에는 오류가 없었다.
오류 로그를 따라가니까
최초 api호출 시 UrlConnectionManager라는 파일에서 Post방식으로 api를 호출하면,
이런식으로 정의된 메소드에서 다시 connect시키고,
connect 최초 호출 시 로 호출한 정보를 로그로 출력하는데 이 로그를 출력하자마자 catch문으로 넘어간다.
결국 아무것도 못해보고 url을 호출하자마자 오류가 난다는 소리였다.(딜레마에 빠졌다..)
여기서 뭘 어떻게 더 손을 써야할지 난감해 지는 순간이었다.
해결방법
도저히 해결 방법을 찾지 못할 것 같아 책임님께 도움을 요청하기 위해 수정한 파일을 건네 드리려던 와중에 발견했다.
전달하려는 파일이 제대로 됐는지 메모장으로 확인하려던 와중에 api의 url 앞에 이상한 문자가 찍혀 있었다.
아..분명 어디서 본 것 같은 낯이 익은 녀석이라 바로 구글링 들어갔다.
그리고 이것이 BOM 이라는 것을 알아냈다.
BOM이란?
간단하게 설명하면 문서 맨 앞에 눈에 보이지 않는 특정 바이트(byte)를 넣어 어떤 인코딩 방식으로 사용했는지 알아내는 방법이다. 메모장 같은 프로그램에서 자동으로 BOM을 집어넣어 저장한다고..
api url은 프로젝트 내에서 .properties 파일에 저장하는데 여기에 UTF-8 with BOM인 '\ufeff' 가 저장된 것이다. 그런데 이녀석이 이클립스 내에서 보이지도 않고 오류 로그에도 찍히지 않아 알기가 힘들었다.
아마도 url을 복사해서 가져오는 과정에서 바이러스처럼 BOM이 섞여들어오지 않았을까 예상해보았다.
결국 메모장에서 저녀석을 지운 url을 복사해서 가져오니까 문제는 다소 싱겁게 해결되었다.