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
*/
'Programming > JAVA' 카테고리의 다른 글
컬렉션 프레임워크(5) - 검색 강화 컬렉션 2 : TreeSet (0) | 2024.01.12 |
---|---|
컬렉션 프레임워크(5) - 검색 강화 컬렉션 1 : 이진트리 구조 (0) | 2024.01.04 |
컬렉션 프레임워크(4) - Map 컬렉션 3 : Hashtable (0) | 2023.12.14 |
컬렉션 프레임워크(4) - Map 컬렉션 2 : HashMap[2/2] (0) | 2023.12.10 |
컬렉션 프레임워크(4) - Map 컬렉션 2 : HashMap[1/2] (0) | 2023.12.08 |