안드로이드 스튜디오의 에뮬레이터에서 로컬에서 실행 중인 Spring Boot 서버로 REST API 요청을 보낼려고 한다. 하지만 안드로이드 스튜디오 에뮬레이터에서
localhost또는127.0.0.1로 요청을 보내면 실패한다. 이유와 해결 방법을 정리한다.
에뮬레이터에서 다음 주소로 요청하면:
http://localhost:9000
http://127.0.0.1:9000
에뮬레이터 내부에서는 이것을 본인(에뮬레이터 디바이스 자체) 로 해석한다.
Mac 또는 개발 PC의 Spring Boot 서버가 아닌, 디바이스 내부를 바라본다는 뜻이다.
따라서 아래와 같은 오류가 발생한다.
Failed to connect to localhost/127.0.0.1:9000
에뮬레이터는 개발 PC를 직접 인식하지 못하기 때문에 다른 접근 방식이 필요하다.
에뮬레이터가 개발 PC의 localhost로 접속하기 위해 제공되는 특별 주소가 있다.
10.0.2.2
Android Emulator에서 이 주소는 개발 PC의 localhost를 의미한다.
따라서 Retrofit 또는 OkHttp의 baseUrl을 다음과 같이 변경해야 한다.
http://10.0.2.2:9000/
포트 번호는 개발 PC에서 Spring Boot가 실행 중인 포트를 그대로 사용하면 된다.
Retrofit.Builder()
.baseUrl("http://10.0.2.2:9000/")
.addConverterFactory(GsonConverterFactory.create())
.build()
이렇게 수정하면 에뮬레이터에서 로컬 서버로 정상적으로 API 요청이 전송된다.
안드로이드 에뮬레이터의 localhost는 PC가 아닌 에뮬레이터 자신의 주소이므로 동작하지 않는다.
반드시 10.0.2.2 를 사용해야 한다.