메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

자바 프로그램으로 윈도우 레지스트리 다루기

한빛미디어

|

2003-03-12

|

by HANBIT

19,826

저자: 한빛 리포터 김영익

이 기사에서는 윈도우 운영체제에서 핵심적인 레지스트리 정보를 자바 프로그램에서 접근하는 방법을 소개한다. 이 기능은 JDK 1.4에서부터 새로 지원하는 기능으로 윈도우 기반의 자바 개발자에게는 새로운 희소식이 될 것이다.

레지스트리?

레지스트리는 윈도우 운영체제에서 아주 중요한 역할을 한다. 레지스트리에 문제가 생기면 부팅이 안되거나 프로그램들이 정상 작동을 하지 않을 정도로 치명적이다. 과연 레지스트리에 무엇이 들어 있길래 그렇게 중요하단 말인가? 우선 레지스트리가 무엇인가 알아보자.


Registry; 레지스트리

레지스트리는 윈도우95 나 윈도우98 및 윈도우NT와 같은 운영체계에서, 부팅시 필요한 정보, 즉 어떤 하드웨어가 장착되어 있는지, 시스템사양이나 선택사항은 무엇인지, 메모리는 어떻게 설정되어 있는지 등을 한 곳에 저장하기 위한 장소이다. 레지스트리는 이전의 윈도우 시스템, 즉 윈도우3.1 에서 사용되던 환경설정 파일(.INI 파일)과 유사하며, 그것을 대치한 것으로 이해하면 된다. 그러나 이전 시스템에서 운영되던 16 비트 응용프로그램들과 호환성을 위해 환경설정 파일(.INI 파일)도 여전히 함께 제공된다. 사용자는 Tweak UI와 같은 제어판 도구를 사용하여 레지스트리를 간접적으로 수정할 수 있으며, 응용프로그램이 설치되거나 삭제될 때마다 레지스트리 정보도 함께 수정된다. 네트웍 환경에서는 레지스트리 정보를 서버에 저장함으로써 개인이나 작업그룹 들의 시스템 정책을 중앙통제식으로 관리할 수도 있다.
(텀즈 용어해설 인용)
간단히 말해 레지스트리는 운영체제와 프로그램에서 필요한 정보를 담고 있는 데이터베이스와 비슷하다고 할 수 있다. 일반적인 윈도우 프로그램들은 레지스트리에 접근 할 수 있지만 자바 프로그램에서는 접근 할 수 없었다. 그 이유는 "자바의 철학"에 위배 되기 때문일 것이다. 자바 프로그램은 모든 운영체제에서 실행 가능 해야 하는데 "윈도우에만 존재하는 레지스트리"라는 것을 지원하지 않는 것은 당연한 일이었다. 게다가 레지스트리는 잘못 건드리면 윈도우 자체가 폭탄처럼 변할 수 도 있기 때문에 상당히 조심스러울 수 밖에 없다.

하지만 JDK 1.4 버전부터는 일부 제한적으로 레지스트리에 접근 할 수 있도록 그 기능이 추가되었다. 보통 자바 프로그램에서는 프로그램 실행에 필요한 정보들을 파일로 저장해 두었다가 프로그램이 종료된 후 다시 실행하더라도 필요한 정보를 얻도록 하는 방법을 사용했다. 이때 파일을 사용하게 되면 이런 저런 이유로 코딩도 복잡하고 귀찮기 짝이 없다. 특별히 복잡한 정보도 아닌데 여러 모로 프로그래머가 고생을 하는 것이다. 바로 이런 경우에 레지스트리를 사용하면 간단히 해결된다. 아마도 많은 자바 개발자들의 요구 사항으로 인하여 JDK 1.4부터 추가 된 것이 아닌가 싶다.

그렇다면 과연 자바 프로그램에서 레지스트리를 어떻게 사용할 것인가? 아무리 좋은 기능이 있어도 그 기능을 적절한 곳에 사용하지 못한다면 소용이 없게 된다. 이 기사를 통해서 레지스트리에 스트링 값을 입력하고 읽어오는 간단한 예제를 하나 만들어 보도록 하자. (참고로 예제 작성과 실행은 윈도우 XP에서 이루어졌다. 윈도우 계열 운영체제에서는 대부분 작동하겠지만 윈도우를 제외한 다른 운영체제에서는 예측 할 수 없음을 밝혀두는 바이다.)

레지스트리를 이용한 사용자 인증 프로그램

우리가 주로 사용하는 윈도우 운영체제에서는 사용자 계정을 제공한다. 따라서 인증된 사용자가 아니면 사용할 수 없다. 우리가 작성할 예제는 이와 비슷하지만 훨씬 간단한 프로그램이다. 프로그램이 제공하게 될 간단한 기능은 다음과 같다.
  • 프로그램을 처음 사용하는 경우, 이름을 입력 받아 레지스트리에 등록한다.
  • 사용자로부터 이름을 입력 받아서 등록된 이름과 같다면 원하는 작업을 계속 수행한다.
  • 등록된 이름이 아닌 경우라면 그냥 종료된다.
IT 백두대간 자바2, SDK 1.4
프로그램에 대한 설명은 따로 필요 없이 주석을 참고하면 된다. 그리고 컴파일이나 실행에 대해서 잘 모른다면 다른 자바 기초 서적을 참고하기 바란다.

우선 실행 하기 전에 레지스트리 편집기를 실행한다. 윈도우 2000이나 XP의 경우 실행창에서 "regedit"를 실행하면 된다. 그리고 트리에서 다음과 같은 노드를 찾는다.

현재는 아무런 키 값이 없는 상태이다. 컴파일이 되었으면 이제 프로그램을 실행해보자. 처음 실행을 하면 이름을 입력하라는 메시지가 나온다. 이름을 입력하면 레지스트리에 등록되고 결과를 출력한 후 종료된다.

다시 실행을 하게 되면, 이미 키 값이 존재한다는 메시지가 출력되며 다시 이름을 입력 받는다. 입력 받은 이름과 레지스트리에 등록된 이름을 비교하여 같으면 결과 출력을 하고, 다르다면 에러 메시지를 출력한다.

이번에는 직접 레지스트리 편집기에서 결과를 확인해보자. 그림에서처럼 키와 값이 입력된 것을 확인할 수 있다.

완성된 프로그램의 기능은 이 것이 전부이지만 잘 활용한다면 여러 분야에서 응용할 수 있을 것이다.

소스 코드는 다음과 같다.
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);
		}
	}
}
마치면서

JDK 1.4에서 레지스트리에 접근하도록 지원하는 기능은 아직까지는 제한적이다. 레지스트리의 모든 부분에 접근하지 못한다는 것이 단점이 될 수 도 있다. 그렇지만 이는 단순히 해결될 문제도 아니다. 어떠한 자바 프로그램에서든지 레지스트리의 내용을 함부로 수정했다가는 윈도우 운영체제 자체에 아주 치명적인 손상을 입힐 수 도 있기 때문이다. 비록 이런 문제들이 남아 있기는 하지만 나름대로 필요한 부분에서 유용하게 사용한다면 그것으로 만족하고 싶다.

참고자료
TAG :
댓글 입력
자료실

최근 본 상품0