애플리케이션을 개발하다 보면 설정정보를 저장해야 하는 경우가 꼭 있습니다. 이런 경우 정보가 간단하면 *.properties 파일을 주로 사용하지만 복잡하다면 .xml 파일을 써야 하죠.
이런때 쓰면 딱 좋은 오픈소스가 아파치 프로젝트의 Commons Configuration 입니다.
Conmmons Configuration이 지원하는 파일 포맷이 다양하기 때문에 상황에 맞춰 사용가능하며 동시에 같이 사용하는것도 가능합니다.
1.ConfigUtil 클래스
싱글턴으로 만들어야 사용하기 편하니 static 변수 instance를 선언하고 Configuration 프레임웍에서 properties파일을 나타내는 PropertiesConfiguration 변수를 선언합니다.
private static ConfigUtil instance = new ConfigUtil();
private static PropertiesConfiguration propertyConfig;
파일을 읽어들이는 load 메소드를 정의합니다.
public void load(String fileName)
throws ConfigurationException {
propertyConfig = null;
propertyConfig = new PropertiesConfiguration();
propertyConfig.load(new File(fileName));
}
특정 키를 주고 키에 해당하는 값를 읽어들이는 getProperty 메소드를 정의합니다.
public String getProperty(String key) {
String value = propertyConfig.getProperty(key) == null ? ""
: propertyConfig.getProperty(key).toString();
return value;
}
특정 키에 해당하는 값을 변경하기 위한 setProperty 메소드를 정의합니다.
public void setProperty(String key, Object value) {
propertyConfig.setProperty(key, value);
}
프로퍼티 파일을 다시 저장할 save 메소드를 정의합니다.
public void save(String fileName) throws ConfigurationException {
propertyConfig.save(new File(fileName));
}
2.ConfigKey 인터페이스
이번에는 프로퍼티의 키들을 저장해놓고 상수로 사용하기 위한 인터페이스 ConfigKey를 정의합니다.
public interface ConfigKey {
String KEY1 = "key1";
String KEY2 = "key2";
}
3.ConfigUtil 테스트
이제 테스트를 할 때가 되었습니다. ConfigUtilSample 클래스를 만들어서 간단히 테스트 해 보겠습니다.
public static void main(String[] args) throws Exception{
String fileName = "sample.properties";
// #1
ConfigUtil.getInstance().load(fileName);
System.out.println("Key1 Value=" +
ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
System.out.println("Key2 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY2));
ConfigUtil.getInstance().setProperty(ConfigKey.KEY1, "zzz");
System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
ConfigUtil.getInstance().save(fileName);
// #2
ConfigUtil.getInstance().load("sample2.properties");
System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
}
sample.properties파일과 sample2.properties 파일의 내용은 다음과 같습니다.
sample.properties
key1 = aaa
key2 = bbb
sample2.properties
key1 = ccc
key2 = ddd
위 샘플의 실행결과를 먼저 보면 다음과 같습니다.
(폴더를 새로고침하면 파일이 실제로 변경되었음을 확인할 수 있습니다.)
두번째로 sample2.properties 파일을 읽어들이고 다시 Key1에 맞는 값을 읽어 들입니다. properties 파일이 다르기 때문에 값이 다름을 확인할 수 있습니다.
properties 파일에 대한 처리는 간단하지만 꼭 필요한 기능입니다. 위 프레임워크를 이용하게 되면 아래처럼 프로퍼티에 주석을 단다거나 변수를 사용하는것도 간단하게 구현할 수 있습니다.
이런때 쓰면 딱 좋은 오픈소스가 아파치 프로젝트의 Commons Configuration 입니다.
Conmmons Configuration이 지원하는 파일 포맷이 다양하기 때문에 상황에 맞춰 사용가능하며 동시에 같이 사용하는것도 가능합니다.
- Properties files
- XML documents
- Windows INI files
- Property list files (plist)
- JNDI
- JDBC Datasource
- System properties
- Applet parameters
- Servlet parameters
1.ConfigUtil 클래스
싱글턴으로 만들어야 사용하기 편하니 static 변수 instance를 선언하고 Configuration 프레임웍에서 properties파일을 나타내는 PropertiesConfiguration 변수를 선언합니다.
private static ConfigUtil instance = new ConfigUtil();
private static PropertiesConfiguration propertyConfig;
파일을 읽어들이는 load 메소드를 정의합니다.
public void load(String fileName)
throws ConfigurationException {
propertyConfig = null;
propertyConfig = new PropertiesConfiguration();
propertyConfig.load(new File(fileName));
}
특정 키를 주고 키에 해당하는 값를 읽어들이는 getProperty 메소드를 정의합니다.
public String getProperty(String key) {
String value = propertyConfig.getProperty(key) == null ? ""
: propertyConfig.getProperty(key).toString();
return value;
}
특정 키에 해당하는 값을 변경하기 위한 setProperty 메소드를 정의합니다.
public void setProperty(String key, Object value) {
propertyConfig.setProperty(key, value);
}
프로퍼티 파일을 다시 저장할 save 메소드를 정의합니다.
public void save(String fileName) throws ConfigurationException {
propertyConfig.save(new File(fileName));
}
2.ConfigKey 인터페이스
이번에는 프로퍼티의 키들을 저장해놓고 상수로 사용하기 위한 인터페이스 ConfigKey를 정의합니다.
public interface ConfigKey {
String KEY1 = "key1";
String KEY2 = "key2";
}
3.ConfigUtil 테스트
이제 테스트를 할 때가 되었습니다. ConfigUtilSample 클래스를 만들어서 간단히 테스트 해 보겠습니다.
public static void main(String[] args) throws Exception{
String fileName = "sample.properties";
// #1
ConfigUtil.getInstance().load(fileName);
System.out.println("Key1 Value=" +
ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
System.out.println("Key2 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY2));
ConfigUtil.getInstance().setProperty(ConfigKey.KEY1, "zzz");
System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
ConfigUtil.getInstance().save(fileName);
// #2
ConfigUtil.getInstance().load("sample2.properties");
System.out.println("Key1 Value=" + ConfigUtil.getInstance().getProperty(ConfigKey.KEY1));
}
sample.properties파일과 sample2.properties 파일의 내용은 다음과 같습니다.
sample.properties
key1 = aaa
key2 = bbb
sample2.properties
key1 = ccc
key2 = ddd
위 샘플의 실행결과를 먼저 보면 다음과 같습니다.
Key1 Value=aaa간단히 설명을 해보겠습니다. 먼저 sample.properties파일을 읽어들이고 나서 Key1, Key2에 해당하는 값을 읽어 들여서 출력합니다. 그리고 Key1에 해당하는 값을 변경하고 이를 저장합니다.
Key2 Value=bbb
Key1 Value=zzz
Key1 Value=ccc
(폴더를 새로고침하면 파일이 실제로 변경되었음을 확인할 수 있습니다.)
두번째로 sample2.properties 파일을 읽어들이고 다시 Key1에 맞는 값을 읽어 들입니다. properties 파일이 다르기 때문에 값이 다름을 확인할 수 있습니다.
properties 파일에 대한 처리는 간단하지만 꼭 필요한 기능입니다. 위 프레임워크를 이용하게 되면 아래처럼 프로퍼티에 주석을 단다거나 변수를 사용하는것도 간단하게 구현할 수 있습니다.
# properties can reference other properties
base.prop = /base
first.prop = ${base.prop}/first
'소프트웨어 > Java' 카테고리의 다른 글
Mybatis if 문자열 비교 (1) | 2015.06.19 |
---|---|
DB 별 JDBC Driver (0) | 2014.04.17 |
java:comp/env (0) | 2014.03.18 |
java 정규식 표현 (0) | 2013.11.25 |
커스텀 Annotation (0) | 2013.10.22 |