일반적으로 서버 연동 개발을 위해 로컬 호스트 아이피(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
'Android' 카테고리의 다른 글
[Android] TextView에 폰트 적용하기 (0) | 2023.09.12 |
---|---|
[Android] Intent(2) : 전달만 하는 요청 (0) | 2023.08.27 |
[Android] Intent(1) : 요구사항, 의도 (0) | 2023.08.27 |
[Android] Acticity - Life Cycle (0) | 2023.08.25 |
[Android] 프래그먼트 뷰 캡처해서 이미지로 저장하기 (0) | 2023.08.17 |