Java

[Java] JDBC를 이용해 Java에 Oracle Database 연동하기

나루나른 2024. 3. 28. 20:16

JDBC란?

Java Database Connectivity(JDBC)는 자바에서 다양한 데이터베이스에 접근하고 조작할 수 있도록 하는 API의  집합이다.  SQL 명령어를 실행하여 데이터를 조회(select), 삽입(insert), 업데이트(update), 삭제(delete) 등을 할 수 있으며, 이러한 데이터베이스 작업을 자바 코드 내에서 직접 수행할 수 있다.

 

JDBC를 이용해 오라클 DB 연동하기

자바 프로젝트와 DB를 연동하기 위해서는 JDBC 드라이버가 필요하다. JDBC 드라이버는 각 DB를 만든 회사 홈페이지에서 따로 다운로드가 가능하며, 오라클의 경우 해당 오라클 데이터베이스 파일 내에 .jar 확장자 파일로 내장되어 있으며, 오라클 공식 홈페이지에서 별도로 다운로드가 가능하다. 

(Oracle JDBC Download : https://www.oracle.com/kr/database/technologies/appdev/jdbc-downloads.html )

오라클 공식 홈페이지 (JDBC의 버전마다 어느 버전의 JDK까지 지원한다는 내용이 포함되어있다.)

 

 

오라클 데이터 베이스 내에 내장된 JDBC의 위치 : C:\app\User\product\18.0.0\dbhomeXE\jdbc\lib

 

 

 

먼저 Java EE를 통해 jdbc를 사용할 Dynamic Web Project를 생성한다. 

(필자는 jdbctest 라는  Java Project를 통해 JDBC 연동을 테스트 할 예정이다.)

 

프로젝트를 생성할 때 마다 일일히 Bulid Path할 번거로움 없이 jdbc.jar 파일을 복사해서 해당 경로에 붙여 넣어주면 된다.

oracle jdbc.jar를 붙여넣을 경로

 

코드 실행 순서

JDBC를 이용해 DB를 연동해서 사용하는 경우 꼭 try-catch 블록 안에서 사용해야한다.  언제나 예상치 못한 에러가 발생할 수 있기 때문이다.  

 

1. 오라클 DB 서버 연결 관련 정보를 작성한다.

//오라클 DB 서버 연결 관련 정보
String url = 	"jdbc:oracle:thin:@localhost:1521:xe";//오라클의 설치 경로
String user = "system";//오라클 db 관리자 계정
String password = "1234";//비밀번호
String driver = "oracle.jdbc.driver.OracleDriver";//무슨 드라이버를 통해 연결할지를 나타냄

먼저 오라클 DB 접속을 위한 정보를 문자열로 저장한다. 여기서는 오라클의 관리자 계정인 'system'을 이용해 접속한다.

 

2. 드라이버 연동을 위한 클래스를 생성한다.

//오라클 드라이버 연결을 위한 Connection 클래스
Connection con = null;

// PreparedStatement :  자바에서 입력된 코드를 sql 형식의 문자열로 변환해주는 클래스(sql 사용)
//sql 인젝션 공격 방어를 위해 주로 사용함
PreparedStatement pstmt = null;

//select한 값을 저장할 ResultSet 클래스
ResultSet rs = null;

 

만약 해당 클래스를 선언했을 시 오류 표시가 보인다면 import java.sql.* 패키지를 import 해주면 된다.

 

예외처리를 위해 try - catch 블록 안에 해당 코드를 작성해주면 Java에서 DB를 사용하기 위한 모든 준비가 끝마쳐졌다.

 

JDBC 사용 예 1)

public class jdbctest {
	public static void main(String[] args) {
		
		//java내에서 db 사용을 위해선 무조건 try-catch 블록 안에서 사용해야한다.
		try {
			//오라클 DB 서버 연결 관련 정보
			String url = 	"jdbc:oracle:thin:@localhost:1521:xe";//오라클의 설치 경로
			String user = "system";//오라클 db 관리자 계정
			String password = "1234";//비밀번호
			String driver = "oracle.jdbc.driver.OracleDriver";//odbc8.jar oracle.jdbc.driver.OracleDriver
			
			//드라이버 로딩 
			Class.forName(driver);
			
			//오라클 DB 서버 연결
			Connection con = DriverManager.getConnection(url, user, password);
			
			System.out.println("오라클 DB 서버 연결 성공");
			
			//SQL문 작성
			//주의사항 SQL 종결문자 ; 를 쓰면 오류남
			StringBuilder sql = new StringBuilder();
			sql.append("INSERT INTO sungjuk(sno, uname, kor, eng, mat, addr, wdate)");
			sql.append("VALUES(sungjuk_seq.nextval,'코리아', 80, 65, 90, 'Jeju', sysdate)");
			
			//sql 형식으로 변환 PreparedStatement : 변수를 문자열로 변환해주는 명령어
            		//sql 인젝션 공격 방어를 위해 주로 사용함
			PreparedStatement pstmt = con.prepareStatement(sql.toString());
			
			//sql문 실행
			int cnt = pstmt.executeUpdate();//Insert, Update, Delete문 실행
			System.out.println("실행결과" + cnt);
			
			//자원반납 순서주의(후순위부터 닫음)
			pstmt.close();
			con.close();
			
			
		} catch (Exception e) {
        	//예외 상황 발생시 오류 메세지 출력
			System.out.println("오라클 DB 서버 연결 실패 : "+e);
		}
	}

}

 

 

JDBC 사용 예 2)

public class jdbctest {

	public static void main(String[] args) {
		//특정한 db 일련번호의 값을 출력
		int sno = 12;//일련번호
		
		Connection con = null;//db연결을 위한 클래스
		PreparedStatement pstmt = null;//sql문 사용을 위한 클래스
		ResultSet rs = null;//결과 출력을 위한 클래스	
		
        //무조건 try-catch 블록 안에서 처리
	try {
            String url      = "jdbc:oracle:thin:@localhost:1521:xe";//orale db 경로
            String user     = "system";//접속할 계정
            String password = "1234";//비밀번호
            String driver   = "oracle.jdbc.driver.OracleDriver";//사용할 driver          
           
            //드라이버 로딩 
            Class.forName(driver);
            
            //오라클 DB 서버 연결
            con = DriverManager.getConnection(url, user, password);            
            
            System.out.println("오라클DB 서버 연결 성공!!");            
            
            //SQL문 작성
	    //주의사항 : Java내에서 SQL문의 종결문자 ';' 를 쓰면 에러 발생
            StringBuilder sql = new StringBuilder();
            
            //특정한 일련번호를 기준으로 행 하나의 데이터를 읽어오기
            sql.append(" SELECT sno, uname, kor, eng, mat, tot, aver, addr, wdate ");
            sql.append(" FROM sungjuk ");
            sql.append(" WHERE sno = ? ");
			
            //sql 형식으로 변환 PreparedStatement : 해당 변수의 값을 문자열로 변환해주는 명령어
            pstmt = con.prepareStatement(sql.toString());
            pstmt.setInt(1, sno);
            
            rs = pstmt.executeQuery(); //result rs변수에 select문 출력
            
            if(rs.next()) {
            	System.out.println("검색 완료 자료를 출력합니다.");
            	
            	//1)칼럼 순서 접근
            	System.out.println(rs.getInt(1));    //1번 칼럼. sno칼럼 가리킴
            	System.out.println(rs.getString(2)); //2번 칼럼. uname칼럼 가리킴
            	System.out.println(rs.getInt(3));    //3번 칼럼. kor칼럼 가리킴
                System.out.println(rs.getInt(4));
                System.out.println(rs.getInt(5));
                System.out.println(rs.getInt(6));
                System.out.println(rs.getInt(7));
                System.out.println(rs.getString(8));
                System.out.println(rs.getString(9));
            	
            	//2)칼럼명으로 접근
                System.out.println(rs.getInt("sno"));
                System.out.println(rs.getString("uname"));
                System.out.println(rs.getInt("kor"));
                System.out.println(rs.getInt("eng"));
                System.out.println(rs.getInt("mat"));
                System.out.println(rs.getInt("tot"));
                System.out.println(rs.getInt("aver"));
                System.out.println(rs.getString("addr"));
                System.out.println(rs.getString("wdate"));
                
            } else {
            	System.out.println("자료가 존재하지 않습니다.");
            }//if end
            
       }catch (Exception e) {
            System.out.println("오라클 JDBC의 데이터를 상세 출력하는데 실패했습니다. : " + e);
        } finally {//자원반납(순서주의/후순의부터 닫음.)
            try {
                if(rs!=null) {rs.close();}
            }catch (Exception e) {}

            try {
                if(pstmt!=null) {pstmt.close();}
            }catch (Exception e) {}
                
            try {
                  if(con!=null) {con.close();}
            }catch (Exception e) {} 			
		}

	}
}

※ 여기서 ResultSet  rs 의 경우 DB의 데이터를 검색(select) 할 경우에만 선언해주면 된다.