자바프로그래밍 언어: JDBC<1>
DBMS와 SQL에 대해 알아본다.
2tier와 3tier의 구조에 대해 알아본다.
JDBC 필요성과 JDBC 코딩에 대해 알아본다.
PreparedStatement의 특징에 대해 알아본다.
CallableStatement의 특징에 대해 알아본다.
Transaction 처리에 대해 알아본다.
JDBC에서 Properties 클래스의 사용 방법에 대해 알아본다.
ResultSetMetaData의 사용 방법에 대해 알아본다.
JDBC2.0 과 JDBC3.0에 대해 알아본다.
Connection Pool에 대해 알아본다.
1. 데이터베이스
데이터 베이스
지속적으로 저장되는 연관된 정보의 모음이다.
즉, 특정 관심의 데이터를 수집하여 그 데이터의 성격에 맞도록 잘 설계하여 저장하고 관리함으써 필요한 데이터를 효율적으로 사용할 수 있는 자원이다.
DBMS(Database Management System)
데이터를 효율적으로 관리할 수 있는 시스템을 말한다.
이런 데이터를 효율적으로 관리하기 위해서는 데이터 베이스에 추가, 삭제, 변경, 검색을 할 수 있는 기능이 있어야 한다.
DBMS 종류
계층형, 네트워크용, 릴레이션형으로 구분된다.
최근에는 릴레이션형 DBMS가 주류를 이루고 있다.
릴레이션형 DBMS를 RDBMS라 하고, 이런 제품으로 Oracle, DB2, MS-SQL, Infomix 등이 있다.
2. 관계형 데이터베이스
기본 키(Primary Key)
기본 키는 테이블의 각 행을 다른 행과 구분해주는 역할을 하는 필드를 말한다.
기본 키는 반드시 ‘유일함’ 이라는 조건을 만족해야 하며, ’값’이 있어야 한다.
즉, NOT NULL 제약 조건과, UNIQUE 제약 조건을 포함해야 한다.
외부 키(Foreign Key)
한 테이블의 기본 키에 기반한 관계를 가지 두 개의 테이블이 있는 경우를 위한 것이다.
외부 키는 테이블 내의 한 열의 필드인 동시에 다른 테이블의 기본 키인 열의 필드를 말한다.
3. SQL
SQL(Standard Query Language)
SQL은 RDBMS의 표준 언어이다.
SQL문을 이용해서 단순한 쿼리뿐만 아니라 데이터 베이스 객체를 만들거나, 제거하고, 데이터를 삽입, 갱신, 삭제하거나 다양한 운영 작업을 할 수 있다.
SQL문이 첫선을 보인 것은 1970년대 IBM에 의해서이며, 이후 ANSI/ISO 표준으로 편입되어 여러 차례의 개량과 개발을 거쳤다.
SQL의 종류는 크게 데이터와 구조를 정의하는 DDL, 데이터의 검색과 수정을 위한 DML, 데이터 베이스의 권한을 정의하는 DCL로 구분할 수 있다.
SELECT문
SELECT 문은 데이터 베이스로부터 저장되어 있는 데이터를 검색하는 방법이다.
SELECT [ALL | DISTINCT] {*|컬럼,…}
FROM 테이블 명
[WHERE 조건]
[GROUP BY {컬럼,…}]
[HAVING 조건]
[ORDER BY {컬럼,…} [ASC, DESC]]
INSERT문
테이블을 사용하여 새로운 행을 삽입하기 위해서 INSERT문을 사용한다.
INSERT INTO 테이블명[(컬럼1[, 컬럼2, … , 컬럼N ])]
VALUES(값1[, 값2, … , 값N]);
또는
INSERT INTO 테이블명
VALUES(값1[, 값2, … , 값N]);
UPDATE문
테이블을 사용하여 기존 행을 변경하기 위해서 UPDATE문을 사용한다.
UPDATE 테이블 명
SET 컬럼1 = 값1 [ , 컬럼2 = 값2 , … , 컬럼N = 값N]
[WHERE 조건];
DELETE 문
테이블을 사용하여 기존 행을 삭제하기 위해서 DELETE문을 사용한다.
DELETE
FROM 테이블 명
[WHERE 조건];
4. JDBC의 탄생 배경과 구조
JDBC(Java Database Connectivity)
JDBC란 자바를 이용하여 데이터베이스에 접근하여 각종 SQL문을 수행할 수 있도록 제공하는 API를 말한다.
각종 DBMS를 통합한 라이브러리 필요성
자바가 데이터베이스에 접근하는 프로그램을 시도할때 한 가지 문제점이 있었다.
문제점 : DBMS의 종류가 다양하고, 구조와 특징이 다름.
자바는 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성하는 JDBC를 개발하게 되었고, 실제 구현은 DBMS의 밴더에게 구현하도록 했다.
각 DBMS의 벤더에서 제공하는 구현 클래스를 JDBC 드라이버라고 한다.
JDBC로 코딩하기 위해서는 DBMS를 선택하고, DBMS에서 제공하는 JDBC 드라이버가 반드시 필요하다.
JDBC의 구조와 역활
JDBC는 크게 JDBC 인터페이스와 JDBC 드라이버로 구성되어 있다.
응용프로그램에서는 SQL문 만들어 JDBC Interface를 통해 전송하면 실제 구현 클래스인 JDBC 드라이버에서 DBMS에 접속을 시도하여 SQL문을 전송하게 된다.
DBMS의 결과를 JDBC Driver와 JDBC Interface에게 전달되고 이를 다시 응용프로그램으로 전달 되어 SQL문의 결과를 볼 수 있다.
JDBC의 역할은 Application과 DBMS의 Bridge 역할을 하게 된다.
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) 이다.
2tier
자바 애플리케이션이 JDBC 드라이버를 통해서 직접 데이터베이스를 접근하는 형식이다.
이 모델에서 JDBC 드라이버는 JDBC API 호출을 통해 특정 DBMS에 직접 전달해 주는 역할을 한다.
3tier
3tier 모델은 2tier 모델에 미들웨어 계층이 추가된 형태이며, 미들웨어에서 DBMS에 직접 질의하게 된다.
3tier 모델은 2tier 모델에 보다 유지보수(Maintenance)에 비용을 절약할 수 있다.
단점은 2tier에 비해 속도는 다소 느리다.
5. JDBC를 이용한 데이터베이스 연결방법
JDBC를 이용한 데이터베이스 연결 방법
1 단계 : import java.sql.*;
2 단계 : 드라이버를 로드 한다.
3 단계 : Connection 객체를 생성한다.
4 단계 : Statement 객체를 생성한다.
5 단계 : SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.
6 단계 : 모든 객체를 닫는다.
드라이버 다운 받기와 설정
JDBC API를 이용해서 DBMS에 접근하기 위해서는 DBMS에서 제공되는 드라이버를 내려 받아야 한다.
만약, 오라클이 설치되어 있다면 아래의 경로에서 드라이버를 제공하고 있다.
오라클이 설치되어 있지 않다면 아래의 주소에서 내려 받으면 된다.
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{
}
드라이버를 로드한다.
JDBC Driver를 로드해야 한다.2 단계 : 드라이버를 로드 한다.
try{
Class.forName(“oracle.jdbc.driver.OracleDriver”);
}catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
}
Class.forName(~)은 동적으로 JDBC 드라이브 클래스를 로딩하는 것이다.
forName(~) 메서드에 매개변수로 오는 OracleDriver 클래스의 객체를 만들어 런타심 메모리에 로딩시켜 주는 메서드이다.
아래와 같이 정의 해도 상관은 없다.
oracle.jdbc.driver.OracleDriver driver =
new oracle.jdbc.driver.OracleDriver ();
실제로 driver 객체는 JDBC 프로그램에서 더 이상 사용하지 않기 때문에 위와 같은 코딩은 잘 사용하지 않는다. 2 단계 : 드라이버를 로드 한다.
Class.forName(~)을 이용하면 OracleDriver클래스가 런타임 메모리에 로딩 되고 DriverManager 클래스의 static 멤버 변수로 저장된다.
만약 이 부분에서 java.lang.ClassNotFoundException
에러가 발생 했다면 다음 2가지 사항을 확인해 보도록 한다.
1. oracle.jdbc.driver.OracleDriver 의 철자가 정확한지
확인해 본다.
2. 이클립스에 ojdbc14.jar 를 등록 했는지 확인해 본다.
Connection 객체를 생성한다.
DBMS와 연결을 담당하는 Connection 객체를 생성한다.
try{
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl",
"scott",
"tiger");
}catch(SQLException sqle){
sqle.printStackTrace();
}
Connection 객체를 얻어 왔다면 DBMS와 접속이 성공적으로 이루어진 것이다.
getConnection() 메서드에 들어가는 url, user, password에 대해서 알아보자
IP - oracle이 설치된 ip를 작성한다.
PORT - oracle의 포트를 작성하는데 일반적으로 설치 하였다면 1521 이다.
ORACLE_SID – oracle를 설치할 때 설정하는 것인데 대부분 일정하지 않다. 따라서 ORACLE_SID를 정확히 찾아 확인한 후에 값을 정하도록 하자.(일반적으로 – ORCL)
user - oracle의 user를 말한다.
password – oracle user에 대한 password를 말한다.
Statement 객체를 생성한다.
오라클과 연결되었다면 SQL문을 전송할 수 있는 Statement 객체를 생성해야 한다.
try{
Statement stmt = con.createStatement();
}catch(SQLException sqle){
sqle.printStackTrace();
}
Statement 객체는 Connection 인터페이스의 createStatement() 메서드를 사용하여 얻어 올 수 있다.
Statement 객체를 생성했다면 SQL를 전송할 수 있는데 Statement 인터페이스에는 SQL문을 전송할 수 있는 여러 가지 메서드 중에 3가지에 대해 살펴 보도록 하자.
executeQuery(String sql) – SQL문이 select 일 경우
Statement stmt = con.createStatement();
StringBuffer sb = new StringBuffer();
sb.append(“select id from test “);
ResultSet rs = stmt.executeQuery(sb.toString());
executeUpdate(String sql) – SQL문이 insert, update, delete문 등일 경우
Statement stmt = con.createStatement();
StringBuffer sb = new StringBuffer();
sb.append(“update test set id=‘syh1011’ “);
int updateCount = stmt.executeUpdate(sb.toString());
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);
}
'처음배우는 IT' 카테고리의 다른 글
자바프로그래밍 언어: JDBC<2> (0) | 2021.01.27 |
---|---|
자바프로그래밍 언어: 네트워크<2> (0) | 2021.01.25 |
자바프로그래밍 언어: 네트워크<1> (0) | 2021.01.24 |
자바프로그래밍 언어: 입출력 스트림 (0) | 2021.01.21 |
자바프로그래밍 언어: Thread (0) | 2021.01.20 |