Properties

애플리케이션의 구성 가능한 파라미터들을 저장하기 위해 자바 관련 기술을 주로 사용하는 파일들의 파일확장자이다. 각 파라미터는 문자열들의 일부로 저장돠며, 한 문자열은 파라미터의 이름을 키값으로 저장하며 다른 하나는 밸류로써 저장한다. (위키피디아)


.Properties Format

  • key = value

  • key=value

  • key : value 

키밸류 쌍을 위와 같은 형태로 만들 수 있다. 또한 라인 가장 첫번째에 "!" 혹은 "#" 이 있다면 해당 라인은 주석처리가 된다. 

Properties 파일 사용전 준비

프로퍼티 파일을 사용하기에 앞서서 일단 두가지를 해주어야 한다.
  1. 프로퍼티 파일 만들고 설정
  2. 프로퍼티 파일을 servlet-context.xml 에 등록
1. 프로퍼티 파일 만들고 설정


2. 프로퍼티 파일을 servlet-context.xml 에 등록
1
2
3
 
<util:properties id="user" location="classpath:/props/user.properties" />
 
cs


properties 파일을 사용하고, 해당 프로퍼티 파일의 id 는 user 이다. classpath 는 해당 프로젝트가 classpath 로 잡아놓은 경로를 기점으로 /props/user.properties 로 가겠다는 의미로 아래의 경로를 따른다. user.properties 가 위치해있는 파일 경로이다.




Properties 파일 사용1 : @Value 애노테이션 이용

자바 소스 내부에서 아래와 같이 작성을 할 수 있다. @Value("#{user['key']}) "user" 를 쓸 수 있는 이유는 servlet-context.xml 에서 프로퍼티 파일을 이용하겠다고 설정해주었기 때문이다. 따라서 프로퍼티의 키 값에 의해 밸류를 해당 변수에 삽입할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
@Value("#{user['pasudo123.id']}")
String pasudo123Id;
 
@Value("#{user['pasudo123.pw']}")
String pasudo123Pw;
 
@Value("#{user['pasudo123.address']}")
String pasudo123Addr;
 
@Value("#{user['doubler.id']}")
String doublerId;
 
@Value("#{user['doubler.pw']}")
String doublerPw;
 
@Value("#{user['doubler.address']}")
String doublerAddr;
 
cs


출력과 결과문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
private void displayOnConsole(){
    System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
    
    System.out.println("pasudo123Id : " + pasudo123Id);
    System.out.println("pasudo123Pw : " + pasudo123Pw);
    System.out.println("pasudo123Addr : " + pasudo123Addr);
    
    System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
    
    System.out.println("doublerId : " + doublerId);
    System.out.println("doublerPw : " + doublerPw);
    System.out.println("doublerAddr : " + doublerAddr);
    
    System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
}
 
 
[ 출력 ]
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
pasudo123Id : pasudo123
pasudo123Pw : pasudopass
pasudo123Addr : KOREA
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
doublerId : doubler
doublerPw : doublerpass
doublerAddr : USA
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
cs



Properties 파일 사용2 : @Component & @Autowired 이용

우선 아래와 같이 @Autowired 애노테이션을 componentTest 변수에 걸어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
public class PropController {
 
    @Autowired
    ComponentTest componentTest;
    
    @RequestMapping("/props")
    public String printProps(){
 
        componentTest.autowiredPrint();
 
        return "testViews/prop";
    }
}
cs


ComponentTest Class 에 @Component 애노테이션을 달아주고 인스턴스 변수는 프로퍼티 타입의 user 라고 명시한다. 여기서 주의할 것은 user 라고 명시한 변수 명이 servlet-context.xml 에 명시한 id 값과 동일해야 한다는 것이다. 동일하지 않으면 injection Error 가 뜬다. 


위의 과정이 완료되면 프로퍼티 변수의 getProperty() 의 메소드를 가지고 키 값을 입력 후 밸류 값을 획득한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Properties;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
@Component
public class ComponentTest {
    
    @Autowired
    private Properties user;
    
    private String getValue(String key){
        return user.getProperty(key);
    }
    
    public void autowiredPrint(){
        System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
        
        System.out.println("pasudo123Id : " + getValue("pasudo123.id"));
        System.out.println("pasudo123Pw : " + getValue("oracle.url"));
        System.out.println("pasudo123Addr : " + getValue("pasudo123.address"));
        
        System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
        
        System.out.println("doublerId : " + getValue("doubler.id"));
        System.out.println("doublerPw : " + getValue("doubler.pw"));
        System.out.println("doublerAddr : " + getValue("doubler.address"));
        
        System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
    }
}
 
 
[ 출력 ]
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
pasudo123Id : pasudo123
pasudo123Pw : pasudopass
pasudo123Addr : KOREA
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
doublerId : doubler
doublerPw : doublerpass
doublerAddr : USA
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
cs



Properties 파일 사용3 : @Resource 애노테이션 이용

아까와 동일한 컨트롤러 레이어 쪽이다. @Autowired 를  통해서 해당 클래스에 대한 의존성 주입을 실시하고 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
public class PropController {
 
    @Autowired
    ComponentTest componentTest;
    
    @RequestMapping("/props")
    public String printProps(){
        
        componentTest.ResourcePrint();
        
        return "testViews/prop";
    }
}
cs


@Resource 애노테이션을 이용하여 name 값을 servlet-context.xml 에 명시한 id 값으로 넣어주고 있다. 이후에 해당 프로퍼티 파일의 entrySet() 메소드를 통해 전체 셋을 획득한다. 이렇게 한다면 해당 프로퍼티 파일의 모든 키 밸류 값들을 가지고 올 수 있다. 따라서 출력은 전체 화면상으로 나타나게 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
 
import javax.annotation.Resource;
 
import org.springframework.stereotype.Component;
 
@Component
public class ComponentTest {
 
    @Resource(name="user")
    private Properties userProps;
    
    public void ResourcePrint(){
        Set<Entry<Object, Object>> set = userProps.entrySet();
        Iterator<Entry<Object, Object>> it = set.iterator();
    
        while(it.hasNext()){
            Entry<Object, Object> entry = it.next();
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}
 
 
[ 출력 ]
doubler.id : doubler
oraedoa.id : oraedoa
pasudo123.pw : pasudopass
oraedoa.address : JAPAN
pasudo123.id : pasudo123
doubler.address : USA
pasudo123.address : KOREA
doubler.pw : doublerpass
oraedoa.pw : oraedoapass
cs



servlet-context.xml 내에서 프로퍼티 파일의 사용

실질적으로 프로퍼티 파일은 설정파일이다. 설정파일을 코드상으로 관리한다면 보안상 노출위험도 있을 뿐더러 이후에 수정을 하는 경우 불필요한 소스코드의 수정을 가하기 때문에 따로 보관해둘 필요가 있다. 일반적인 예시로는 프로퍼티 파일의 경우 디비와 접속하는 경우 해당 디비 접속을 위한 경로, 아이디, 패스워드를 하드코딩하지 않은채 프로퍼티 파일로 이용하는 경우가 있다고 한다. 


servlet-context.xml 모습

1
2
3
4
5
6
7
8
9
10
11
 
<util:properties id="props" location="classpath:/props/config.properties" />
 
<!--     local Database -->
<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="#{props['oracle.driverClassName']}" />
    <beans:property name="url" value="#{props['oracle.url']}" />
    <beans:property name="username" value="#{props['oracle.username']}" />
    <beans:property name="password" value="#{props['oracle.password']}" />
</beans:bean>
 
cs


config.properties 파일 내부

1
2
3
4
5
6
7
 
## ORACLE ## 
oracle.driverClassName=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:xe
oracle.username=doubler
oracle.password=doublerpass
 
cs


+) 추가

.properties 에 한글을 입력하면 한글이 깨진다.

따라서 이클립스 properties editor 를 다운받아 깨지는 현상을 해결한다.

[ Eclipse Plug in - properties Editor ]


Posted by doubler
,