본문 바로가기

Programming/Java

[Beginner] Properties Util

개발을 하다가 보면 설정값을 지정하여 사용 하는 경우가 있는데 이때 사용하는 것이 properties 파일이다.

java.util.Properties 클래스를 사용하기 위해 load라는 메소드를 통하지만 인자는 InputStream 이다.
InputStream를 전달하려면 FileInputStream을 만들어 전달하는데 이때 프로퍼티 파일의 절대 경로를 알아야한다.
그래서 아래와 같이 사용한다.

Properties props = new Properties();
try {
 props.load( new FileInputStream("/data/web/WEB-INF/classes/common.properties") );
} catch (IOException e) {
 e.printStackTrace();
}

하지만 개발 서버와 운영 서버의 경로가 다를 수 있고, 하드 코딩이 싫어 만들어 보았다.

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

public class PropertiesUtil {

    private Properties props = null;
    
    public PropertiesUtil(String strPropertiesFileName) {
    	
    	props = new Properties();
    	
        try {
        	props.load(new FileInputStream(getPropertiesPath() + strPropertiesFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public String getProperty(String key) {
        return props.getProperty(key);
    }
    
    public int getPropertyInt(String key) {
        return Integer.parseInt(props.getProperty(key));
    }
    
    public boolean getPropertyBoolean(String key) {
        return Boolean.valueOf(props.getProperty(key)).booleanValue();
    }
    public void setBoolean(String key, boolean ret) {
        props.setProperty(key, String.valueOf(ret));
    }
    
	private String getPropertiesPath() {
		
        ClassLoader cl = null;
        URL url = null;

        cl = Thread.currentThread().getContextClassLoader();
        
        if( cl == null ) {
            cl = ClassLoader.getSystemClassLoader(); 
        }
        
        url = cl.getResource("");
        
        return url.getPath();
	}    
}

java 개발의 상당 부분은 독립실행되는 java application보다 web application의 형태로 실행되는 경우가 많다.
container안에서 실행되는 web application에서는 resource를 찾기 위해 system의 ClassLoader가 아니라
web application을 로드하는 ClassLoader를 사용해야 한다.
그래서 위의 코드처럼 Thread의 ClassLoader를 먼저 체크해 봐야 하는 것이다.
이때 web application을 위해 생성된 ClassLoader에 세팅되는 Class Path는,
해당되는 path( ex)classes, lib 등등)만 추가되기 때문에 다른 위치에 있는 resource는 가져올 수 없게 되는 것이다.