본문 바로가기

dev/Oracle

[Java] 자바로 Oracle DB 접속 코드 작성하기 (PreparedStatement, Connection 객체)

반응형

 

 

자바 코드로 실행한 데이터 수정은 자동으로 commit 되므로 주의하자.
이 때문에 SQL Developer 등의 다른 프로그램에서도 업데이트된 데이터를 바로 조회할 수 있다.

 

 

Oracle DB에 접속하기 위해서는 다음과 같은 과정을 거쳐야 한다.

 

 

1. private 필드 선언

2. 드라이버 로드 (driver load)

3. DB 접속 (Connection)

4. SQL 구문 준비 (PrepareStatement)

5. 실행 (executeQuery)

6. 접속 종료 (close)

 

 

 

반응형

 

 

1. 필드 선언

우선 드라이버 로딩, 접속, sql 구문 전달에 필요한 필드를 선언한다.

 

 

🔎 샘플 코드

private String driver = "oracle.jdbc.driver.OracleDriver"; 
//JDBC driver class name for Oracle database
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
//Oracle DB url

private String username = "DB_user_name";
private String password = "DB_user_password";

 

 

📄 각 필드 설명

driver: 오라클 데이터베이스에 접속하도록 하는 JDBC 드라이버 class의 이름

url: 오라클 데이터베이스 고유 url

username: 접속하려는 오라클DB 계정명

password: 접속하려는 오라클DB 계정 암호

 

 

다음으로 데이터베이스에 접속하기 위한 인터페이스 Connection과,
자바에서 작성한 SQL문을 데이터베이스로 전달할 가이드라인을 만들어 줄 인터페이스 PreparedStatement가 필요하다.

그런데 두 인터페이스 모두 implements 해서 쓰기에는 추상메소드를 많이 가지고 있다. implements 했을 때 Override 해야 할 메소드가 너무 많은 것이다.

때문에 Connection과 PreparedStatement 객체를 반환하는 메소드를 사용하는 경우가 일반적이며, 두 객체를 각각 반환하는 메소드가 java.sql 패키지 안에 있다.

private Connection conn;
private PreparedStatement pstmt;

 

 

SELECT 등의 sql 구문을 사용해 데이터를 꺼내올 것이라면 ResultSet 객체도 필요할 수 있다.

테이블 형태로 반환되는 데이터를 담아주는 역할을 한다.

private ResultSet rs;
반응형

 

 

 

2. 드라이버 로드

이제 위에서 선언한 필드를 사용해 JDBC 드라이버를 로딩해 준다.

Class.forName() 메서드로 드라이버 클래스를 로드하여 수행한다.

드라이버 클래스는 각 DB 제조사에서 제공하는 jar 파일에 포함되어 있다

(아래 글 참고)

📄 [Java/Oracle] 자바 프로젝트에 OJDBC 드라이버 추가하기

 

 

🔎 샘플 코드

ClassNotFoundException이 발생할 가능성이 있으므로 try-catch문으로 예외 처리를 해주어야 한다.

로딩에 성공하면 "driver loading 완료"라는 메시지가 출력된다.

public void driverLoad() {
    try {
        Class.forName(driver);
        System.out.println("driver loading 완료");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
반응형

 

 

 

3. DB 접속

드라이버 로딩이 완료되면 DriverManager.getConnection() 메서드를 이용하여 DBMS에 접속할 수 있다.

접속 코드는  데이터베이스와 연결되는 여러 메소드를 만들면서 반복해서 사용하게 되므로,
따로 메소드를 만들어 놓으면 끌어다 쓰기 편리하다.

 

 

🔎 샘플 코드

public void connection() {
	try {
		conn = DriverManager.getConnection(url, username, password);
		System.out.println("connection 완료");
	} catch (SQLException e) {
		e.printStackTrace();
	} 
}

 

 

🔎 샘플 코드

드라이버 로드와 접속을 함께 한 메소드에서 실행하려면 다음과 같이 작성한다.

public void connect() {
    try {
        Class.forName(driver);
        System.out.println("Oracle JDBC Driver 로드 완료");

        // 데이터베이스에 연결
        conn = DriverManager.getConnection(url, username, password);
        System.out.println("Oracle 데이터베이스 연결 완료");
    } catch (ClassNotFoundException e) {
        System.out.println("Oracle JDBC Driver 로드 실패");
        e.printStackTrace();
    } catch (SQLException e) {
        System.out.println("Oracle 데이터베이스 연결 실패");
        e.printStackTrace();
    }
}
반응형

 

 

 

4. SQL 구문 준비

데이터베이스 접속에 성공했다면 데이터를 수정하거나 꺼내올 sql 문장을 작성한다.

sql 구문이 길어질 수 있으므로 String 필드를 새로 선언해 작성해 준다.

 

 

보안과 유지관리를 위해 PreparedStatement 객체를 반환하는 prepareStatement() 메소드를 사용한다.

(메소드 스펠링에는 d 없음 주의!)

Java에서 작성한 sql 쿼리를 DB에 사용하기 위한 가이드라인을 잡아준다고 생각하면 쉽다.

사용 시 sql 쿼리의 구문 에러로 발생할 수 있는 SQLException의 예외처리를 위해 try-catch 블록에 넣어준다.

 

 

🔎 샘플 코드

String sql = "SELECT * FROM EXAMPLE";

try {
    pstmt = conn.prepareStatement(sql);
} catch (SQLException e) {
    e.printStackTrace();
}
반응형

 

 

 

5. 실행

이 글의 예시 코드에서는 SELECT문을 사용하여 데이터를 꺼내올 것이므로 (수정하는 것이 아니므로) executeQuery() 메소드로 ResultSet 객체를 반환받는다.

DELETE, UPDATE문 등을 사용해 데이터를 추가, 삭제 등 수정하는 경우에는 executeUpdate() 메소드로 int 형태의 결과를 반환받는다 (업데이트된 행 개수).

 

 

🔎 샘플 코드

try {
	pstmt = conn.prepareStatement(sql);
	rs = pstmt.executeQuery(); //테이블 형태로 결과 반환
	System.out.println("name: " + rs.getString("name"));
	System.out.println("job: " + rs.getString("job"));
} catch (SQLException e) {
    e.printStackTrace();
}
반응형

 

 

 

6. 접속 종료

DB 연결을 위해 생성했던 Connection, PreparedStatement, ResultSet 등의 객체는 반드시 사용 후 close() 메소드로 닫아주어야 한다.

오라클 DB와의 접속은 일종의 세션이고, 이를 유지하기 위해 커넥션(Connection) 객체는 자원을 소비하기 때문이다.

 close() 메소드를 호출하지 않은 상태로 커넥션 객체를 계속 유지하게 되면, 메모리 누수(memory leak) 현상이 발생할 수 있다.

 

 

🔎 샘플 코드

try {
    if(rs != null) rs.close();
    if(pstmt != null) pstmt.close();
    if(conn != null) conn.close();
} catch (SQLException e) {
    e.printStackTrace();
}

 

 

반응형