현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

우리가 JSP로 많은일을 하지만 그중에 가장 기본으로 배우는 것이 게시판이다.
생각해보자 수많은 사람들이 게시판을 읽고 글을 쓰고 수정을 한다.
만약 내가 게시판의 글을 읽을 때 혹은 글을 쓸때 그 글이 어디에 저장되며 어디서 가져올까?
바로 데이터베이스를 이용하여 가져오는 것이다.

JSP뿐만 아니라 거의 모든 웹 프로그래밍 언어는 데이터베이스와 뗄수 없는 관계이다.
각 언어마다 데이터베이스와의 연결 방법은 조금씩 다른데
JAVA에서는 Database관련 작업을 할때 사용하는 Package를 JDBC(Java DataBase Connectivity)라고 부른다.
이 JDBC를 이용시 최대의
장점은 Interface기반으로 Database를 연결하기 때문에
어떠한 Database를 사용해도 소스의 변경의 거의 없다
는 것이다.
(각 데이터베이스마다 원래는 서로 다른 명령을 내려줘야 하지만
JDBC를 사용하면 한가지 소스로 모든 데이터베이스에 동일한 명령을 내려줄수 있다는 것이다.)



자 그럼 JDBC를 이용하여 데이터베이스와 연결을 해보도록 하자.
JDBC로 DB와 연결시 아래 5가지를 실행시켜야 하는데 꼭 기억해두길 바란다.
1. Drivers Loding
2. DB접속

3. SQL실행 준비
4. SQL실행
5. DB접속 종료

자 그럼 첫번째부터 하나하나 알아보자.

 
1. Drivers Loding
데이터베이스의 종류는 상당히 많다.
이렇게 많은 데이터베이스 종류로 인해 에플리케이션에서 데이터베이스에 접근하고
데이터를 처리하는 방법이 각각 달라 개발에 애로사항이 발생한다.

하지만 JDBC는 각 Database 회사에서 JDBC의 인터페이스에 맞게 
자신들의 Connector Driver(연결드라이버)를 jar파일로 제공하고 있기때문에
이 Driver를 로딩만 하면 나머지는 그냥 JDBC의 문법으로만 제어가 가능해진다.

그럼 Connector Driver를 설치하는 방법부터 알아보자.

각 DB의 홈페이지를 보면 JDBC커넥터를 제공해주는데 대표적으로 MySQL과 Oracle만 알아보자.
MySQL은 아래와 같이 홈페이지의 다운로드 메뉴에서 쉽게 찾을수 있다.

위 Connector/J가 JDBC용 Connector이다.

오라클 같은경우도 오라클 홈페이지의 다운로드 페이지를 보면 쉽게 찾을수 있다.



다운로드 페이지에 보면 Driver다운로드가 있는데 JDBC를 클릭하면 아래그림과 같이 오라클 버전마다 Driver를 제공한다.


자 그럼 필자는 오라클 10g를 기준으로 설명하도록 하겠다.
다운로드를 클릭하면 페이지가 한번더 바뀔것인데 ojdbc14.jar파일을 다운받으면 된다.
(오라클이 없는 경우 MySQL용 Connector을 다운받아도 무방하다.
위에서 말했듯이 드라이버만 다르지 어차피 쓰는 명령어는 같으니 상관없다.
MySQL같은 경우는 zip파일을 다운받아 압축을 풀면 그 안에 mysql-connector-java-****.jar파일이 있다.)


그럼 이제 드라이버를 설치해야되는데 말이 설치지 그냥 jar파일을 읽을수 있도록 하면된다.
jar파일을 읽을수 있게 하는 방법은 여러방법이 있는데
1. jre의 lib/ext폴더에 jar파일을 복사해 놓는다.
2. classpath설정을 하여 Connector가 존재하는 폴더를 지정해 둔다.
위와 같은방법을 주로 사용하며 위 방법은 자세한 설명은 후에 하도록 하겠다.
필자는 일단 이클립스의 기능을 사용하여 잠시 참조하는 형식을 사용할것이다.


일단 자바 프로젝트를 하나 생성한다.
프로젝트를 생성하면 위와같이 src와 JRE라이브러리가 불러와 질것이다.
 


프로젝트명에서 오른쪽 클릭을 한뒤 Build Path -> Add External Archives... 를 클릭한다.
 


그리고 자신의 드라이버를 선택하여 확인을 눌러준다.

자 그럼 참조라이브러리가 생성되며 그 밑에 드라이버가 불러와 진것을 확인할수 있다.

이 방법은 오라클 외에 다른 데이터베이스도 동일하게 적용되며
jdbcTest 프로젝트에서만 참조 되는것이기 때문에 JDBC를 사용할 필요가 없는
다른 프로젝트에서는 적용이 되지 않는다.

자 위의 방법은 컴퓨터에 그래픽 카드를 꼽은것이라고 볼수 있다.
우리가 그래픽카드를 컴퓨터에 꼽았다고 그래픽카드가 바로 컴퓨터에 적용되지 않듯이
Connector 또한 jar파일을 불러만 왔다고 바로 적용되는것이 아니다.

그래픽카드를 적용할려면 Driver를 설치해야 듯이
Connector을 적용할려면 Driver를 메모리상에 올려 놔야 된다.

자 그럼 Driver를 메모리에 올려 놓을려면 어떻게 해야될까?
가장 간단한방법은 객체화를 시켜주면 된다.

각 Connector jar파일을 보면 Driver 클래스가 있는것을 확인할수 있는데
오라클 같은 경우는 oracle.jdbc.driver 패키지 안에 OracleDriver.class가 있는것을 확인할수 있다.

그럼 객체화를 시켜보자.
oracle.jdbc.dirver.OracleDriver od = new oracle.jdbc.driver.OracleDriver( ); 
혹은
import oracle.jdbc.dirver.*

new OracleDriver( ); 
(메모리에만 올리면 되기때문에 굳이 참조변수를 선언 하지 않아도 된다.) 
위처럼 객체화만 시키면 Driver Loding이 완료되게 된다.

자 그런데 여기서 위와 같은 방법을 사용하면 후에 데이터베이스를 교체하게 될일이 생기면 조금 불편하다. 

그래서 JAVA에서 제공하는 메소드가 있는데 forName( )이란 메소드이다.
forName( )란 메소드는 Class란 클래스에 속한 메소드로 인자로 받은 문자열에 해당하는 클래스의
객체를 생성해 메모리 공간에 로딩하는 기능을 가지고 있다.

Class.forName("oracle.jdbc.driver.OracleDriver");

(forName( ) 메소드는 static메소드이기 때문에 따로 객체화를 시켜주지 않아도 사용이 가능하다. )

좀더 편하게 할려면 
forName는 문자열을 인식하기때문에 
String형 변수를 생성해 놓고 그 변수에 Driver위치만 넣어주면 된다.
그리고 마지막으로 이 코드가 실행될 때 클래스 로더가 클래스 패스를 참조해서 해당하는 클래스를 찾지 못한다면
ClassNotFoundException을 만나게 되므로 예외처리를 해주면 된다. 

String Driver = "oracle.jdbc.driver.OracleDriver";

try {

Class.forName(Driver);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

자 위와 같이 코드를 짜두면 후에 데이터베이스를 교체한다고 해도 Driver변수만 바꿔주면 되는것이다.
(mySQL같은 경우는 "org.gjt.mm.mysql.Driver"를 넣어주면 된다.)
 
2. DB접속
자 드라이버를 로딩했으니 이제 DB에 접속을 해보자.
DB접속하기전에 필요한 것들이 있다.
기본적으로 데이터베이스에 접속할려면 당연히 필요한것이 아이디와 비밀번호이다.
그외에 더 필요한것이 있는데 바로 DB의 위치와 종류를 가르쳐주어야 한다. 

private String url = "jdbc:oracle:thin:@127.0.0.1:1521:testdb";

private String dbid = ""

private String dbpass = "";

dbid와 dbpass는 따로 설명안하겠다.

자 url을 살펴보자. 

jdbc:db종류:접속타입@접속할db의주소:포트번호:db이름;

jdbc:는 우리가 일상적으로 사용하는 http://처럼 사용하는 하나의 약속이다.
그리고 난뒤 db종류를 적어주는데 우리는 오라클을 사용한다.
접속타입은 필자도 잘 모르겠다. 일단은 thin타입으로 접속을 하자!
그리고 난뒤 db주소를 적어주는데 127.0.0.1은 루프 아이피로 자신의 컴퓨터로 다시 돌아간다.
자신의 컴퓨터 ip를 찾기 귀찮으면 그냥 127.0.0.1로 사용해도 무관하다.

포트번호는 따로 설정하지 않는 이상 1521이 오라클DB의 기본 포트번호이다.
그후에 자신이 사용할 db의 이름을 적어주면 된다.
(mysql의 경우 접속타입이 필요없으며 기본포트번호는 3306이다. 그리고 ip주소에 @가 아닌 //가 들어간다.
보통 mysql을 연결할때는 charset도 설정해준다.  필자가 예전에 잘못 알고 적은 포스팅이긴 한데
http://mirwebma.tistory.com/6 로 들어가면 mysql DB접속까지의 설명이 적혀있다.)


자 그러면 이제 DB에 접속하기 위한 모든 조건이 갖춰졌다.
그럼 DB에 접속을 해보자.

private String url = "jdbc:oracle:thin:@255.255.255.255:1521:dbname";

private String dbid = ""

private String dbpass = "";


Connection conn = DriverManager.getConnection(
url, dbid, dbpass);
위에서 사용된 DriverManager 클래스의 역활은 사용 가능한 드라이버를 추적해 그 드라이버에 맞는
데이터베이스와의 접속을 확립하며 드라이버의 로그인 시간 및 로그의 출력등을 알아내는 클래스이다.

그중 getConnection 메소드는 
인자로 데이터베이스의 주소와 접속아이디, 패스워드를 가지며
인자로 들어오는 값에 따라서 특정 데이터베이스 벤더가 구현한 Connection타입의 객체를 반환한다.
즉 Connection객체를 얻었다는 것은 데이터베이스와 연결 상태가 되었음을 의미한다.

필자는 위에서 준비한 String형 변수 url, dbid, dbpass을 사용하여 getConnection메소드의 인자로 주었다.

자 그럼 실험을 해보도록 하자.

package com.itwill.jdbc;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;


public class ConnectionTest {

private String driver = "oracle.jdbc.driver.OracleDriver";

private String url = "jdbc:oracle:thin:@255.255.255.255:1521:dbname";

private String dbid = ""

private String dbpass = "";

public ConnectionTest(){

try {

Class.forName(driver);

System.out.println("드라이버 로딩완료!!!!!");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

 

private void connect() {

try {

Connection conn = DriverManager.getConnection(url, dbid, dbpass);

System.out.println("DB 연결완료!!!");

} catch (SQLException e) {

e.printStackTrace();

}

}



public static void main(String[] args) {

ConnectionTest ct = new ConnectionTest();

ct.connect();

}

}


결과

드라이버 로딩완료!!!!!

DB 연결완료!!!

DB연결이 된것을 확인할수 있다.

자 다시한번 main Method부터 차례로 보도록 하자.
ConnectionTest ct = new ConnectionTest(); 으로
ConnectionTest 클래스에 대한 객체를 생성하였다.
객체를 생성하면서 실행되는 생성자 구문을 보면 드라이버 로딩구문이 들어가있다.
그러므로 객체를 생성과 동시에 드라이버를 로딩하게 되는것이다.
그후 ct.connect();  메소드를 실행하면서 DB와 연결을 하게 된다.

getConnection 메소드의 인자로 잘못된 인자로 주었을때 데이터베이스 엑세스 오류가 나기때문에
SQLException으로 예외처리 해주었다.


자 그럼 여기까지 DB와의 연결을 배워보았다.
한번의 포스트로 다 적기 양이 너무 많아서 나머지 부분은 다음 포스트에서 다시 적기로 하겠다. 

+ Recent posts