IT

애플리케이션을 개발하다 보면 설정정보를 저장해야 하는 경우가 꼭 있습니다. 이런 경우 정보가 간단하면 *.properties 파일을 주로 사용하지만 복잡하다면 .xml 파일을 써야 하죠.
이런때 쓰면 딱 좋은 오픈소스가 아파치 프로젝트의 Commons Configuration 입니다.

Conmmons Configuration이 지원하는 파일 포맷이 다양하기 때문에 상황에 맞춰 사용가능하며 동시에 같이 사용하는것도 가능합니다.
  • Properties files
  • XML documents
  • Windows INI files
  • Property list files (plist)
  • JNDI
  • JDBC Datasource
  • System properties
  • Applet parameters
  • Servlet parameters
그럼 *.properties 파일을 이용해서 설정정보를 읽어들이고 저장할때 간단히 사용할 수 있는 유틸 클래스 ConfigUtil을 한번 만들어 보겠습니다.

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
Key2 Value=bbb
Key1 Value=zzz
Key1 Value=ccc
간단히 설명을 해보겠습니다. 먼저 sample.properties파일을 읽어들이고 나서 Key1, Key2에 해당하는 값을 읽어 들여서 출력합니다. 그리고 Key1에 해당하는 값을 변경하고 이를 저장합니다.
(폴더를 새로고침하면 파일이 실제로 변경되었음을 확인할 수 있습니다.)

두번째로 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
Posted by sinpk