■ JDBC란?
- 자바 APP과 DB를 연결하여 프로그래밍을 하기 위한 API (또는 이클립스에선 라이브러리라고도 부른다)
- 물리적으로는 jdbcXX.jar 파일을 의미한다.
- 우리는 jdbc.jar안의 드라이버를 통해 모든 종류의 데이터베이스를 사용할 수 있다. (EX. 오라클, mySql 등)
■ 데이터베이스를 연결하기 전에 점검할 사항
1. 현재 내가 만들고자 하는 앱은 무엇인가? - 데스크탑 앱 : 로컬에서 설치, 실행되는 앱 프로그램 - 웹 앱 : 브라우저를 통해 실행되는 앱 프로그램 2. 현재 내가 접속하고자 하는 DB 서버의 위치는 어디인가? - 로컬 서버인가? - 외부 클라우드 서버인가? * DB 서버와의 연결 시, 서버 url과 사용자명, 비밀번호가 필요하기에 미리 알아두는 것이 좋다. 3. IDE를 사용하고 있고 jdbc.jar파일 경로를 입력한 적이 있다면, 라이브러리 경로가 제대로 입력되어 있는가? - 이클립스에 jdbc.jar 파일을 import하고 경로를 옮기면 이클립스는 옮긴 jar파일 경로를 인식하지 못한다. - 이런 경우, 프로젝트의 [properties] - [Libraries] 에서 jar파일 위치를 재설정하는 게 필요하다. - 자주 발생하는 미스사항이므로 미리 고려해두자. + 이클립스에서 처음 프로젝트를 생성할 때, JRE 버전 확인하기 - JRE 버전을 높히고 다시 낮추었을 때, jdbc.jar의 위치를 인식하지 못하는 오류가 있었다. (이유는 구글링을 해도 나오지 않아 명확하진 않지만...) - 처음 프로젝트를 생성할 때부터 JRE 버전을 유의해서 생성하는 게 필요하다. |
■ JDBC 프로그래밍을 위한 환경설정
- 프로젝트 생성 시, jdbc.jar파일 경로를 입력하기
■ JDBC 프로그래밍 절차
[ Statement를 사용한 경우 ]
- Statement는 보안성 낮다
- Secure Coding을 위해 PreparedStatement를 사용하는게 좋다. (다음 포스팅 참조)
1. DB 드라이버 로딩 2. Connection 객체를 통해 서버와 연결 3. Statement 객체를 통해 SQL명령 처리 가. SQL 명령어 세팅 : String sql = "select * from table_test"; 나. SQL 명령 -> DB전송 : conn.executeQuery(sql) - 조회 제외 : executeUpdate() 메소드 사용 - 조회 명령 : executeQuery() 메소드 사용 다. 명령에 따라 구분 분석(Parsing) 라. 실행 - 조회 제외 : create, alter, update... 등 실행 - 조회 경우 : ResultSet 객체를 통해 조회 결과를 담아 처리 4. close() 메소드를 통해 연결 해제 *연결 해제는 연결한 순서의 역순으로 해제한다. |
[1] DB 드라이버 로딩
class Unknown{
static {
Class.forName(" /* DB 드라이버 이름 */ ");
}
/* 메인 메소드 * /
}
- 오라클 : oracle.jdbc.driver.OracleDriver - MySQL : com.mysql.jdbc.Driver |
▼ 위와 같이 드라이버 로딩을 하는 이유는? - 더보기 선택
- jdbc.jar 파일을 가져오면 라이브러리를 쓸 수 있는 상태가 된다.
- 자바 라이브러리처럼, jdbc 라이브러리에서 제공하는 클래스들이 있는데,
그 중에 하나가 OracleDriver이다.
- 라이브러리만 가져온다고 클래스 내의 기능을 쓸 수 있는 것은 아니기 때문에, OracleDriver 클래스를 사용하기 위하여 드라이버 로딩을 해주는 것이다.
[2] Connection 인스턴스를 통해 서버와 연결
import java.sql.Connection;
import java.sql.DriverManager;
class Unknown{
static {
Class.forName(" /* DB 드라이버 이름 */ ");
}
public static void main(String args[]){
//서버 url, user, pwd 정보 가져오기
String url = " /* 서버 연결 정보 */ ";
String user = "계정명";
String pwd = "비밀번호"; //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
//DriverManager 객체를 통해 Connection 인스턴스 형성(싱글톤 방식)
Connection conn = DriverManager.getConnection(url, user, pwd);
}
}
* 이클립스 내에서 아래 서버 연결 정보는 [Database Connections] - [Properties] - [Driver Properties]에서 얻을 수 있다.
양식 | jdbc:[DBMS]:[데이터베이스식별자] |
Oracle | jdbc:oracle:드라이버종류:@호스트명:포트명:SID |
MySQL | jdbc:sqlserver://호스트명:포트명;databaseName=DB |
[3] Statement (또는 PreparedStatement *이 부분은 다음 포스트에서) 인스턴스를 사용하여
- Statement는 보안성 낮다. 중요하니 다시 안내
아래의 코드는 조회를 한 경우 이나, Statement의 execureUpdate() 메소드를 사용하면 그 외의 명령도 수행할 수 있다. |
import java.sql.Connection;
import java.sql.DriverManager;
class Unknown{
static {
Class.forName(" /* DB 드라이버 이름 */ ");
}
public static void main(String args[]){
//1. [연결]
//서버 url, user, pwd 정보 가져오기
String url = " /* 서버 연결 정보 */ ";
String user = "계정명";
String pwd = "비밀번호"; //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
//DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
Connection conn = DriverManager.getConnection(url, user, pwd);
//2. [Statement]
//가. SQL문 세팅
String sql = " /* SQL문 */ ";
//나. SQL명령 -> DB전송
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
//다. 실행
//ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
//.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
while(rs.next()){
String name = rs.getString("name"); // 칼럼의 헤딩
int score = rs.getInt("score");
system.out.println(name + ":" + score);
}
}
}
[4] 사용한 것을 역순으로 닫는다.
import java.sql.Connection;
import java.sql.DriverManager;
class Unknown{
static {
Class.forName(" /* DB 드라이버 이름 */ ");
}
public static void main(String args[]){
//1. [연결]
//서버 url, user, pwd 정보 가져오기
String url = " /* 서버 연결 정보 */ ";
String user = "계정명";
String pwd = "비밀번호"; //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
//DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
Connection conn = DriverManager.getConnection(url, user, pwd);
//2. [Statement]
//가. SQL문 세팅
String sql = " /* SQL문 */ ";
//나. SQL명령 -> DB전송
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
//다. 실행
//ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
//.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
while(rs.next()){
String name = rs.getString("name"); // 칼럼의 헤딩
int score = rs.getInt("score");
system.out.println(name + ":" + score);
}
//3. [역순으로 닫는다]
rs.close();
stmt.close();
conn.close();
}
}
[출처]
- JDBC https://dyjung.tistory.com/50
- 데스크탑 앱 또는 웹 앱 https://appmaster.io/ko/blog/deseukeutab-aeb-ddoneun-web-aeb-jangdanjeom
'Language > SQL' 카테고리의 다른 글
[DATABASE] 자바를 통한 DB 모듈화 (0) | 2022.04.23 |
---|---|
[DATABASE] PreparedStatement를 사용하여 시큐어코딩하기 (0) | 2022.04.21 |
[DATABASE] JOIN (0) | 2022.04.21 |
[DATABASE] SEQUENCE, INDEX (0) | 2022.04.21 |
[DATABASE] DB모델링, 정규화와 이상현상, 역정규화 (0) | 2022.04.19 |