DBMS 개요, JDBC API 규격, JDBC 프로그래밍 기본 골격
DBMS 개요
데이터 베이스는 데이터를 보관하는 것 = 파일?
데이터를 보관한 파일 + 실시간 접근 가능 / 동시 공유 / 데이터의 독립성 / 일관성 / 무결성 / 보안성
명령어 -> 데이터 처리 요청 DBMS -> 데이터 입출력 -> 파일
이 명령어 작성 문법이 SQL이다. 모든 DBMS에서 인식할 수 있는 표준 문법이다.
SQL명령을 보내고 결과를 받으려면 DBMS에서 정한 규칙에 따라 통신을 해야한다! 문제는 DBMS 제조사 측에서 통신 규칙을 공개하지 않는다. 대신 통신을 대행하는 클라이언트를 제공한다.
그것이 DBMS 클라이언트다.
명령어를 SQL언어로 작성하면 클라이언트가 서버로 연결하여 작업을 요청한다.
문법A -> 명령어 작성 -> DBMS A / DBMS B / DBMS C
DBMS마다 명령어가 다르다면 DBMS를 사용하기 매우 번거롭다.
명령어 작성법을 통일하였다. DBMS와 상관없이 일관된 방법으로 명령어를 작성할 필요성이 대두!
DBMS API - Native API
App -> call(SQL) -> Oracle DBMS API -> 요청/응답 -> Oracle DBMS
Oracle DBMS API 중 *.dll , *.so, *.lib 파일에 C,C++로 작성된 함수가 들어있다.
DBMS API 마다 함수/ 클래스 정의가 다르다. 그 뜻은 메서드 사용법이 다르다는 것이다.
즉, Oracle DBMS 전용 App에서 MS-SQL DBMS API를 사용할 수 없다!
개발자들은 DBMS에 맞춰 따로 프로그램을 짜야하는 번거로움 발생!
그 때문에 등장한 것이 DBMS API - ODBC API이다.
ODBC API
DBMS API 규격을 통일한다. Open Database Connectivity (통일된 DBMS API 규격 = 구현체가 아닌 규격을 정의한 것)
Oracle Native API -> 요청 / 응답 -> Oracle DBMS (DBMS마다 API 통신규격을 지켜야한다)
ODBC API 규격에 따라 만든 API = xxxx ODBC Driver
App -> call -> Oracle ODBC Driver -> call -> Oracle Native API -> 요청 / 응답 -> Oracle DBMS
App -> call -> Excel ODBC Driver -> 파일 입출력 -> Excel
DBMS마다 호출규칙이 같기 때문에 DBMS 공용 App이 된다.
ODBC API (규칙 정의) -> 구현 -> ODBC Driver (규칙에 따라 구현)
DBMS API - JDBC API 규격
Java Database Connectivity API 규격
JDBC API 규격에 따라 구현한 클라스 라이브러리 = JDBC Driver
Java App -> call -> JDBC Driver -> call -> Oracle ODBC Driver / MS-SQL ODBC Driver / Excel ODBC Driver -> Oracle Native API / MS-SQL Native API
Type 1 드라이버
- ODBC - JDBC Bridge
- JRE에 기본 포함 (별도 다운로드 불필요)
- ODBC를 경유하기 때문에 실행 속도 느림
- 따로 JDBC 전용 드라이버가 없이 ODBC 드라이버만 있는 경우 유용하다
Oracle JDBC Driver -> call -> Oracle Native API / MS-SQL Native API -> 요청/응답 -> Oracle DBMS / MS-SQL DBMS
엑셀은 JDBC Driver가 없다
Type 2 드라이버
- Native API 드라이버
- JRE에 포함 안 됨 (DBMS Vendor에서 별도로 다운로드 해야한다)
- 로컬에 Native API 설치해야 한다
Java App -> call -> Oracle JDBC Driver/ MS-SQL JDBC Driver -> Oracle DBMS / MS-SQL DBMS
Type 4 드라이버
- Networt protocol 드라이버
- DBMS Vendor 에서 별도 다운로드해야한다
- c/c++ 호출x / pure드라이버
- 로컬에 c/c++ 라이브러리 설치 불필요!
- 문제점
- Type2, Type4 는 DBMS에 따라 교체를 해야한다
Java App. -> call -> 중계서버 JDBC Driver || local
-> 요청/응답 -> JDBC API 중계서버 -> call -> Oracle JDBC Driver / MS-SQL JDBC Driver || middleware = middle + software
-> 요청/응답 -> Oracle DBMS / MS-SQL DBMS || remote
Type 3 드라이버
- 중계서버 Vendor에서 다운로드
- DBMS 가 바뀌더라도 로컬은 영향을 받지 않는다.
- 속도가 느리다
개발자 입장에서 Type 1,2,3,4 중에 어떤 것을 사용하는지 상관없다
이유는 API가 같다는 것은 같은 규격이라는 뜻이다.
JDBC API 주요 객체
java.sql.* 패키지에서
<인터페이스> java.sql.Driver (JDBC 드라이버 정보제공, DBMS 연결 객체 생성)
<인터페이스> java.sql.Connection (DBMS에 연결, SQL 질의 수행 객체 생성)
<인터페이스> java.sql.Statement (SQL 질의 수행, 결과 조회 객체 생성)
<인터페이스> java.sql.PreparedStatement (SQL 질의 수행, 결과 조회 객체 생성)
<인터페이스> java.sql.ResultSet (select 결과를 가져오는 역할)
<콘크리트> java.sql.DriverManager (java.sql.Driver 구현체 관리, Driver 실행을 중계)
JDBC 프로그래밍 기본 골격
App -> 1. getConnection() DBMS 정보를 달라고 요청 -> java.sql.DriveManager -> 2. connect() 호출 -> MySQL Driver 구현체 / Oracle Driver 구현체 / MS-SQL Driver 구현체 -> 3. 리턴 -> Connection 구현체
App -> 4. createStatement() -> Connection 구현체 -> 5. 리턴 -> Statement 구현체
App -> 6. executeQuery() SQL을 담아 넘긴다 -> Statement 구현체 -> 7. 리턴 -> ResultSet 구현체
App -> 8. next() -> ResultSet구현체 -> Data 조회요청 -> DBMS
App -> 10. getXxx() -> 컬럼 값 꺼내기 -> ResultSet 구현체
JDBC 프로그래밍 - DBMS에 연결하기
JVM에서 jdbc driver 파일(.jar)을 뒤져서 java.sql.Driver 를 구현한 클래스를 자동으로 로딩하기 때문에, 다음과 같이 명시적으로 로딩할 필요가 없다.
Class.forName("org.mariadb.jdbc.Driver");
DBMS에 연결하기
=> DriverManager에게 DBMS와의 연결을 요청한다. 어느 서버에 접속할 것인지 정보를 제공해야 한다.
jdbc url : DBMS 서버 정보. 예) jdbc:DBMS://서버주소:포트/데이터베이스명
(포트번호를 지정하지 않으면 기본이 3306 이다.)
username : DBMS 사용자 아이디
password : DBMS 사용자 암호
ResultSet?
결과가 아니다! 서버에서 결과를 가져오는 일을 할 객체이다.
즉 서버의 select 실행 결과를 가져올 때 사용하는 도구이다.
getString(컬럼번호):
=> DBMS에 설정된 컬럼의 값을 문자열로 리턴한다.
=> select 문에 나열한 컬럼의 순서를 지정한다.
단 번호는 0부터가 아니라 1부터 지정한다.
컬럼의 번호 혹은 컬럼명을 지정할 수 있다.
컬럼의 타입에 상관없이 getString()으로 값을 꺼낼 수 있다.