ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • properties파일 ,ResourceBundle객체-22.04.12
    고급자바 2022. 4. 12. 12:52
    728x90

    properties란?

    Key=Value형식으로 파라미터 정보들을 저장하기 위한 파일 확장자를 의미합니다. 주로 응용 프로그램에 대한 환경설정정보, DB와 연결하기 위한 DB환경설정정보 등을 저장할 때 properties파일을 만들어 그 곳에 저장해놓습니다.
    주석처리를 하고 싶은 경우 맨 앞에 "#", "!"을 붙여 주석처리를 합니다.

    하드코딩을 피하고 중요한 키나 패스워드는 코드에 직접 입력하지 않고 외부 파일에서 읽어 사용합니다.
    그럴때 보통 Properties 파일을 많이 사용합니다.

    특징
    key value는 문자열만 가능하다

    src : 소스폴더를 말함

    리소스(줄여서 res)라는 파일을 새로 소스폴더를 만들어줌
    res를 만들어주는 이유는 자바소스가 아닌것들을 따로 분리해서 관리하고 싶어서 한것임
    소스파일은 컴파일의 대상~ 그래서 컴파일되면 bin폴더에 가있게된다. (output폴더에 들어가게됨)


    output folder :
    JDBCTest/bin 가 실행이된다. 컴파일된 코드가 들어가게됨


    <properties 만드는 방법>


    properies설치하기(보기 좋게하려고)
    help=> 뉴 인스톨 소프트웨어
    Add 누르고 http://propedit.sourceforge.jp/eclipse/updates/ 이경로 입력하고 이름을 Properties Editor라고 지어준다.
    도중에 동의한다고 눌러주고 새로시작하면 됨

    원래는 한글이 안됨 못쓴다 하지만 새로 깔았기 때문에 한글 편집이 가능하다.

    package kr.or.ddit.basic;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Enumeration;
    import java.util.Properties;
    
    /**
     * 외부의 properties파일을 읽어와 Properties객체로 처리하기
     * @author 306-10
     *
     */
    public class T02_PropertiesTest {
    
    	public static void main(String[] args) {
    		//읽어온 정보를 저장할 Properties객체 생성
    		Properties prop = new Properties();
    		
    		//읽어올 파일명을 이용한 File객체 생성
    		File file = new File("./res/db.properties");
    		
    		try {
    			//파일 읽기를 수행할 FileInPutStream객체 생성하기
    			FileInputStream fis = new FileInputStream(file);
    			
    			//Properties객체로 파일 내용 읽기
    			//파일 내용을 읽어와 key와 value값으로 분류한 후 Properties객체에 담아준다.
    			prop.load(fis);
    			
    			//읽어온 자료 출력하기
    			Enumeration<String> keys =
    					(Enumeration<String>)prop.propertyNames();
    			
    			while(keys.hasMoreElements()) {
    				String key =keys.nextElement();
    				String value = prop.getProperty(key);
    				System.out.println(key + ":" + value);
    			}
    			System.out.println("출력 끝...");
    			
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    driver=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:xe
    username=LAI
    password=java

    그러면 JDBCUtil을 수정하기위해 복사하여 JDBCUtil2를 만들어주고 properties객체를 이용해본다.

    이 선언해놓은 변수들을 이용하여 호출하면 된다.

    package kr.or.ddit.util;
    
    import java.sql.Statement;
    import java.util.Properties;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * JDBC드라이버를 로딩하고 Connection객체를 생성하는 메서드로 구성된 클래스
     * 방법1) Properties객체를 이용하여 DB정보 가져오기
     *
     */
    public class JDBCUtil2 {
    	
    	static Properties prop;  //객체 변수 선언 
    	
    	static { 
    		prop = new Properties();
    		
    		try {
    			//파일 읽기를 수행할 FileInPutStream객체 생성하기
    			FileInputStream fis = new FileInputStream("res/db.properties");
    			//Properties객체로 파일 내용 읽기
    			//파일 내용을 읽어와 key와 value값으로 분류한 후 Properties객체에 담아준다.
    			prop.load(fis);
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    		
    		
    		try {
    			Class.forName(prop.getProperty("driver")); //클래스 정보 있는지 없는지 확인 , 즉 필드패쓰 잘 잡았는지도 확인해줌
    			System.out.println("드라이버 로딩 성공!");
    		} catch (ClassNotFoundException e) {
    			System.out.println("드라이버 로딩 실패!!!");
    			e.printStackTrace();
    		}
    	}
    	
    	public static Connection getConnection() {
    		try {
    			return DriverManager.getConnection(prop.getProperty("url"),
    												prop.getProperty("username"),
    												prop.getProperty("password"));
    		}catch(SQLException e) {
    			System.out.println("DB 연경 실패!!!");
    			e.printStackTrace();
    			return null;
    		}
    	}
    	
    	//자원반납
    	public static void close(Connection conn, Statement stmt, PreparedStatement pstmt, ResultSet rs) {
    		if(rs !=null) try {rs.close();}catch(SQLException ex) {}
    		if(pstmt !=null) try {pstmt.close();}catch(SQLException ex) {}
    		if(stmt !=null) try {stmt.close();}catch(SQLException ex) {}
    		if(conn !=null) try {conn.close();}catch(SQLException ex) {}
    		
    	}
    	
    	
    }

    T01_Member~를 실행하여 JDBCUtil2의 드라이버를 바꿔준다(Ctrl+F를 누르고 replaceAll을 누르면 전체적으로 바뀐다..)

    작동 잘된것을 확인할 수 있다.


    ResourceBundle객체

    ResourceBundle객체 => 확장자가 properties인 파일 정보를 읽어와
    key값과 value 값을 분리한 정보를 갖는 객체
    => 읽어올 파일은 'key값 = value값' 행태로 되어 있어야 한다.

    package kr.or.ddit.basic;
    
    import java.util.Enumeration;
    import java.util.ResourceBundle;
    
    public class T03_ResourceBundleTest {
    /*
     		ResourceBundle객체 => 확장자가 properties인 파일 정보를 읽어와
     							key값과 value 값을 분리한 정보를 갖는 객체
     		=> 읽어올 파일은 'key값 = value값' 행태로 되어 있어야 한다.
     */
    	public static void main(String[] args) {
    		/*
    		   ResourceBundle객체 생성하기
    		   => 파일을 지정할 때는 '파일명' 만 지정하고 확장자는 지정하지 않는다.
    		      (이유 : 확장자는 항상 properties이기 때문에...)
    		 */
    		ResourceBundle bundle = ResourceBundle.getBundle("db"); //확장자 생략
    		
    		Enumeration<String> keys = bundle.getKeys();
    		
    		while(keys.hasMoreElements()) {
    			String key =keys.nextElement();
    			
    			String value = bundle.getString(key);
    			
    			System.out.println(key + ":" +value);
    		}
    		System.out.println("출력 끝.");
    		
    	}
    
    }

    뉴 파일 생성하여 이 파일들에 greeting :안녕하세요 영어면 greeting: Hello 를 써주고 저장한다 그러면
    영어나 한국 일본 언어들 읽어올 수도 있음

    package kr.or.ddit.basic;
    
    import java.util.Enumeration;
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    public class T03_ResourceBundleTest {
    /*
     		ResourceBundle객체 => 확장자가 properties인 파일 정보를 읽어와
     							key값과 value 값을 분리한 정보를 갖는 객체
     		=> 읽어올 파일은 'key값 = value값' 행태로 되어 있어야 한다.
     */
    	public static void main(String[] args) {
    		/*
    		   ResourceBundle객체 생성하기
    		   => 파일을 지정할 때는 '파일명' 만 지정하고 확장자는 지정하지 않는다.
    		      (이유 : 확장자는 항상 properties이기 때문에...)
    		 */
    		ResourceBundle bundle = ResourceBundle.getBundle("db",Locale.ENGLISH); //한국이면 Locale.KOREAN
    		
    		Enumeration<String> keys = bundle.getKeys();
    		
    		while(keys.hasMoreElements()) {
    			String key =keys.nextElement();
    			
    			String value = bundle.getString(key);
    			
    			System.out.println(key + ":" + value);
    		}
    		System.out.println("출력 끝.");
    		
    	}
    
    }

    728x90
Designed by Tistory.