ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13. JDBC 를 기억하자.!
    Programming/JAVA 2010. 5. 3. 21:12

    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를이용해서개 설한다.
Designed by Tistory.