728x90

일반적으로 서버 연동 개발을 위해 로컬 호스트 아이피(127.0.0.1)를 사용하여 로컬에서 가동중인 서버와의 통신을 시도한다.

 

하지만 이 로컬 호스트 아이피를 사용하여 아래와 같이 서버 api 호출을 요청하면 오류가 발생한다.

init{
    val gson = GsonBuilder().setLenient().create()
    val retrofit = Retrofit.Builder()
        .baseUrl("http://127.0.0.1:8080/") // 통신 오류 발생
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
    api = retrofit.create(ApiManager::class.java)
}

 

안드로이드에서 사용하는 에뮬레이터 상의 로컬호스트 주소와 내 컴퓨터의 로컬 호스트 주소가 서로 다른 것이 원인으로

다시말해 안드로이드에서 내 컴퓨터가 아닌 가상 운영체제인 에뮬레이터 안에서 작동중인 로컬 서버로의 접속을 시도하고 있기 때문에 오류가 발생하는 것이다.

따라서 안드로이드 에뮬레이터에서 내 컴퓨터의 서버를 가리키려면 기존에 사용하던 localhost 가 아닌 별도의 주소를 사용해야 하며 종류는 아래와 같다.

10.0.2.1 라우터 또는 게이트웨이 주소
10.0.2.2 호스트 루프백 인터페이스의 특수 별칭(개발 머신의 127.0.0.1)
10.0.2.3 첫 번째 DNS 서버
10.0.2.4/10.0.2.5/10.0.2.6 두 번째, 세 번째, 네 번째 DNS 서버(선택사항)
10.0.2.15 이더넷을 사용하여 연결된 경우 에뮬레이션된 기기 네트워크
10.0.2.16 Wi-Fi를 사용하여 연결된 경우 에뮬레이션된 기기 네트워크
127.0.0.1 에뮬레이션된 기기 루프백 인터페이스

 

만약 내 컴퓨터에서 작동중인 서버가 스프링 서버라면 아래와 같은 형식으로 기존 코드를 고쳐야한다.

init{
    val gson = GsonBuilder().setLenient().create()
    val retrofit = Retrofit.Builder()
        .baseUrl("http://10.0.2.2:8080/") // 개발 머신의 127.0.0.1에 해당
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
    api = retrofit.create(ApiManager::class.java)
}

 

추가로 안드로이드에서는 네트워크 통신시 허가된 아이피로의 통신만 허용하므로 res - xml - network_security_config.xml 에 해당 아이피를 추가해야 한다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
	    <!-- 개발머신의 로컬 호스트 -->
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

 

 

더 자세한 정보은 안드로이드 개발자 공식문서를 참고하길 바란다.

 

https://developer.android.com/studio/run/emulator-networking?hl=ko

 

Android Emulator 네트워킹 설정  |  Android Studio  |  Android Developers

에뮬레이터는 앱에 복잡한 모델링 및 테스트 환경을 설정하는 데 사용할 수 있는 다목적 네트워킹 기능을 제공합니다.

developer.android.com

 

+ Recent posts