본문 바로가기

Programming/JAVA

컬렉션 프레임워크(4) - Map 컬렉션 4 : Properties

JAVA logo image

 

 

 

Properties는 Hashtable의 하위 클래스이기 때문에, Hashtable의 모든 특징을 그대로 가지고 있습니다. 다만, 차이점은 key와 value를 String 타입으로 제한한다는 점 입니다. ㅇ그렇기 때문에 Properties는 애플리케이션 옵션 / DB 연결 정보 / 다국어 정보가 저장된 프로퍼티 파일(~.properties) 파일을 읽을 때 사용하게 됩니다. 

 

그럼 여기서 말하는 프로퍼티 파일이란 무엇일까요? 프로퍼티 파일은 key와 value가 = 기호로 연결된 텍스트 파일입니다. 이는 ISO 8859-1 문제셋으로 저장하게 되죠. 그런데, 한글은 해당 문자셋으로 직접 표현이 불가합니다. 그래서 한글은 유니코드로 변한하여 저장하게 되죠. 

 

예를 들어 아래와 같이 country와 language를 저장하게 되면, 유니코드로 변환되어 저장하게 됩니다. 

 

country=\uB300\uD55C\uBBFC\uAD6D    // 대한민국
language=\uD55C\uAE00               // 한글

 

 

참고로 이클립스에서 유니코드 위에 마우스를 올려두면 한글로 변환됩니다. 만일 이클립스가 없는 경우라면, native2ascii.exe를 사용하면 됩니다.

 

<JDK설치폴더>\bin\native2ascii.exe 원본.properties 변경.properties

 

 

 

 


 

 

Properties 예제를 다음과 같이 테스트해 보겠습니다. 일단, 우리가 위에서 말한 properties 파일을 하나 생성해 보겠습니다. 이클립스에서, 현재 패키지에 *.java 파일을 하나 생성하듯이 [database.properties]라는 파일 하나를 생성해 내용을 작성합니다. 참고로 그냥 텍스트 파일을 작성하듯이 key와 value를 작성하면 됩니다. 

 

 

 

[database.properties]

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=swings
password=justmusic

 

 

여기서부터는 설명이 복잡해질 수 있어서, 하나하나 짚어가면서 내용을 진행하겠습니다. 

 

 

1. 일반적으로 위에서 작성한 properties 확장자의 파일은 class 파일과 함께 저장됩니다. 그래서, 해당 database.properties 파일이 저장된 경로를 get할 때는 class파일을 기준으로 가져올 수 있습니다. 

 

2. 이 때, Class의 getResource( ) 메서드와 URL의 getPath( ) 메서드를 함께 사용하여 database.properties의 경로 값을 얻을 수 있습니다. 일단 getResouce( ) 메서드를 통해 해당 파일의 상대 경로를 URL 객체로 리턴 받고, 그리고 그 URL 객체의 getPath( ) 메서드를 이용해 해당 파일의 절대 경로를 String으로 받게 됩니다. 

 

3. 이렇게 얻은 경로를 어떻게 사용할까요? 우리는 위에서 작성한 프로퍼티 파일을 읽기 위해서, Properties 객체를 생성하고, 해당 객체의 load( ) 메서드를 호출하게 됩니다. 여기서 load( )라는 메서드는 FileReader 객체를 파라미터로 받게 되는데, 이 FileReader 객체는 역시 파라미터로 프로퍼티 파일의 경로를 받게 됩니다.

 

4. 이제 이렇게 고생끝에 준비한 프로퍼티 객체에서 key를 파라미터로 전달해 해당 value를 얻게됩니다. 여기서 사용하는 메서드는 getProperty( ) 입니다. 이 메서드에 key를 파라미터로 전달하면 해당 value를 리턴하게 됩니다. 

 

이 내용을 바탕으로, 아래 실제 코드를 보겠습니다. 

 

 

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;

public class ExampleMain {
	public static void main(String[] args) throws FileNotFoundException, IOException {
		// Properties 객체 생성
		Properties properties = new Properties();
		/* 클래스 파일에서 getResource()로 URL 객체로 상대경로 획득 후
			getPath()로 절대경로 획득 */
		String path = ExampleMain.class.getResource("database.properties").getPath();
		
		// 한글 디코딩
		path = URLDecoder.decode(path, "utf-8");
		// load()에 메서드에 획득한 경로를 파라미터로 전달하는 FileReader 객체 전달
		properties.load(new FileReader(path));
		
		String driver = properties.getProperty("driver");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		
		System.out.println("driver : " + driver); 
		System.out.println("url : " + url);
		System.out.println("username : " + username);
		System.out.println("password : " + password);
	}
}


/* 출력
driver : oracle.jdbc.OracleDriver
url : jdbc:oracle:thin:@localhost:1521:orclxx
username : swings
password : justmusic
*/