기록하는 코더

[JAVA] 드라이브 연결 방식 본문

JAVA

[JAVA] 드라이브 연결 방식

damda_di 2023. 1. 15. 01:12

1️⃣일반 연결

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// oracle에만 접속할 수 있음 ==> 다른 데이터베이스 환경에선 실행불가
// JDBC 드라이버를 로딩하고 DB서버에 연결된 Connection 객체를 생성하는 메서드로 구성된 class
public class DButil {
	static {
		try {
			// Class 파일은 소스파일을 컴파일을 한 파일
			// 소스파일이 아닌 경우는 내용변경 불가
			
			// text 파일에 연결 정보를 저장해서 입력해주는 방식으로 연결
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패!");
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		try {
			return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","DB접속아이디","DB접속패스워드");
		} catch (SQLException e) {
			System.out.println("DB 연결 실패 ! ");
			return null;
		}
	}
}

 


2️⃣Properties 객체 이용

Properties는 Hashtable의 하위 객체이므로 key와 value의 형태!

package kr.or.ddit.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

// JDBC 드라이버를 로딩하고 DB서버에 연결된 Connection 객체를 생성하는 메서드로 구성된 class
// (dbinfo.properties 파일의 내용을 이용한 설정)

// 방법1) Properties객체 이용하기

public class DButil2 {
	static Properties prop;	// Properties 객체 변수 선언
	
//	{	// 인스턴스 초기화 블록 ==> 생성자보다 먼저 실행됨
//		System.out.println();
//	}
	
	static { // static 초기화 블록
			prop = new Properties(); // Properties 객체 생성
			File f = new File("res/kr/or/ddit/config/dbinfo.properties");
			FileInputStream fin = null;
			
			try {
				fin = new FileInputStream(f); // 파일 입력용 스트림 객체 생성
				prop.load(fin);				  // 파일 내용 읽기
				
//				Class.forName("oracle.jdbc.driver.OracleDriver");
				Class.forName(prop.getProperty("driver"));
			
			} catch (Exception e) {
				System.out.println("드라이버 로딩 실패!");
				e.printStackTrace();
			}finally {
				if(fin!=null)try {fin.close();}catch(IOException e) {}
			}
		}
	
	public static Connection getConnection() {
		
		try {
			
			return DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("user"),prop.getProperty("pass"));
			
		} catch (SQLException e) {
			System.out.println("DB 연결 실패 ! ");
			return null;
		}
	}
}

 

properties 객체

더보기
package kr.or.ddit.basic;

import java.util.Properties;

public class PropertiesTest {
	
	/*
		Properties 객체
		
		- Properties객체는 Map보다 축소된 기능의 객체라고 할 수 있다.
		
		- Map은 key값과 value값에 모든 형태의 객체를 사용할 수 있지만
		  Properties 객체는 key값과 value값에 String만 사용할 수 있다.
		  
		- Map은 put(), get() 메서드를 이용해서 데이터를 저장하고 읽고하는 작업을 수행하지만
		  Properties는 setProperty(), getProperty() 메서드를 이용해서 읽고 쓰기 작업을 수행한다.
		  
		- Properties 객체는 데이터를 파일로 입출력 할 수 있다.
	*/
	
	public static void main(String[] args) {
		// 객체 생성
		Properties prop = new Properties();
		// 제네릭을 사용x => String만 사용
		
		prop.setProperty("name", "홍길동");
		prop.setProperty("age", "20");
		prop.setProperty("tel", "010-1234-5678");
		prop.setProperty("addr", "대전");
		
		int num = 30;
		prop.setProperty("num", "" + num);
//		prop.setProperty("num", String.valueOf(num));
		
//		System.out.println(prop);
		//---------------------------------------------
		String name = prop.getProperty("name");
		int age = Integer.parseInt(prop.getProperty("age"));
		int num2 = Integer.parseInt(prop.getProperty("num"));
		String tel = prop.getProperty("tel");
		String addr = prop.getProperty("addr");
		
//		float fff = Float.parseFloat("3.14f");
//		double ddd = Double.parseDouble("3.14");
		
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("번호 : " + num);
		System.out.println("전화 : " + tel);
		System.out.println("주소 : " + addr);
		
		System.out.println("---------------------------------------------");
		
		
		/*
		 scan.next(), scan.nextLine()
		 Scanner에 자료가 있는지 확인하고 입력 -> buffer에 저장 -> buffer에 저장된 정보를 읽어옴
		 
		 * next(), nextInt(), nextFloat()
		 	- 공백, tap키, 엔터키를 기준으로 분리해서 분리된 데이터를 중 첫번째 데이터 하나를 반환한다.
		 
		 * nextLine()
		 	- 처음부터 엔터키까지 읽어간다. 
		 	- 엔터키를 뺀 데이터를 반환
		
		 
		 buffer에 있는 입력값을 가져가고 입력 buffer에 엔터키값만 남음
		  - next(), nextLine(),nextFloat()는 데이터로 취급x
		  - 데이터가 없는 걸로 인식 => 입력
		 
		next(),nextInt()..인 경우
		 - 입력할때 이전 데이터를 가져가고 남은 데이터를 가져오려고 함
		 ex) 주소 :  대전시 중구 => 첫번째 데이터 하나를 가져가서 저장
		 	 			    중구		 => 남은 데이터 (다음 데이터 저장에 사용됨 => 오류발생)
		 	 
		 nextLine()의 경우
		 - 처음부터 엔터키값까지 읽어가야함 => 엔터키가 데이터!
		 - 입력을 하지 않았는데도 앞의 엔터키를 가져감
		  (엔터키를 제외한 데이터(공백)을 반환)
		 
		 ex)
	  		System.out.println("전화번호 >> ");
			String tel = scan.next();
			System.out.println("주 소 >> ");
			String addr = scan.nextLine();
					==> 주소에 빈 공백문자가 들어가게 됨
					
		 - 입력버퍼에 있는 엔터키를 없애주기 위해선 앞줄에 scan.nextLine();를 한번 더 써주면 해결됨
		   * 입력버퍼 비우기 : nextLine() 명령을 사용하기 이전에 next(), nextInt() 등의 명령이 사용된 후일 경우에 사용한다.
		    				   next() -> 입력버퍼 비우기 -> nextLine()
		    				   nextLine() 사용한 후엔 입력버퍼를 비울 필요x => 2번 사용하면 입력을 2번 하게 된다.
		   
		 ex)
	  		scan.nextLine();
	  		System.out.println("전화번호 >> ");
			String tel = scan.next();
			System.out.println("주 소 >> ");
			String addr = scan.nextLine();
		 
		
		
		
		*/
	}

}

 

 

 

 

 


3️⃣ResourceBundle 객체 이용

ResourceBundle 예제

import java.util.ResourceBundle;

/*
	ResourceBundle 객체 ==> 파일의 확장자가 .properties인 파일의 내용을 읽어와
							key값과 value값을 분리해서 정보를 갖는 개체이다.
							
		==> 읽어올 파일의 내용은 'key값=value값' 형태로 되어있어야 한다.
		 
*/
public class ResourceBundleTest {

	public static void main(String[] args) {
		// ResourceBundle 객체를 이용하여 파일 내용 읽어오기
		
		// ResourceBundle 객체 생성
		//		==> 읽어올 파일을 지정할 때 '패키지명.파일명'만 기술하고 확장자는 기술하지 않는다.
		//			( 이유 : 확장자는 항상 '.properties'이기 때문에 )
		ResourceBundle bundle = ResourceBundle.getBundle("kr.or.ddit.config.dbinfo");
		// bundle 객체 변수가 key값과 value값을 분리해서 갖고 있다.
		
		
		// 읽어온 내용 출력하기
		System.out.println("driver ==> " + bundle.getString("driver"));
		System.out.println("url ==> " + bundle.getString("url"));
		System.out.println("user ==> " + bundle.getString("user"));
		System.out.println("pass ==> " + bundle.getString("pass"));

	}

}

 

🚫 Caused by: java.util.MissingResourceException: Can't find bundle for base name kr.or.ddit.dbinfo, locale ko_KR

bundle 경로 설정이 틀렸을 때 뜨는 오류!
⇒ 경로 설정이 맞는지 체크해볼 것

 

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

// JDBC 드라이버를 로딩하고 DB서버에 연결된 Connection 객체를 생성하는 메서드로 구성된 class
// (dbinfo.properties 파일의 내용을 이용한 설정)

// 방법1) Properties객체 이용하기

public class DButil3 {
	static ResourceBundle bundle; // ResourceBundle 객체 변수 선언
	
	static { // static 초기화 블록
			bundle = ResourceBundle.getBundle("kr.or.ddit.config.dbinfo");
			
			try {
				Class.forName(bundle.getString("driver"));
			
			} catch (Exception e) {
				System.out.println("드라이버 로딩 실패!");
				e.printStackTrace();
			}
	}
			
	
	public static Connection getConnection() {
		
		try {
			
			return DriverManager.getConnection(bundle.getString("url"), bundle.getString("user"), bundle.getString("pass") );
			
		} catch (SQLException e) {
			System.out.println("DB 연결 실패 ! ");
			return null;
		}
	}
}

 

 

 


Properties 파일 생성하기

# 'key값=value값'와 같은 형식으로 작성한다.

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=DB접속아이디
pass=DB접속패스워드

 

1️⃣연결정보를 저장하는 소스파일 생성1 - res 소스폴더 생성

 

2️⃣New > Untitled Text File

 

3️⃣ text 파일을 res 폴더 내에 config 폴더를 만들어 저장

 

4️⃣properties는 key value 형식으로 작성

properties 파일 내에서 #은 주석 문장으로 사용!