IT, 프로그래밍/Java

[JAVA/WEB] Properties 파일로 중요 정보 관리하기

오리@ 2019. 1. 28. 09:37

어플리케이션을 만들다 보면 중요한 정보를 사용해야 할 때가 있다.


그런데 이걸 소스내에 하드코딩해서 관리하기엔 아래와 같은 문제가 있다.



1. 런타임 중에 변경할 수 없다.


즉 정보가 하나라도 변경되면 서버를 껐다가 켜야한다.


2. 유지보수가 힘들다.


ENUM이나 상수로 정의해서 사용해도 되지만, 결국은 소스코드를 뒤져야 하며, 유지보수에 악영향을 미친다.


3.보안 처리가 힘들다


소스코드 자체는 암호화 하기가 힘들다. 파일로 따로 빼서 관리하면 IO 과정에서 암/복호화 할 수 있으므로 보안에 유리하다.




1
2
3
4
db.driverName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mydb
db.id=myid
db.pwd=mypwd
cs



JDBC 접속 정보를 관리하는 info.properties 라는 파일을 만들자.


Key = Value 로 작성하면 되고, 콤마를 안써도 개행을 하면 다른 정보라고 인식한다. 


이 파일을 배포하는 서버에서 관리하려면 특정 경로에 파일을 생성하고 이 경로를 상수로 관리하면 되고,


프로젝트 파일 밑에 놔두려면, WEB-INF 아래 classes 폴더를 생성해서 그 안에 넣어두면 된다.




불러올 때는, ClassLoader를 통해 WEB-INF classes 폴더 밑을 탐색할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static final String PROPERTIES_FILE = "info.properties";
private Properties props;
 
.....
 
 
props = new Properties();
        try {
            
            props.load(this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE));
        } catch (IOException e) {
            System.out.println("Properties File Load Fail!");
            e.printStackTrace();
        }
cs


classes 폴더 밑에 파일을 두고 이름을 주면 ClassLoader가 알아서 찾아온다.


만약 classes 폴더 밑에 말고 WEB-INF 하위의 다른 곳에 두고 싶다면 ServletContext로 접근해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public String getDbName() {
 
        return props.getProperty("db.driverName");
    }
 
    public String getDbUrl() {
 
        return props.getProperty("db.url");
    }
 
    public String getDbId() {
 
        return props.getProperty("db.id");
    }
 
    public String getDbPwd() {
 
        return props.getProperty("db.pwd");
    }
cs

properties 파일에 있는 정보에 접근하려면 파일에 적어두었던 키 값으로 접근하면 된다.