관리 메뉴

나만을 위한 블로그

[Android, PHP, MySQL] Volley로 MySQL에서 COUNT()한 결과를 가져와 텍스트뷰에 set하는 방법 본문

Android

[Android, PHP, MySQL] Volley로 MySQL에서 COUNT()한 결과를 가져와 텍스트뷰에 set하는 방법

참깨빵위에참깨빵 2020. 10. 4. 20:25
728x90
반응형

난 레트로핏을 사용할 때 Call<List<XXX>> call의 형태를 즐겨 사용하는 편이다.

그런데 이 형태로 작업하다 보면 COUNT() 처럼 반환받는 데이터 형태가 객체 꼴이 아닌 경우가 발생한다.

그럴 때 Call<List<XXX>> call 형태를 쓰면 BEGIN 어쩌구 하는 에러가 떠서 정상 작동하지 않는다.

그럼 어떤 형태로 사용하면 좋을까?

 

방법을 찾아보다가 Volley를 사용한 방법이 있어서 이 방법을 공유하려고 한다.

 

먼저 PHP 파일은 아래와 같이 작성돼 있다고 가정한다.

 

<?php

// 변수명, 파일명 등은 각자 사정에 맞게 바꿔야 한다

header("Content-type:application/json");

require_once 'connect.php';

// ↓ 이 부분을 "쿼리에서 사용할 변수명 = $_GET['안드로이드에서 정의한 변수명']" 형태로 맞춰줘야 작동한다
$person_name = $_GET['person_name'];

$sql = mysqli_query($con, "SELECT COUNT(*) FROM 테이블명 WHERE 컬럼명 LIKE '%$person_name%'");

$response = array();

while($row = mysqli_fetch_assoc($sql))
{
    array_push($response, array(
        'num' => $row['COUNT(*)']
    ));
}

echo json_encode($response);

근본은 물 말아먹은 코드

앱에서 person_name이란 변수를 GET으로 받아서, 이 변수를 통해 쿼리를 실행한다.

그리고 그 결과를 배열에 넣어서 JSON 형태로 출력하는 간단한 예시다.

이걸 실행할 경우 포스트맨 기준으로 이렇게 출력된다.

 

COUNT()를 사용한 쿼리가 3을 토해내면서 정상 작동하는 건 확인했다. 이제 문제는 이걸 앱에서 어떻게 받아오고 set하느냐다.

방법은 간단하다. 아래와 같은 메서드를 하나 만들고 호출해주면 된다.

 

private void get_number()
    {
        String url = "http://xx.xxx.xxx.xx/파일명.php?person_name=" + person_name;
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, response -> {
            try
            {
                JSONArray jsonArray = new JSONArray(response);
                for (int i = 0; i < jsonArray.length(); i++)
                {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    String number = jsonObject.getString("num");
                    // Log.d("get_number()", "몇 명? : " + number);
                    텍스트뷰.setText(number + "명");
                }
            }
            catch (JSONException e)
            {
                e.printStackTrace();
            }
        }, error -> Toast.makeText(this, "실패함. 인터넷 연결 확인", Toast.LENGTH_SHORT).show());

        RequestQueue requestQueue = Volley.newRequestQueue(액티비티명.this);
        requestQueue.add(stringRequest);
    }

람다식 형태로 작성돼 있지만 메서드가 어떤 식으로 작동하는지 보는 데 불편함은 없을 것이다.

잘 모르는 사람을 위한 이 메서드의 작동 과정 설명은 아래에 간단하게 써놨으니 참고하자.

Volley 작동법에 대해서 설명하는 글이 아니기 때문에 몇몇 키워드에 대한 설명은 생략한다.

 

1. String url에 서버 내 PHP 파일의 경로를 인자 포함해서 String 형태로 넣어준다. person_name의 초기화 및 처리는 각자 알아서

 

2. StringRequest 객체를 만든다. PHP 파일과 똑같이 GET 방식으로 맞추고 1번에서 정의한 url을 쓸 것이다.

응답이 성공하면 try 블럭 안의 코드대로 움직이고, 에러가 발생하면 토스트를 띄운다. 내 경우 인터넷 연결이 불안하면 실패하는 경우만 봤기 때문에 저런 내용을 써 넣었다.

 

2-1. try 블럭 안에서 JSONArray를 하나 만들고 response가 들어가게 한 뒤, for문으로 이 jsonArray의 크기만큼 돌면서 JSONObject를 만든다.

그 후 getString()으로 jsonObject 중 num이란 key값을 빼서 String number에 넣는다. 이 때 3이란 숫자(Value)가 여기로 들어가며 String 변수가 된다.

 

3. RequestQueue 객체를 만들고 어떤 액티비티에서 실행할 건지 설정한 다음, 객체(requestqueue)에 2번에서 정의한 StringRequest 객체(stringRequest)를 넣어 실행한다.

 

반환받을 때부터 int가 아닌 String이 되도록 설정했기 때문에, String.valueOf()를 할 필요 없이 바로 setText()해주면 에러 없이 깔끔하게 작동한다.

반응형
Comments