Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android에서 URL을 인코딩하는 방법 – URLEncoder로 쿼리 문자열 안전하게 처리하기

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." 토스트 메시지가 화면에 표시됩니다.

Android에서 URL을 인코딩하는 방법 – URLEncoder로 쿼리 문자열 안전하게 처리하기

추가 팁

  • 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) 설정을 잊지 마세요.