💻 Android

[Android/MySQL] 안드로이드에서 JDBC 사용하기

2022. 11. 8. 18:00

데이터베이스 텀 프로젝트에서 트위터 클론 코딩을 진행한다.

1) ERD 설계 2) JDBC 구현 3) GUI 구현의 순으로 진행하는데, 

우리는 GUI를 안드로이드로 구현하고자 했다! (Java Swing으로 해도 되는데... 어 음 어 사정이 길다)

암튼... 이 방법이 권고되지 않는 방법이기도 하고 앞으로는 절대 쓸 일이 없기는 하겠지만...

내 거의 3-4시간 가량의 삽질이 아까워서 글로 남긴다.

 

[방법 1] Android MySQL Connector 라이브러리 사용

열심히 구글링을 하니까 Android에서 MySQL을 사용할 수 있는 라이브러리가 나왔다.

https://github.com/BoardiesITSolutions/Android-MySQL-Connector

 

GitHub - BoardiesITSolutions/Android-MySQL-Connector: Native MySQL Connector for Android

Native MySQL Connector for Android. Contribute to BoardiesITSolutions/Android-MySQL-Connector development by creating an account on GitHub.

github.com

 

사용방법은 깃허브에 잘 나와 있으니,,, 잘 보길 바란다.

내가 겪었던 오류는 이놈이다... 리드미에 있는 그대로 gradle에 추가했는데 이런 오류가 생겼고, 두 가지를 수정해서 해당 문제를 해결했다. 

Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':app:debugCompileClasspath'.

1. setting.gradle에 maven~~ 코드 추가

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url 'https://jitpack.io' } //여기!
        google()
        mavenCentral()
    }
}

2. gradle(App)에 TAG가 아닌 최신 버전 넣어서 추가

 // Android MYSQL Connector
 implementation 'com.github.BoardiesITSolutions:Android-MySQL-Connector:0.49_MySQL8'

 

이렇게 하면 위 오류는 해결되고, 나머지를 리드미 읽고 고대로 따라하면 될 것 같다.

하지만 이 방법은 JDBC를 이용해서 구현해야 하는 우리 텀프로젝트의 성격과 맞지 않아 접고... 

다시 또 오랜 삽질을 하러 떠났다. 

 

[방법2] Android Project에 mysql-connector 라이브러리 추가

이클립스에서 하는 것과 동일한 방법으로 하고자 하였고, 나는 아주 좋은 예시 코드를 찾았다. 

https://github.com/wynsryd/android-mysql-example/blob/main/app/src/main/java/org/kodejava/android/MainActivity.java

 

GitHub - wynsryd/android-mysql-example: Access MySQL Database from Android

Access MySQL Database from Android. Contribute to wynsryd/android-mysql-example development by creating an account on GitHub.

github.com

 

물론 이걸 그대로 따라 하기만 하면 안 되고... 이제 아주 복잡한 과정을 거쳐야 한다!

 

1) mysql-connector 라이브러리 추가

-1. https://dev.mysql.com/downloads/connector/j/에서 mysql-connector 다운받기

: platform independent 선택 후, ZIP Archive 파일로 다운로드

 

-2. .jar 파일을 안드로이드 프로젝트에 넣기

: 프로젝트 폴더 상단에 libs 폴더 만들고, 그 안에 .jar 파일을 넣기

libs 폴더 안에 .jar 파일 넣기

 

-3. .jar 파일 우클릭 > Add as Libarary > 모달 뜨면 OK 누르기

 

-4. gradle(module)에 경로 추가해 주기 

// OK 하고 나면 자동으로 이 코드가 추가되는데, 얘는 지운다 
//implementation files('..\\libs\\mysql-connector-j-8.0.31.jar')

// 그리고 얘를 추가한다 
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'mysql:mysql-connector-java:5.1.49'

 

2) 코드 작성하기

: 이 코드 설명은... 굳이 내가 안 해도 될 것 같다 이클립스에서 쓴 JDBC 코드와 거의 유사하다

package com.database_termproject.twitter.ui.main;

import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.database_termproject.twitter.databinding.ActivityExampleBinding;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;

public class ExampleActivity extends AppCompatActivity {
    private static final String URL = "jdbc:mysql://localhost/mydb";
    private static final String USER = "root";
    private static final String PASSWORD = "021019@wa";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ActivityExampleBinding binding;

        super.onCreate(savedInstanceState);
        binding = ActivityExampleBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // Button
        binding.exampleBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                new InfoAsyncTask().execute();
            }
        });
    }

    @SuppressLint("StaticFieldLeak")
    public class InfoAsyncTask extends AsyncTask<Void, Void, Map<String, String>> {
        @Override
        protected Map<String, String> doInBackground(Void... voids) {
            Map<String, String> info = new HashMap<>();

            try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {
                String sql = "SELECT * from user";
                PreparedStatement statement = connection.prepareStatement(sql);
                ResultSet resultSet = statement.executeQuery();

                while (resultSet.next()) {
                    Log.d("Example", resultSet.getString("user_id").toString());
                }
            } catch (Exception e) {
                Log.e("InfoAsyncTask", "Error reading school information", e);
            }

            return info;
        }

        @Override
        protected void onPostExecute(Map<String, String> result) {
            if (!result.isEmpty()) {
                Log.d("Example", result.toString());
            }
        }
    }
}

 

3) 실행하기

자... 이렇게 실행해보면 CONNECTION REFUSED가 뜰 것이다 

왜냐? 안드로이드에서 접근할 때는 내 IP 주소를 입력해 주어야 하기 때문이지... 

그래서 내 IP주소를 찾아 다시 URL을 수정해 보자!

Caused by: android.system.ErrnoException:connect failed: ECONNREFUSED (Connection refused)

 

-1. 내 IP주소 찾기

: cmd 열고 > ipconfig 명령어 입력 > IPv4가 내 IP 주소이다 

 

이걸로 주소를 바꾸고 다시 실행해 보면, 권한이 없다는 에러 문구가 뜬다. 

"Host 'xxx.xxx.xx.xx' is not allowed to connect to this MySQL server"

 

-2. 내 IP 주소가 mySQL 서버에 접근할 수 있도록 권한 허용하기

mysql> CREATE USER 'root'@'10.154.10.241' IDENTIFIED BY 'Abcdef123!@#';
mysql> GRANT ALL ON *.* TO 'root'@'10.154.10.241';
FLUSH PRIVILEGES;

 

다시 실행하면 정상적으로 DB에 접근하여 데이터를 받아온다.

결과 화면

 

네... 그렇습니다. 이렇게 끝!

 

<참고>

안드로이드 외부 라이브러리 추가하기 https://mainia.tistory.com/5080

안드로이드에서 로컬 호스트 vs IP주소 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jobberbell&logNo=221299527548

안드로이드에서 JDBC 사용하기 https://kodejava.org/how-do-i-read-mysql-data-from-android-using-jdbc/

mySQL IP주소 권한 허용 https://stackoverflow.com/a/66035676

'💻 Android' 카테고리의 다른 글

[Android] Android CI/CD 구축하기 (1) - Firebase App Distribution, Play store 테스트 트랙  (0) 2024.05.25
[Android] Android 13 마이그레이션  (0) 2024.03.09
[Android/IOS] 인앱 리뷰 기능 추가하기  (2) 2023.09.23
[Android] 인스타그램 DM으로 공유하기 기능 만들기  (0) 2023.09.23
[Android/Kotlin] 갤러리에서 이미지 가져오기  (0) 2022.08.02
'💻 Android' 카테고리의 다른 글
  • [Android] Android 13 마이그레이션
  • [Android/IOS] 인앱 리뷰 기능 추가하기
  • [Android] 인스타그램 DM으로 공유하기 기능 만들기
  • [Android/Kotlin] 갤러리에서 이미지 가져오기
시니유
시니유
UX 개선에 관심이 많은 Frontend & Android 개발자
  • 시니유
    시니유의 개발 블로그
    시니유
  • 전체
    오늘
    어제
    • 분류 전체보기 (23)
      • 💻 Web (2)
      • 💻 Android (8)
      • 🔥 대외활동 (8)
      • ⚒️ 기타 (5)
  • 최근 댓글

  • 링크

    • Github
    • LinkedIn
    • Resume
  • hELLO· Designed By정상우.v4.10.0
시니유
[Android/MySQL] 안드로이드에서 JDBC 사용하기
github 상단으로

티스토리툴바