자바 안드로이드 앱개발 강좌, HTTP 통신하기

1. 서론

안드로이드 앱 개발에서 HTTP 통신은 서버와의 데이터 전송 및 수신을 위한 필수적인 요소입니다.
본 강좌에서는 자바를 사용하여 안드로이드 앱에서 HTTP 통신을 구현하는 방법에 대해 자세히 살펴보겠습니다.
RESTful API와 JSON 데이터를 사용하여 이러한 통신을 수행하는 방법을 중점적으로 다룰 것입니다.

2. HTTP 통신의 이해

HTTP(하이퍼텍스트 전송 프로토콜)는 클라이언트와 서버 간의 데이터 전송을 위한 프로토콜입니다.
클라이언트는 요청(request)을 보내고, 서버는 응답(response)을 반환합니다.
일반적인 요청 방법에 포함되는 GET, POST, PUT, DELETE와 같은 HTTP 메소드를 이해하는 것이 중요합니다.

3. 안드로이드에서 HTTP 통신 구현하기

안드로이드에서 HTTP 통신을 구현하기 위해 몇 가지 라이브러리를 사용할 수 있습니다.
그 중에서도 대표적인 라이브러리로는 HttpURLConnectionOkHttp가 있습니다.
다음은 각각의 라이브러리를 사용한 간단한 예제입니다.

3.1. HttpURLConnection 사용하기

안드로이드의 기본 API인 HttpURLConnection을 사용하여 HTTP 요청을 보내는 방법을 살펴보겠습니다.

예제 코드:

                
public class MainActivity extends AppCompatActivity {
    private static final String API_URL = "https://jsonplaceholder.typicode.com/posts";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new FetchDataTask().execute();
    }

    private class FetchDataTask extends AsyncTask {
        @Override
        protected String doInBackground(Void... voids) {
            StringBuilder result = new StringBuilder();
            try {
                URL url = new URL(API_URL);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setConnectTimeout(5000);
                urlConnection.setReadTimeout(5000);
                
                InputStream inputStream = urlConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
                reader.close();
                urlConnection.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result.toString();
        }

        @Override
        protected void onPostExecute(String result) {
            // 결과 처리 (예: UI 업데이트)
            Log.d("HTTP Response", result);
        }
    }
}
                
            

위의 코드에서는 AsyncTask를 사용하여 비동기적으로 HTTP GET 요청을 수행합니다.
요청 결과는 onPostExecute 메서드에서 처리할 수 있습니다.

3.2. OkHttp 라이브러리 사용하기

OkHttp는 효율적이고 강력한 HTTP 클라이언트 라이브러리입니다.
사용법이 간단하고 다양한 기능을 제공하여 많은 개발자들이 선호합니다.

Gradle에 OkHttp 추가하기:

                
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
                
            

예제 코드:

                
public class MainActivity extends AppCompatActivity {
    private static final String API_URL = "https://jsonplaceholder.typicode.com/posts";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(API_URL)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    Log.d("HTTP Response", responseData);
                }
            }
        });
    }
}
                
            

위 코드는 OkHttp 클라이언트를 사용하여 비동기적으로 GET 요청을 보내고 응답을 받는 과정을 보여줍니다.
enqueue() 메서드를 사용하여 비동기 요청을 수행할 수 있습니다.

4. JSON 데이터 처리하기

HTTP 요청의 응답으로 JSON 데이터를 수신하는 것이 일반적입니다.
자바에서는 org.json 패키지나 Gson 라이브러리를 사용하여 JSON 데이터를 쉽게 처리할 수 있습니다.

예제 코드 (org.json 사용하기):

                
@Override
protected void onPostExecute(String result) {
    try {
        JSONArray jsonArray = new JSONArray(result);
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String title = jsonObject.getString("title");
            Log.d("JSON Title", title);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
                
            

위 코드는 JSON 배열을 파싱하여 각 요소의 제목을 로그에 출력하는 예제입니다.

예제 코드 (Gson 사용하기):

                
implementation 'com.google.code.gson:gson:2.8.8'

@Override
protected void onPostExecute(String result) {
    Gson gson = new Gson();
    Post[] posts = gson.fromJson(result, Post[].class);
    for (Post post : posts) {
        Log.d("Gson Title", post.getTitle());
    }
}

public class Post {
    private int userId;
    private int id;
    private String title;
    private String body;

    public String getTitle() {
        return title;
    }
}
                
            

위 코드는 Gson을 사용하여 JSON 응답을 Java 객체 배열로 변환하여 제목을 출력하는 예제입니다.
Gson은 JSON 데이터와 객체 간의 변환을 간편하게 도와줍니다.

5. 에러 처리 및 최적화

HTTP 통신 시 에러가 발생할 수 있습니다. 따라서 적절한 에러 처리가 필요합니다.
사용자에게 오류 메시지를 제공하고, 다음과 같은 예외 상황을 핸들링해야 합니다:

  • 인터넷 연결이 없는 경우
  • 서버가 응답하지 않는 경우
  • JSON 파싱 오류

또한, 네트워크 성능을 최적화하기 위해 요청을 캐시하거나 배치 요청을 고려할 수 있습니다.

6. 결론

안드로이드 앱에서 HTTP 통신을 구현하는 것은 다양한 API와 데이터를 사용할 수 있는 방법입니다.
예제에서 살펴본 HttpURLConnection과 OkHttp는 각각 장단점이 있으므로, 필요에 따라 적절한 라이브러리를 선택하여 사용할 수 있습니다.
또한, JSON 처리 및 에러 처리에 대한 이해는 앱의 신뢰성을 높이는 데 중요합니다.

이번 강좌가 여러분의 안드로이드 앱 개발에 도움이 되기를 바랍니다.
추가적인 질문이나 피드백이 있다면 댓글로 남겨주시기 바랍니다.