Android에서 URL 인코딩하는 방법
웹 요청 시 URL에 공백, 한글, 특수 문자 등을 그대로 포함하면 요청이 실패하거나 잘못된 결과를 반환할 수 있습니다. 이 예제는 Java의 URLEncoder 클래스를 활용해 Android에서 URL 쿼리 문자열을 안전하게 인코딩하고, WebView로 해당 페이지를 로드하는 전체 과정을 단계별로 보여줍니다.
1단계: 새 프로젝트 생성
Android Studio에서 File ⇒ New Project로 이동한 뒤, 새 프로젝트 생성에 필요한 모든 정보를 입력하여 프로젝트를 만듭니다.
2단계: 레이아웃 파일 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다. 화면 전체를 차지하는 WebView와 하단 우측에 배치된 'Load URL' 버튼으로 구성된 간단한 레이아웃입니다.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" tools:context=".MainActivity"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/btnEncode" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Load URL" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> </RelativeLayout>
3단계: MainActivity 작성
src/MainActivity.java 파일에 다음 코드를 추가합니다. 핵심은 URLEncoder.encode("android drawables", "UTF-8") 부분입니다. 이 메서드는 검색어에 포함된 공백과 특수 문자를 URL에 사용할 수 있는 형태(예: android+drawables)로 변환해 주며, 지원되지 않는 인코딩 예외를 처리하기 위해 try-catch 블록으로 감싸야 합니다.
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class MainActivity extends AppCompatActivity {
Button button;
private WebView webView;
String strURL;
private String query;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
button = findViewById(R.id.btnEncode);
strURL = "https://stackoverflow.com/search?q=";
try {
query = URLEncoder.encode("android drawables", "UTF-8");
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
strURL += query;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
Toast.makeText(getApplicationContext(), "Page Loaded.", Toast.LENGTH_SHORT).show();
}
});
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(strURL);
}
});
}
}
4단계: 매니페스트에 인터넷 권한 추가
WebView로 외부 웹 페이지를 불러오려면 네트워크 접근 권한이 필요합니다. androidManifest.xml 파일에 아래와 같이 INTERNET 권한을 추가합니다.
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택하세요. 그러면 기기에 앱이 실행되고, 'Load URL' 버튼을 누르면 인코딩된 URL로 페이지가 로드되며, 로딩이 완료되면 "Page Loaded." 토스트 메시지가 화면에 표시됩니다.

추가 팁
- URLEncoder vs Uri.encode:
java.net.URLEncoder는 폼 데이터(application/x-www-form-urlencoded) 규칙을 따르므로 공백을 '+'로 변환합니다. URL 경로 일부를 인코딩할 때는 Android의Uri.encode()가 더 적합할 수 있습니다. - Kotlin 사용 시: 동일하게
java.net.URLEncoder.encode(query, "UTF-8")를 호출하면 되며, API 수준 33 이상에서는 charset 객체를 받는 오버로드 메서드도 사용할 수 있습니다. - JavaScript 활성화: WebView에서 웹 페이지가 정상적으로 동작하도록
setJavaScriptEnabled(true)설정을 잊지 마세요.