레지스트리는 운영체제와 프로그램에서 필요한 정보를 담고 있는 데이터베이스와 비슷하다고 할 수 있다. 일반적인 윈도우 프로그램들은 레지스트리에 접근 할 수 있지만 자바 프로그램에서는 접근 할 수 없었다. 그 이유는 "자바의 철학"에 위배 되기 때문일 것이다. 자바 프로그램은 모든 운영체제에서 실행 가능 해야 하는데 '윈도우에만 존재하는 레지스트리'라는 것을 지원하지 않는 것은 당연한 일이었다. 게다가 레지스트리는 잘못 건드리면 윈도우 자체가 폭탄처럼 변할 수 도 있기 때문에 상당히 조심스러울 수 밖에 없다.
하지만 JDK 1.4 버전부터는 일부 제한적으로 레지스트리에 접근 할 수 있도록 그 기능이 추가되었다. 보통 자바 프로그램에서는 프로그램 실행에 필요한 정보들을 파일로 저장해 두었다가 프로그램이 종료된 후 다시 실행하더라도 필요한 정보를 얻도록 하는 방법을 사용했다. 이때 파일을 사용하게 되면 이런 저런 이유로 코딩도 복잡하고 귀찮기 짝이 없다. 특별히 복잡한 정보도 아닌데 여러 모로 프로그래머가 고생을 하는 것이다. 바로 이런 경우에 레지스트리를 사용하면 간단히 해결된다. 아마도 많은 자바 개발자들의 요구 사항으로 인하여 JDK 1.4부터 추가 된 것이 아닌가 싶다.
그렇다면 과연 자바 프로그램에서 레지스트리를 어떻게 사용할 것인가? 아무리 좋은 기능이 있어도 그 기능을 적절한 곳에 사용하지 못한다면 소용이 없게 된다. 레지스트리에 스트링 값을 입력하고 읽어오는 간단한 예제를 하나 만들어 보도록 하자. (참고로 예제 작성과 실행은 윈도우 XP에서 이루어졌다. 윈도우 계열 운영체제에서는 대부분 작동하겠지만 윈도우를 제외한 다른 운영체제에서는 예측 할 수 없음을 밝혀두는 바이다.)
레지스트리를 이용한 사용자 인증 프로그램
우리가 주로 사용하는 윈도우 운영체제에서는 사용자 계정을 제공한다. 따라서 인증된 사용자가 아니면 사용할 수 없다. 우리가 작성할 예제는 이와 비슷하지만 훨씬 간단한 프로그램이다. 프로그램이 제공하게 될 간단한 기능은 다음과 같다.
프로그램을 처음 사용하는 경우, 이름을 입력 받아 레지스트리에 등록한다.
사용자로부터 이름을 입력 받아서 등록된 이름과 같다면 원하는 작업을 계속 수행한다.
등록된 이름이 아닌 경우라면 그냥 종료된다.
프로그램에 대한 설명은 따로 필요 없이 주석을 참고하면 된다. 그리고 컴파일이나 실행에 대해서 잘 모른다면 다른 자바 기초 서적을 참고하기 바란다.
소스 코드는 다음과 같다.
import java.util.prefs.*;
import java.io.*;
public class RegistryTest {
// 키와 값을 출력한다.
public static void printKeyValue(String key, String value) {
System.out.println("Key = [" + key + "] , Value = [" + value + "]");
}
// 해당 노드에 키를 포함하고 있는지 검사한다.
public static boolean contains(Preferences node, String key) {
return node.get(key, null) != null;
}
// 키보드로부터 이름을 입력받는다.
public static String readName() {
System.out.println("Input your name.");
String value = null;
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(isr);
value = in.readLine();
} catch (IOException e) {
// 예외 처리...
}
return value;
}
public static void main(String args[]) throws BackingStoreException {
Preferences userRootPrefs = Preferences.userRoot();
String key = "name"; // 등록할 키 이름
String value = "";
String newName = null;
if (contains(userRootPrefs, key)) { // 이미 키가 존재한다.
System.out.println("Key already exists !");
value = userRootPrefs.get(key, "");
newName = readName(); // 키보드로부터 입력 받은 이름
if (newName.equals(value)) {
// 입력된 이름과 레지스트리에 등록된 이름 같다.
printKeyValue(key, value);
// 결과 출력 후, 다른 원하는 작업 수행...
}
else {
// 이름이 다르다, 당신은 누구얏 ?
System.out.println("Invalid user name !");
}
}
else { // 키가 없으므로 처음 레지스트리에 등록
value = readName();
userRootPrefs.put(key, value);
printKeyValue(key, value);
}
}
}
<출처:ibm.com/developerworks/kr>