Presentation is loading. Please wait.

Presentation is loading. Please wait.

자바 5.0 프로그래밍 √ 원리를 알면 IT가 맛있다 이클립스를 활용한 자바 A to Z ehanbit.net.

Similar presentations


Presentation on theme: "자바 5.0 프로그래밍 √ 원리를 알면 IT가 맛있다 이클립스를 활용한 자바 A to Z ehanbit.net."— Presentation transcript:

1 자바 5.0 프로그래밍 √ 원리를 알면 IT가 맛있다 이클립스를 활용한 자바 A to Z ehanbit.net

2 chapter 17. JDBC

3 JDBC 드라이버의 종류 JDBC의 탄생 배경과 구조
JDBC 드라이버는 DBMS의 벤더나 다른 연구 단체들에서 만들어진다. JDBC 드라이버는 크게 네 가지로 분류된다. JDBC-ODBC 드라이버 JDBC API로 작성된 프로그램이 JDBC-ODBC 브리지를 통해 ODBC 드라이버를 JDBC 드라이버로 여기고 동작하도록 한다. 반드시 운영체제 내에 ODBC 드라이버가 존재해야 한다. 데이터 베이스 API 드라이버 JDBC API 호출을 특정 데이터 베이스의 클라이언트 호출 API로 바꿔주는 드라이버다. 오라클 OCI 드라이버가 여기에 속한다. 네트워크 프로토콜 드라이버 클라이언트의 JDBC API 호출을 특정 데이터 베이스의 프로토콜과 전혀 상관없는 독자적인 방식의 프로토콜로 바꾸어 서버로 전송한다. 서버에는 미들웨어가 프로토콜을 특정 데이터베이스 API로 바꾸어 처리한다. 데이터 베이스 프로토콜 드라이버 JDBC API 호출을 서버의 특정 데이터 베이스에 맞는 프로토콜로 변환시켜 서버로 전송하는 드라이버(Java Thin Driver) 이다.

4 JDBC의 탄생 배경과 구조

5 2tier 자바 애플리케이션이 JDBC 드라이버를 통해서 직접 데이터베이스를 접근하는 형식이다.
이 모델에서 JDBC 드라이버는 JDBC API 호출을 통해 특정 DBMS에 직접 전달해 주는 역할을 한다.

6 3tier 3tier 모델은 2tier 모델에 미들웨어 계층이 추가된 형태이며, 미들웨어에서 DBMS에 직접 질의하게 된다.
JDBC의 탄생 배경과 구조 3tier 3tier 모델은 2tier 모델에 미들웨어 계층이 추가된 형태이며, 미들웨어에서 DBMS에 직접 질의하게 된다. 3tier 모델은 2tier 모델에 보다 유지보수(Maintenance)에 비용을 절약할 수 있다. 단점은 2tier에 비해 속도는 다소 느리다.

7 JDBC를 이용한 데이터베이스 연결 방법 1 단계 : import java.sql.*; 2 단계 : 드라이버를 로드 한다.
3 단계 : Connection 객체를 생성한다. 4 단계 : Statement 객체를 생성한다. 5 단계 : SQL문에 결과물이 있다면 ResultSet 객체를 생성한다. 6 단계 : 모든 객체를 닫는다.

8 JDBC를 이용한 데이터베이스 연결방법 드라이버 다운 받기와 설정 JDBC API를 이용해서 DBMS에 접근하기 위해서는 DBMS에서 제공되는 드라이버를 내려 받아야 한다. 만약, 오라클이 설치되어 있다면 아래의 경로에서 드라이버를 제공하고 있다. 오라클이 설치되어 있지 않다면 아래의 주소에서 내려 받으면 된다. %ORACLE_HOME%\ora92\jdbc\lib\classes12.zip

9 JDBC API import ojdbc14.jar 파일이 C 드라이브에 있다는 가정에서 JDBC 드라이버를 설정한다.
에디트 플러스 : c:\ojdbc14.jar를 CLASSPATH에 추가한다. 이클립스 : ‘project에서 오른쪽 클릭 => properties선택 => libraries(탭) 선택 => Add External JARs. 선택 => ojdbc14.jar 를 찾아서 <열기> 버튼 클릭’ JDBC API import JDBC 코딩하기 위한 첫 번째 단계로 JDBC에서 사용되는 클래스와 인터페이스가 있는 패키지를 import 해야 한다. import java.sql.*; public class JdbcEx{ }

10 드라이버를 로드한다. JDBC를 이용한 데이터베이스 연결방법
JDBC Driver를 로드해야 한다.2 단계 : 드라이버를 로드 한다. Class.forName(~)은 동적으로 JDBC 드라이브 클래스를 로딩하는 것이다. forName(~) 메서드에 매개변수로 오는 OracleDriver 클래스의 객체를 만들어 런타심 메모리에 로딩시켜 주는 메서드이다. 아래와 같이 정의 해도 상관은 없다. try{ Class.forName(“oracle.jdbc.driver.OracleDriver”); }catch(ClassNotFoundException cnfe){ cnfe.printStackTrace(); } oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver ();

11 JDBC를 이용한 데이터베이스 연결방법 실제로 driver 객체는 JDBC 프로그램에서 더 이상 사용하지 않기 때문에 위와 같은 코딩은 잘 사용하지 않는다. 2 단계 : 드라이버를 로드 한다. Class.forName(~)을 이용하면 OracleDriver클래스가 런타임 메모리에 로딩 되고 DriverManager 클래스의 static 멤버 변수로 저장된다. 만약 이 부분에서 java.lang.ClassNotFoundException 에러가 발생 했다면 다음 2가지 사항을 확인해 보도록 한다. 1. oracle.jdbc.driver.OracleDriver의 철자가 정확한지 확인해 본다. 2. 이클립스에 ojdbc14.jar를 등록 했는지 확인해 본다.

12 Connection 객체를 생성한다. DBMS와 연결을 담당하는 Connection 객체를 생성한다.
JDBC를 이용한 데이터베이스 연결방법 Connection 객체를 생성한다. DBMS와 연결을 담당하는 Connection 객체를 생성한다. Connection 객체를 얻어 왔다면 DBMS와 접속이 성공적으로 이루어진 것이다. getConnection() 메서드에 들어가는 url, user, password에 대해서 알아보자 try{ Connection con = DriverManager.getConnection( "scott", "tiger"); }catch(SQLException sqle){ sqle.printStackTrace(); }

13 IP - oracle이 설치된 ip를 작성한다.
JDBC를 이용한 데이터베이스 연결방법 IP - oracle이 설치된 ip를 작성한다. PORT - oracle의 포트를 작성하는데 일반적으로 설치 하였다면 1521 이다. ORACLE_SID – oracle를 설치할 때 설정하는 것인데 대부분 일정하지 않다. 따라서 ORACLE_SID를 정확히 찾아 확인한 후에 값을 정하도록 하자.(일반적으로 – ORCL) user - oracle의 user를 말한다. password – oracle user에 대한 password를 말한다.

14 JDBC를 이용한 데이터베이스 연결방법

15 Statement 객체를 생성한다. 오라클과 연결되었다면 SQL문을 전송할 수 있는 Statement 객체를 생성해야 한다.
JDBC를 이용한 데이터베이스 연결방법 Statement 객체를 생성한다. 오라클과 연결되었다면 SQL문을 전송할 수 있는 Statement 객체를 생성해야 한다. Statement 객체는 Connection 인터페이스의 createStatement() 메서드를 사용하여 얻어 올 수 있다. Statement 객체를 생성했다면 SQL를 전송할 수 있는데 Statement 인터페이스에는 SQL문을 전송할 수 있는 여러 가지 메서드 중에 3가지에 대해 살펴 보도록 하자. try{ Statement stmt = con.createStatement(); }catch(SQLException sqle){ sqle.printStackTrace(); }

16 executeQuery(String sql) – SQL문이 select 일 경우
JDBC를 이용한 데이터베이스 연결방법 executeQuery(String sql) – SQL문이 select 일 경우 executeUpdate(String sql) – SQL문이 insert, update, delete문 등일 경우 execute(String sql) – SQL문을 알지 못하는 경우 Statement stmt = con.createStatement(); StringBuffer sb = new StringBuffer(); sb.append(“select id from test “); ResultSet rs = stmt.executeQuery(sb.toString()); Statement stmt = con.createStatement(); StringBuffer sb = new StringBuffer(); sb.append(“update test set id=‘syh1011’ “); int updateCount = stmt.executeUpdate(sb.toString());

17 execute(String sql) – SQL문을 알지 못하는 경우
JDBC를 이용한 데이터베이스 연결방법 execute(String sql) – SQL문을 알지 못하는 경우 Statement stmt = con.createStatement(); StringBuffer sb = new StringBuffer(); sb.append("update test set id='syh5055'"); boolean isResult = stmt.execute(sb.toString()); if(isResult){ ResultSet rs = stmt.getResultSet(); while(rs.next()){ System.out.println("id : "+rs.getString(1)); } }else{ int rowCount = stmt.getUpdateCount(); System.out.println("rowCount : "+rowCount);

18 JDBC를 이용한 데이터베이스 연결방법

19 ResultSet 객체를 생성한다. JDBC를 이용한 데이터베이스 연결방법
ResultSet은 SQL문에 대한 결과를 처리할 수 있는 객체이다. Statement 인터페이스의 executeQuery() 메서드를 실행한 결과로 ResultSet 객체를 리턴 받는다. select id , age from test

20 JDBC를 이용한 데이터베이스 연결방법 모든 데이터를 한번에 가져올 수 없기 때문에 cursor의 개념을 가지고 있다. cursor란 ResultSet 객체가 가져올 수 있는 행을 지정해 준다. 처음 커서의 위치는 결과물(필드)에 위치하지 않기 때문에 cusror를 이동해야 한다. 커서를 이동하는 메서드가 ResultSet 의 next() 메서드이다. next() 메서드의 리턴 타입은 boolean 인데 이는 다음 행의 결과물(필드)이 있으면 true, 없으면 false를 리턴 한다. ResultSet 객체가 결과물(필드)을 가져올 수 있는 행으로 이동이 되었다면 이제는 실제 결과물(필드)을 가져와야 한다. ResultSet 인터페이스에는 결과물(필드)을 가져오는 수많은 메서드(getXXX())를 제공한다. getXXX() 메서드는 oracle의 자료형 타입에 따라 달라지게 된다.

21 모든 객체를 닫는다. JDBC를 이용한 데이터베이스 연결방법
예를 들어 id 컬럼이 varchar2 타입이라면 getString(~) 메서드를 사용해야 하고, age 컬럼이 number 타입이라면 getInt(~) 메서드를 사용해야 한다. getXXX() 메서드는 두개씩 오버로드 되어 정의 되어 있는데 하나는 정수를 인자로 받는 것과 String 타입으로 인자를 받는 메서드를 제공하고 있다. 커서를 이동하는 메서드가 ResultSet 의 next() 메서드이다. 첫번째 정수를 받는 타입은 select 문 다음에 쓰는 컬럼명의 인덱스를 지정하는데 인덱스의 처음번호는 1부터 시작하게 된다. 두번째 String 타입은 select 문의 다음에 오는 컬럼명으로 지정해야 한다. 모든 객체를 닫는다. Connection, Statement, ResultSet 객체는 사용이 끝난 후에는 종료를 해 줘야 한다. 종료 해주는 메서드는 모든 객체에 close() 메서드로 정의 되어 있다. 예제[17-1] JdbcEx.java

22 JDBC를 이용한 데이터베이스 연결방법

23 Statement 상속관계 Statement 인터페이스는 SQL문을 전송할 수 있는 객체이다. 상속관계를 보면 아래와 같다.
서브 인터페이스로 갈 수록 향상된 기능을 제공한다.

24 PreparedStatement 기능 Statement 상속관계
PreparedStement는 SQL문의 구조는 동일하나 조건이 다른 문장을 변수 처리함으로써 항상 SQL문을 동일하게 처리할 수 있는 인터페이스 이다. PreparedStement로 SQL문을 처리하게 되면 LIBRARY CACHE에 저장된 세 가지 작업을 재사용 함으로써 수행 속도를 좀 더 향상시킬 수 있다. 이해를 돕기 위해 SQL문을 전송했을 경우 오라클은 내부적으로 어떻게 작동하는 보도록 하자. SQL문 전송하게 되면 오라클은 내부적으로 PARSING => EXECUTE PLAN => FETCH 작업을 한다. 이런 3가지 작업을 한 후에 검색한 결과를 SGA 영역 안에 Data Buffer Cache영역에 Block 단위로 저장하게 된다. SQL문과 PARSING한 결과와 실행계획을 SHARED POOL안에 LIBRARY CACHE에 저장하게 된다.

25 Statement 상속관계 똑 같은 SQL문을 전송하면 LIBRARY CACHE에 저장된 SQL문과 PARSING한 결과와 실행계획을 그대로 사용하게 된다. 똑 같은 SQL문이라도 대소문자가 하나라도 틀리거나 SQL문이 다르다면 LIBRARY CACHE에 저장된 3가지 작업을 재 사용할 수 없고 다시 PARSING => EXECUTE PLAN => FETCH 작업을 수행하게 된다.

26 PreparedStatement 사용방법
예제[17-2] PreparedStatementEx.java PreparedStatement 사용방법 PreparedStatement의 객체 생성은 아래와 같다. PreparedStatement는 SQL문을 작성할 때 컬럼 값을 실제로 지정하지 않고, 변수 처리 함으로서 DBMS을 효율적으로 사용한다. PreparedStatement의 SQL문은 SQL문의 구조는 같은데 조건이 수시로 변할 때 조건의 변수처리를 “?” 하는데 이를 바인딩 변수라 한다. 바인딩 변수는 반드시 컬럼 명이 아닌 컬럼 값이 와야 한다는 것이다. 바인딩 변수의 순서는 “?” 의 개수에 의해 결정이 되는데 시작 번호는 1 부터 시작하게 된다. 바인딩 변수에 값을 저장하는 메서드는 오라클의 컬럼 타입에 따라 지정해 주면 된다. 전에 ResultSet의 getXXX() 메서드와 유사하게 PreparedStatement 인터페이스에는 바인딩 변수에 값을 저장하는 setXXX() 메서드를 제공하고 있다. String sql = “select age from test1 where id=?”; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1,”syh1011”); ResultSet rs = pstmt.executeUpdate();

27 Statement 상속관계 CallableStatement 기능 CallableStatement는 DBMS의 저장 프로시저(Stored Procedure)를 호출할 수 있는 인터페이스이다. 저장 프로시저란 파라미터를 받을 수 있고, 다른 애플리케이션이나 PL/SQL 루틴에서 호출할 수 있는 이름을 가진 PL/SQL 블록이다. 즉, SQL문을 프로그램화 시켜 함수화 시킨 스크립트 언어이다. SQL문을 프로그램화 시켰기 때문에 조건문, 반복문, 변수처리 등을 사용하기 때문에 일괄처리 및 조건에 따라 틀려지는 SQL문을 작성할 때는 유리하다. 이런 Stored Procedure 호출을 가능 하게해 줄 수 있는 인터페이스가 CallableStatement 이다.

28 CallableStatement 사용 방법
예제[17-4] CallableStatementEx.java CallableStatement 사용 방법 CallableStatement는 Connection 인터페이스의 prepareCall(~)를 사용하면 된다. prepareCall(String procedure) 의 프로시저는 2가지 형태를 가지고 있다. 1번은 <arg1>,<arg2>,..은 PreparedStatement 처럼 바인딩 변수로 처리 하면 되고, ?은 registerOutParameter(~)계열의 메서드를 사용하면 된다. 2번은 <arg1>,<arg2>,..은 PreparedStatement 처럼 바인딩 변수로 처리 한다. CallableStatement cstmt = con.prepareCall("{call adjust(?,?)}"); 1. {?= call <procedure-name>[<arg1>,<arg2>, ...]} 2. {call <procedure-name>[<arg1>,<arg2>, ...]}

29 트랜잭션(Transcation) JDBC를 이용한 Transaction
트랜잭션이란 여러 개의 오퍼레이션을 하나의 작업 단위로 묶어 주는 것을 말한다. 트랜잭션은 하나의 작업 단위의 일들은 전체 작업이 모두 올바르게 수행되거나 또는 전체 작업이 모두 수행되지 않아야 한다. 트랜잭션은 네 가지 특성(ACID 특성)을 가지고 있다.

30 예제[17-5] TransactionEx.java
JDBC를 이용한 Transaction 예제[17-5] TransactionEx.java Connection 인터페이스에서 Transaction과 관련된 메서드를 정리하면 다음과 같다. setAutoCommit(boolean autoCommit) – autoCommit이 true이면 트랜잭션을 시작하지 않겠다는 의미, false 이면 트랜잭션을 시작하겠다는 의미 이다. commit() – setAutoCommit(false)와 commit() 사이에 있는 모든 operation를 수행하겠다는 의미이다. rollback() - setAutoCommit(false)와 rollback() 사이에 있는 모든 operation를 수행하지 않겠다는 의미이다.

31 Properties 를 이용한 JDBC 연결과 ResultSetMetaData
Properites 클래스는 properties파일의 집합을 추상화 클래스이다. 이 클래스는 Stream를 로드하여 저장할 수 있고, 이를 다시 Map 형태로 관리하여 Key를 알면 Key에 대한 Value을 얻어올 수 있는 클래스이다. C:\jdbc.properties 파일을 아래와 같이 만들어보자. driver = oracle.jdbc.driver.OracleDriver url = sser = scott password = tiger jdbc.properties 파일을 읽기 위해서는 스트림을 생성해야 한다. 스트림을 Properties 클래스에 로드 시키고, Properties클래스의 getProperty(String key) 메서드를 이용해서 각각의 값을 얻어 올 수 있다.

32 Properties 를 이용한 JDBC 연결과 ResultSetMetaData
try{ FileInputStream fis = new FileInputStream("c:\\jdbc.properties"); Properties pro = new Properties(); pro.load(fis); String driver = pro.getProperty(“driver"); String url = pro.getProperty(“url"); String user = pro.getProperty(“user"); String password = pro.getProperty(“password"); }catch(IOException ee){ ee.printStackTrace(); } Properties 클래스를 이용하여 JDBC를 연결하게 되면 데이터 베이스가 바뀌는 경우, 또는 데이터 베이스의 IP가 바뀌는 경우 , 사용자가 바뀌는 경우에 jdbc.properties 파일만 수정하여 재 컴파일 방지하고, 유지보수에 용이하게 함이다. 예제[17-7] PropertiesEx.java

33 Properties 를 이용한 JDBC 연결과 ResultSetMetaData
Table명은 알고 있지만 Table를 구성하는 컬럼명 이라든지 , 컬럼명의 자료형등을 알기 위해서는 ResultSetMeta-Data를 이용해야 한다. ResultSetMetaData는 ResultSet의 구성요소이다. 다시 말해서, SQL의 Table을 구성하는 모든 요소를 알아낼 수 있는 메서드를 제공하고 있다. ResultSetMetaData 객체를 생성하는 방법은 아래와 같다. rs = pstmt.executeQuery() ; ResultSetMetaData rsmd = rs.getMetaData() ; 예제[17-8] ResultSetMetaDataEx.java

34 Connection Pool Connection Pool 우리는 앞서 3tier에 대한 대략적인 구조를 살펴봤다.
3tier구조에서 MIDDLEWARE 와 DBMS의 거리가 멀어진다면 JDBC API중에 Connection 객체를 만드는 비용은 상당할 것이다. 왜냐하면 MIDDLEWARE와 DBMS의 실제적인 접속시도는 Connection 객체를 생성할 때 이루어 지기 때문이다. JDBC API의 가장 코스트가 비싼 자원인 Connection 객체를 미리 생성하여 재 사용하는 메커니즘을 Connection Pool이라고 한다.

35 Connection Pool 만들기 Connection Pool
Connection를 저장할 수 있는 두개의 Vector를 생성한다. Freed(Vector)는 ConnectionPool 클래스의 객체가 생성될 때 미리 생성된 Connection 객체를 저장하는 장소이다. Used(Vector)는 실제 미들웨어에서 DBMS와 연결을 할 때 사용하는 Connection 공간이다. 이때 Freed(Vector)에서 Connection 객체를 꺼내와 Used(Vector)에 저장하고 Used(Vector)에 있는 Connection 객체를 실제 애플리케이션에 사용하는 것이다.


Download ppt "자바 5.0 프로그래밍 √ 원리를 알면 IT가 맛있다 이클립스를 활용한 자바 A to Z ehanbit.net."

Similar presentations


Ads by Google