데이터베이스 텀 프로젝트에서 트위터 클론 코딩을 진행한다.
1) ERD 설계 2) JDBC 구현 3) GUI 구현의 순으로 진행하는데,
우리는 GUI를 안드로이드로 구현하고자 했다! (Java Swing으로 해도 되는데... 어 음 어 사정이 길다)
암튼... 이 방법이 권고되지 않는 방법이기도 하고 앞으로는 절대 쓸 일이 없기는 하겠지만...
내 거의 3-4시간 가량의 삽질이 아까워서 글로 남긴다.
[방법 1] Android MySQL Connector 라이브러리 사용
열심히 구글링을 하니까 Android에서 MySQL을 사용할 수 있는 라이브러리가 나왔다.
https://github.com/BoardiesITSolutions/Android-MySQL-Connector
사용방법은 깃허브에 잘 나와 있으니,,, 잘 보길 바란다.
내가 겪었던 오류는 이놈이다... 리드미에 있는 그대로 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 라이브러리 추가
이클립스에서 하는 것과 동일한 방법으로 하고자 하였고, 나는 아주 좋은 예시 코드를 찾았다.
물론 이걸 그대로 따라 하기만 하면 안 되고... 이제 아주 복잡한 과정을 거쳐야 한다!
1) mysql-connector 라이브러리 추가
-1. https://dev.mysql.com/downloads/connector/j/에서 mysql-connector 다운받기
: platform independent 선택 후, ZIP Archive 파일로 다운로드
-2. .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 |