🌝 자바 데이터베이스 프로그래밍 (JDBC)
JDBC 란?
- Java Database Connectivity
- 자바 프로그램에서 다른 기종 간의 데이터베이스를 표준화된 방법으로 접속할 수 있도록 만든 API(Application Programming Interface) 이다.
JDBC Driver
- 데이터베이스에 대한 연결(Connnection)을 제공하고 클라이언트와 데이터베이스 간에 쿼리 및 결과를 전송하는 기능을 제공한다.
- 클라이언트에 JDBC 드라이버를 설치한다.
🌑 MySQL JDBC Driver 다운로드
- Go to Download Page > 를 클릭한다.
- Windows (x86, 32-bit), MSI Installer 의 Download 를 클릭하여 다운로드 받는다.
- mysql-connector-java-8.0.26.zip 파일을 다운로드 한 후 압축을 풀면 폴더 안에 mysql-connector-java-8.0.26.jar 라는 파일이 MySQL JDBC Driver 이다.
- mysql-connector-java-8.0.26.jar 파일로 자바와 DB를 연결할 수 있다.
🌒 JAVA 버전 확인
🌓 PATH 확인
🌔 JDBC 만을 위한 폴더 생성 후 Workspace 잡기
🌕 Eclipse Compiler 11 버전으로 맞추기
🌖 jre 변경
- File -> New -> Other... 를 클릭한다.
- Configure JREs... 를 클릭한다.
- 현재 잡혀있는 jre 17 버전을 Remove 를 클릭한다.
- jre 버전을 11 버전으로 다시 잡아주기위해 Add... 를 클릭한다.
- Default로 잡혀있는 Standard VM 에서 Next > 를 클릭한다.
- Directory... 를 클릭하여 jdk 11 버전의 path를 잡아준다.
- jre 환경을 jdk 11 버전으로 변경된 것을 확인하고 Apply and Close 한다.
- 계속 Next를 클릭하고 마지막에 우리는 Open Perspective 를 사용할 것이기때문에 클릭해준다.
🌗 Eclipse - MySQL JDBC Driver 설정
1단계 jar 파일 추가하기
- 생성한 프로젝트에 마우스 우클릭한다음 Build Path -> Configure Build Path... 를 클릭한다.
- Libraries 탭에서 Classpath 를 선택한 후 Add External JARs... 를 클릭한다.
- 추가된 jar 파일을 확인하고 Apply and Close 를 클릭한다.
2단계 명령프롬프트창에서 net start 명령어로 MySQL 서비스가 실행되고 있는지 확인한다.
🌘 JDBC 단계별 사용방법
1단계 MySQL Driver Loading
- 드라이버 로딩이 잘 되었는지 확인하는데 아래와 같은 에러가 생긴다면 Compiler 가 11버전인지 다시 확인하고, 아니라면 11버전으로 다시 변경해준다.
2단계 Database Connection
- 드라이버 로드가 완료됐다면 연결 객체를 얻는다.(DriverManager 클래스에 있는 getConnection(String url, String user, String password) 을 사용한다.)
- Surround with try/catch 를 클릭하여 예외 처리한다.
- 1단계 & 2단계까지 잘 실행되는지 확인한다.
3단계 Statement 객체 만들기
- Ctrl + Shift + O 단축키를 이용하여 우리가 사용할 java.sql.Statement Interface를 import 한다.
- 연결이 완료 됐다면 실행도구(conn.createStatement)를 생성한다.
- 실행도구도 Surround with try/catch 를 클릭하여 예외 처리를 해준다.
4단계 SQL 질의문 사용하기
- Database에 질의할 SELECT 문을 입력한다.
- 쿼리를 실행 한 뒤 결과를 rs 변수에 얻는다.(ResultSet은 Statement의 executeQuery() 메서드가 반환하는 결과로 얻은 데이터를 의미한다.)
executeQuery와 executeUpdate 의 차이?
- executeQuery 는 Database에 질의문을 전달할 때 사용하는 DML문의 SELECT 명령어를 사용할 때만 사용한다.
- 그 외 나머지 INSERT, DELETE, UPDATE는 모두 executeUpdate() 를 사용한다.
자바의 Index와 SQL의 INDEX 차이?
- 자바에서 배열을 예로들면, index의 시작은 언제나 0이다.
- 하지만, 자바의 JDBC는 Database의 INDEX는 0번이 아닌 1번부터 시작하기때문에 자바에서 유일하게 인덱스가 1번부터 시작한다.
5단계 결과값 처리하기
- Database의 Column의 데이터타입에 따라 결과값을 가져올 때, 자바에서 사용하는 데이터타입과 다르므로 자바에서 사용하는 데이터타입으로 변환하여 받아줘야한다.(즉, DB와 자바의 데이터타입을 동일하게 맞춰줘야한다.)
rs.next() 란?
- Database의 데이터는 하나의 레코드씩 정보가 저장되어있는데, rs.next()를 실행하기전까지는 Database를 가리키는 Cursor가 맨 위에 위치하다가 rs.next()를 만나면서 한칸 아래로 이동한다.
- 우리는 SQL 질의문을 작성할 때, 딱 한 레코드의 정보만 가져오면 되는걸 알기때문에 rs.next()를 한 번만 사용한 것이다. but, 다른 질의문을 통해 Database에서 데이터를 가져올 때, 레코드의 수가 몇개인지 모를 때는 반복문을 사용해야하는데 횟수를 알 지 못하기때문에 for문보다는 while문을 사용해야한다.(ResultSet의 return 값이 boolean type이기때문에 더 이상 레코드가 존재하지않는다면 false를 반환하기때문에 반복문을 빠져나오게되는 구조이다.)
6단계 Database Close
- Database의 결과값을 정상적으로 가져왔다면 사용했던 자원을 반납해야한다.
- 자원을 닫을 때는 사용했던 순서의 반대로 닫아준다.
- 자원을 반납할 때도 Surround with try/catch 를 클릭하여 예외 처리를 해야한다.
- 사용했던 순서의 반대로(rs(ResultSet) -> stmt(Statement) -> conn(Connection)) 자원을 반납한다.
SELECT문은 앞서했던 6단계의 모든 과정을 밟아야하지만, 그 외(INSERT, DELETE, UPDATE) DML문은 5단계에서 executeQuery() 대신 executeUpdate를 사용한다.(즉, 데이터를 다시 받아오지않아도 되기때문에 ResultSet은 사용하지 않는다.)
🔍 Reference
JDBC
https://github.com/kimsinok/JAVA/blob/main/%EC%9E%90%EB%B0%94%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.pdf