1 JDBC의 기본
1.1 JDBC란
JDBC(Java DataBase Connectivity)
JDBC란 데이터베이스에 연결 및 작업을 하기 위한 자바 표준 인터페이스이다.
자바와 데이터베이스를 연결 및 작업이 표준화 되어 있지 않다면
데이터베이스에 따라 각기 다른 방법으로 접근해야 한다!
예 : 국내에서 모니터를 판매하기 위해서는 반드시 IMonitor 인터페이스를 구현해서 만들어야 한다.
public interface IMonitor{
void power(boolean flag);
}
1.1 JDBC란
H사의 모니터
public HcorpMonitor implements IMonitor{
public void power(boolean flag){
//H사에맞게구현
}
}
L사의 모니터
public LcorpMonitor implements IMonitor{
public void power(boolean flag){
//L사에맞게구현
}
}
S사의 모니터
public ScorpMonitor implements IMonitor{
public void power(boolean flag){
//
S사에맞게구현
}
}
1.1 JDBC란
IMonitor로모든모니터를제어
IMonitor h = new HcorpMonitor();
h.power(true);
h.power(false);
IMonitor l = new LcorpMonitor();
l.power(true);
l.power(false);
IMonitor s = ScorpMonitor();
s.power(true);
s.power(false);
1.1 JDBC란
JDBC와 DATABASE
데이터페이스 표준 인터페이스
JJaavvaa 응응용용 프프로로그그램램
MS SQL
Oracle Driver
Oracle Driver MySQL Driver
MySQL Driver MS SQL Driver
MS SQL Driver
MySQL
Oracle
JDBC
프로그래머는 하나의 인터페이스로
모든 데이터베이스에 연결할 수 있다.
벤더마다 DBMS가 다르기 때문에
각 회사에서 Driver를 제작한다.
표준인터페이스가 없다면
자바 프로그램에서 각각의
데이터베이스에 연결하는
방법이 달라진다.
Sun에서는 데이터베이스 표준 인터페이스를 정의하고 이 표준 인터페이스들 을 각 데이터베이스 회사들이 구현하였다면 프로그래머는 표준 인터페이스로 각 회사의 데이터베이스를 다룰 수 있게 되는 장점이 있다!
1.2 JDBC Driver의 종류
Java 응용 프로그램
Native-API 드라이버
Network 프로토콜 드라이버
DBMS프로토콜 드라이버
DBMS
JDBC-ODBC bridge
DBMS
DBMS
DBMS
ODBC Driver
Native Library
Web App 서버 미들웨어
JDBC DriverManager
Type1
Type2
Type3
Type4
C 언어 기반인 ODBC 드 라이버를 연결해주는 역할 만 하는 드라이버로 Java SDK에 기본적으로 포함된 sun.jdbc. odbc.JdbcOdbcDriver가 이에 속한다.
C, C++등으로 만들어진 Native Library를 호출 하여 DB에 연결하는 드 라이버로서 해당하는 C, C++ Native API를 설 치해야 사용할 수 있다.
JDBC 호출을 네트워크 프 로토콜로 바꾸어 미들웨어 에전달하여DB 작업을처 리하게 하는 드라이버로 순 수 자바로 만들어져 있다.
순수 자바로 만들어졌으며, DBMS를직접호출하는드 라이버로 JDBC 드라이버와 데이터베이스간의 1:1 관계 를 가진다. 현재 가장 많이 쓰이는 드라이버이다.
2 MySQL
2.1 MySQL 설치
다운로드 받은 프로그램을 실행하여 압축을 푼다.
setup.exe를 더블클릭하여 실행한다.
다음과 같은 설치화면이 나타난다.
Next버튼을 클릭한다.
2.1 MySQL 설치
Typical 항목을 선택한 다음 Next를 클릭한다.
2.1 MySQL 설치
프로그램 설치 경로를 확인한 다음 Install을 클릭한다.
2.1 MySQL 설치
자신의 email address와 password를 입력하여 MySQL.com에 계정을 생성한다.
2.1 MySQL 설치
설치가 완료되면 다음과 같이 나타난다.
Finish 버튼을 클릭한다.
2.1 MySQL 설치
MySQL서버의 환경설정 작업을 시작하는 메시지가 나타나면 Next버튼을 누른다.
2.1 MySQL 설치
Standard Configuration을 선택하고 Next를 누른다
2.1 MySQL 설치
두가지 항목을 모두 체크해서 윈도우가 시작될때 MySQL서버가 실행되도록 지정하고
MySQL을 윈도우 경로에 추가하도록 한다음 Next를 누른다.
2.1 MySQL 설치
Modify Security Settings항목을 선택한 다음 새로 운 관리자 비밀번호를 설정하고 Next버튼을 누른다.
외우기 쉬운 적당한 비밀번호로 설정한다.
2.1 MySQL 설치
실행준비 항목이 나타나면 4가지 항목을 선택하지 않 고Execute버튼을클릭한다.
2.1 MySQL 설치
모든 작업이 완료되면 Finish버튼을 눌러 종료한다.
그럼 이제 설정이 끝났다.
2.2 MySQL 명령어 사용하기
MySQL명령어를실행하기위한옵션을살펴보자
형식 : MySQL.exe [-h 호스트] [-u 사용자아이디] [-p 비 밀번호] [데이터베이스명]
[-h 호스트] : MySQL이설치되어있는컴퓨터의주소.
[-u 사용자아이디] : 사용자 아이디를 입력한다. default는 root 이다
[-p 비밀번호] : 비밀번호를 입력한다 –p옵션만 입력하면 비밀 번호를 입력하라는 메시지가 뜬다.
[데이터베이스명] : 접속할 데이터 베이스 이름을 입력한다. 입 력하지 않으면 MySQL서버에 로그인된다.
2.2 MySQL 명령어 사용하기
MySQL 테스트 하기
윈도의 시작 버튼을 눌러 실행을 클릭하여 cmd를 입력
2.2 MySQL 명령어 사용하기
MySQL 테스트 하기
다음과 같이 입력하여 MySQL에 접속한다.
패스워드는 MySQL설치시 입력했던 내용을 기입한다.
2.2 MySQL 명령어 사용하기
MySQL 테스트 하기
DB에 기본으로 등록된 test가 있는지 다음 명령어를 입력 해서 확인한다.
2.2 MySQL 명령어 사용하기
MySQL 테스트 하기
선택된 테이블의 내용을 보기 위한 명령어를 입력한다.
명령어 마지막에 세미콜론(;)을 넣는 것에 주의해야 한다.
2.2 MySQL 명령어 사용하기
MySQL 테스트 하기
exit을 입력하여 로그아웃한다.
2.3 MySQL 테이블다루기
정보저장을 위해 테이블을 사용한다.
테이블은 마치 표처럼 row와 column으로 구성된다.
다음의 예는 회원정보를 저장하고 있는 테이블이다.
이와 같은 구조를 테이블이라고 한다.
테이블은 2차원 병렬구조를 가진다.
회원번호
이름
아이디
패스워드
나이
1001
강지아
jeeea
1111
20
1002
이장미
rose
2222
30
1003
김백합
lily
3333
25
code
name
id
password
age
회원정보(row)
회원테이블 : member
2.3 MySQL 테이블다루기
테이블을 생성하는 Create table
형식
CREATE TABLE 테이블명
(컬럼명 자료형, …)
member 테이블 생성
member 테이블 확인
2.3 MySQL 테이블다루기
테이블에 레코드를 추가하는 INSERT
형식
INSERT INTO 테이블명(컬럼명1, …) values(DATA1, …);
테이블에 세 사람을 추가해 보겠다.
2.3 MySQL 테이블다루기
테이블에 레코드를 검색하는 SELECT
형식
SELECT [ALL|DISTINCT] 컬럼_리스트
FROM 테이블_리스트
[WHERE 조건]
[GROUP BY 컬럼_리스트]
[HAVING 조건]
[ORDER BY 컬럼_리스트 [ASC|DESC]];
member 테이블의 모든 레코드를 출력한다.
2.3 MySQL 테이블다루기
저장된 데이터를 변경하는 UPDATE
형식
UPDATE 테이블_리스트
SET 컬럼명1 = DATA1, …
[WHERE 조건]
member 테이블의 이장미의 비밀번호를 1234로 변경한다.
2.3 MySQL 테이블다루기
저장된 데이터를 삭제하는 DELETE
형식
DELETE FROM 테이블 [WHERE 조건]
member 테이블에서 김백합을 삭제한다.
2.4 JDBC Driver설치하기
MySQL용 JDBC 드라이버는 해당 홈페이지에서 다운 로드 받을 수 있다.
다운로드 받은 zip파일을 압축을 풀어서 그 안의 jar 파일(예 : mysql-connector-java-3.1.14-bin.jar) 을 JDK가 설치된 디렉토리 아래의 lib\ext디렉토리에 복사한다.
아마 C:\Program Files\Java\jdk1.6.0_06\jre\lib\ext가 될 것이다.
2.5 JDBC를 이용한 간단한 프로그램
Select query명령이 아닐때의 구현절차
JDBC driver 로딩
DriverManager를 이용해서 Connection얻기
getConnection();
Connection으로부터 Statement생성
createStatement();
Statement를 이용해서 SQL질의
executeUpdate();
Statement 닫기
close();
Connection닫기
close();
2.5 JDBC를 이용한 간단한 프로그램
import java.sql.*;
public class HelloJDBC{
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName(“org.gjt.mm.mysql.Driver");
String url= "jdbc:mysql://localhost:3306/test";
String id =
“root";
String pass =
“root";
Connection conn= DriverManager.getConnection(url,id,pass);
Statement stmt = conn.createStatement();
String sql= "create table MyHello(namevarchar(20), age int) ";
stmt.executeUpdate(sql);
System.out.println(" MyHello테이블생성OK!" );
stmt.close();
conn.close();
}
}
2.5 JDBC를 이용한 간단한 프로그램
Select query명령일 때의 구현절차
JDBC driver 로딩
DriverManager를 이용해서 Connection얻기
getConnection();
Connection으로부터 Statement생성
createStatement();
Statement를 이용해서 SQL질의
executeQuery();
ResultSet출력하기
rs.next();
Statement 닫기
close();
Connection닫기
close();
2.5 JDBC를 이용한 간단한 프로그램
import java.sql.*;
public class HelloSelector{
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName(
“org.gjt.mm.mysql.Driver");//JDBC 드라이브로딩
String url= "jdbc:mysql://localhost:3306/test";// DB 연결URL
String id =
“root";
String pass =
“root";
Connection conn = DriverManager.getConnection(url,id,pass);//Connection 얻 어내기
Statement stmt = conn.createStatement();//Statement 생성
ResultSet rs = stmt.executeQuery("select * from member");//ResultSet생성
while(rs.next()){
System.out.print(rs.getString("name") + " ");
System.out.println(rs.getInt("age"));
}
rs.close();
stmt.close();
conn.close();
}
}
3 JDBC 기본 클래스
3.1 Connection
Connection 순서
1. Class.forName()으로드라이버로딩
2. DriverManager의 getConnection()을 이용해서 Connection 객체 생성
3. 필요한 작업
4. 연결 종료 : Connection close()
3.1 Connection
드라이버 로딩
Class.forName("org.gjt.mm.mysql.Driver");
DriverManager를 이용해서 Connection 객체 생성
String url = "jdbc:mysql://localhost:3306/test";
String id = "root";
String pass = "root";
Connection conn = DriverManager.getConnection(url,id,pass);
작업
쿼리와명령처리
Connection 닫기
conn.close();
3.1 Connection
Connection의 속성값들
DatabaseName
접속하려는 SQL서버의 데이터베이스명
User
사용자의 이름
Password
사용자의 비밀번호
PortNumber
TCP 포트번호. 기본값은 1443
ServerName
연결하려는 SQL 서버가 위치하고 있는 IP 주소
3.2 Statement
import java.sql.*;
public class HelloInserter{
//main()의매개변수
//args[0] : 이름
//args[1] : 나이
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String id = "root";
String pass = "root";
Connection conn = DriverManager.getConnection(url,id,pass);
Statement stmt = conn.createStatement();
String sql = "insert into MyHello values('" +args[0]+ "'," +args[1]+ ")";
int r = stmt.executeUpdate(sql);
System.out.println(r + " 데이터삽입OK" );
stmt.close();
conn.close();
}
}
3.3 ResultSet
import java.sql.*;
public class HelloSelector{
public static void main(String[] args)
throws ClassNotFoundException, SQLException{
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String id = "root";
String pass = "root";
Connection conn = DriverManager.getConnection(url,id,pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from MyHello");
while(rs.next()){
System.out.print(rs.getString("name") + " ");
System.out.println(rs.getInt("age"));
}
rs.close();
stmt.close();
conn.close();
}
}
4 데이터베이스 Query 처리
4.1 Statement
스테이트먼트의 종류
Statement
PreparedStatement
CallableStatement
Statement
하나의 쿼리를 사용하고 나면 더이상 사용할 수 없다.
PreparedStatement
하나의 PreparedStatement로 쿼리를 여러 번 처리할 수 있다.
CallableStatement
데이터베이스 내의 저장프로시저(Stored Procedure)를 호출할 수 있는 스테이트먼트
4.1 Statement
스테이트먼트의 의미
자바에서 사용되는 3가지 종류의 스테이트먼트들은 데이 터베이스로 쿼리를 담아서 보내는 그릇 정도로 생각하면 된다.
즉 스테이트먼트에 쿼리를 실어 데이터베이스로 보내버리 면 데이터베이스에서 처리되는 것이다.
이 때 한번 사용하고 버리는 그릇은 Statement이며, 재사 용 가능한 그릇은 PreparedStatement이다.
4.2 PreparedStatement
주로 반복되는 query문에 사용된다.
반복적으로 사용될 SQL query를 PreparedStatement에 고정시킨 후 처리될 데이터만 바꾸어가며 작업이 가능하다.
데이터가 삽입될 위치에 위치표지자 ?를 사용한다.
장점
해당 query가 DBMS을 미리 parsing즉 준비(prepared) 되어 있다는 점에서 속도가 빠르다는 장점이 있다.
물론 그 차이는 건당 비교하면 미미하다
그러나 수백만건의 query가 오고가는 시스템을 염두해 둔다면 이러한 차이도 크게 작용할 수가 있다.
4.2 PreparedStatement
import java.sql.*;
public class PreparedInserter{
public static void main(String[] args)throwsClassNotFoundException, SQLException{
Class.forName("org.gjt.mm.mysql.Driver");
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root",“root");
String sql= "insert into MyHello(name, age) values (?, ?)";
PreparedStatementpstmt= conn.prepareStatement(sql);
String[][] data =
{{"변강쇠", "20"}, {"어사또", "50"}, {"월매", "50"}, {"방자", "25"}, {"향단이", "15"}};
for(inti=0; i < data.length; i++){
pstmt.setString(1, data[i][0]);
pstmt.setInt(2, Integer.parseInt(data[i][1]));
pstmt.executeUpdate();
}
pstmt.close();
conn.close();
System.out.println("데이터업데이트완료!!");
}
}
5 데이터베이스 고급기법
5.1 개요
데이터베이스의 처리 속도
데이터베이스의 처리에서 가장 많은 시간을 필요로 하는 부분은 데이터베이스의 로그인 부분이다.
컨넥션 풀링(Connection Pooling)
프로그래밍 시작할 때 미리 컨넥션(Connection)을 여러 개 개설한 뒤 필요할 때 생성한 컨넥션을 사용하는 기법
DB연결과 사용에 대한 보다 쉬운 접속과 효율적인 연결관 리를 위해서 일반적으로 사용되는 기법이다.
JDBC 사용의 고급기법
Connection Factory 기법
Connection Pooling 기법
5.2 Connection Factory 기법
Connection을 생산하는 공장클래스라는 것을 두었 다고 생각하면 된다.
즉, Connection을 얻어오는 부분을 별도의 class로 만들어 둔다는 얘기이다!
이른바 ConnectionFactory를 이용해서 Connection을 생성하게 하는 것이다.
이 클래스는 특이하게 생성자의 접근지정자가 private이다.
이렇게 되면 외부에서 무분별하게 객체를 생성할 수 없다.
즉, 단 하나만의 객체를 생성하게 하는 방법인데,
이러한 방법을 Singleton기법이라고 한다.
Design pattern에 나오는 개념중 하나이다.
5.2 Connection Factory 기법
Connection 필요
createConnection()
(Connection 생성)
사용자 프로그램
Connection Factory
Oracle
MS SQL
Mysql
ConnFactory 클래스
Connection 요구
1
Connection 생성
2
Connection 제공
3
Connection
이를 도식화 하면 다음과 같다.
5.3 Connection Pooling이란
Connection Pooling 기법
미리 컨넥션을 일정 수만큼 생성시킨 뒤 컨넥션을 빌려주고 다시 반환받는 형식으로 컨넥션을 관리한다.
컨넥션 풀에서 필요한 만큼 Connection을 미리 생성
Connection이 필요할 때 컨넥션 풀에서 빌려서 사용
사용이 끝난 다음에는 Connection을 컨넥션 풀에 반환
ConnectionFactory는 필요시에 생성을 하고 종료하는 방식 임에 반해 다른 기법이라는 점을 명심해야 할 것이다.
Connection Pooling 기법의 장점
Connection Pooling 기법을 이용하면 데이터베이스에 연결하 는 시간을 절약할 수 있다.
5.3 Connection Pooling이란
이를 도식화 하였다.
getConnection()
Connection conn
…
…
…
…
…
releaseConnection(conn)
사용자 프로그램
Connection
Connection
Connection
Connection
Connection Pool
Connection Pooling
createConnection()
ConnFactory
Connection
Connection
Connection
releaseConnection(conn)
Connection 요청
1
conn의 사용
2
Connection 반환
3
Connection Pool에 남아 있는Connection이
있다면 getConnection()으로 Pool에서 Conneciton을 빌린다.
빌린 Connection을
releaseConnection()으로 반환한다.
Connection Pool에서 미리 정해진 개수의 Connection을ConnFactory를이용해서개 설한다.