이미 앞서 포스팅한 XMLConfiguration 의 기본적인 사용 예를 보고 연습을 해봤다면 만났을 법한 상황이 있습니다.

일반적인 방법으로는 'Option1,Option2,Option3' 과 같은 Comma 가 들어간 문자열의 경우 getString() 메소드를 통해 정상적으로 값을 가져오지 못하는 현상이 그것인데요.



	
		NegaFIX
		928rino@naver.com
		korea
		Driving,Photo,Mobile,Game,Baseball
		Programmer
	


위와 같은 XML 포맷의 Configuration 이 있다고 가정하겠습니다.
XMLConfiguration을 통해 해당 설정의 값들을 가져오려고 할 때 일반적인 방법으로는 정상적으로 값을 가져오지 못합니다.

다음 샘플 코드를 보시죠.

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;

public class ConfigTest {

	public static void main(String[] args) {
		XMLConfiguration config;
		try {
			config = new XMLConfiguration("D:\\download\\configuration.xml");
			config.load();
			
			String version = config.getString("");
			debug("Version", version);
			
			String userid = config.getString("user.user-id");
			debug("User ID", userid);
			
			String email = config.getString("user.email");
			debug("e-Mail", email);
			
			String locale = config.getString("user.locale");
			debug("Locale", locale);
			
			String hobby = config.getString("user.hobby");
			debug("Hobby", hobby);
			
			String etc = config.getString("user.etc");
			debug("Etc", etc);

			String option = config.getString("user.etc[@option]");
			debug("Option", option);
		} catch(ConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	public static void debug(String prefix, String value) {
		System.out.println("- " + prefix + " : " + value);
	}
}

위 샘플 코드실행 결과는 아래와 같습니다.
- User ID : NegaFIX
- e-Mail :
928rino@naver.com
- Locale : korea
- Hobby : Driving
- Etc : Programmer
- Option : Opt1

뭔가 이상하다 생각지 않으신가요?
분명 hobby 노드의 값과 option 속성의 값은 저게 아님에도 불구하고 마치 배열이라도 생성된 듯 Comma 를 기준으로 첫번째 값들만 반환되고 있는 것을 확인 할 수 있을 것입니다.

XMLConfiguration 에서는 Node 및 Attribute 의 값을 기본적으로 Comma 를 구분자로 하여 자동으로 배열을 생성하기 때문에 getString() 으로 Node 및 Attribute 를 탐색했을 경우 위와 같은 결과를 보게 됩니다.

어차피 Comma 로 구분된 값을 배열로 생성할 것이었다면 getList() 를 통해 값을 받아오면 됩니다.
List hobby = config.getList("user.hobby");
for(int idx=0; idx<hobby.size(); idx++) {
	debug("Hobby", (String)hobby.get(idx));
}
String[] option = config.getStringArray("user.etc[@option]");
for(int idx=0; idx<option.length; idx++) {
	debug("Option", option[idx]);
}

hobby 와 option 의 값을 가져오는 부분에서 위와 같이 수정해보면 설정된 모든 값을 가져오는 것을 확인 할 수가 있지만 여기서 또 한가지 문제가 발생합니다.

- Hobby : Driving
- Hobby : Photo
- Hobby : Mobile
- Hobby : Game
- Hobby : Baseball
- Hobby : Driving
- Hobby : Photo
- Hobby : Mobile
- Hobby : Game
- Hobby : Baseball
- Option : Opt1
- Option : Opt2
- Option : Opt3
- Option : Opt1
- Option : Opt2
- Option : Opt3

getList() 와 getStringArray() 를 사용한 결과는 이렇습니다.
보는것과 같이 값들이 두번씩 중복되어 출력되는 것이죠. 아직 이 문제에 대한 해결책은 찾지 못하였으나 다른 방법이 있습니다.

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;

public class ConfigTest {

	public static void main(String[] args) {
		XMLConfiguration config;
		try {
			XMLConfiguration.setDefaultListDelimiter((char)0);

			config = new XMLConfiguration("D:\\download\\configuration.xml");
			config.load();
			
			String hobby = config.getString("user.hobby");
			debug("Hobby", hobby);
			
			String option = config.getString("user.etc[@option]");
			debug("Option", option);
		} catch(ConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	public static void debug(String prefix, String value) {
		System.out.println("- " + prefix + " : " + value);
	}
}

이제 다시 getString() 메소드를 사용했습니다.
첫번째 소스코드와 다른 부분이 있다면 XMLConfiguration 인스턴스를 생성하기 전에 특별한 static 메소드를 사용했다는 점인데요.

XMLConfiguration.setDefaultListDelimiter((char)0);

바로 이 부분이 그것입니다. setDefaultListDelimiter() 메소드를 사용한 것이 키포인트!
Comma 를 기본 구분자로 하기 때문에 이를 해제하거나 혹은 다른 Character 문자를 Delimiter 로 사용하기 위한 메소드입니다.

setDefaultListDelimiter() 메소드는 static 메소드이며, 반드시 XMLConfiguration 인스턴스 생성 전에 사용되어져야 합니다. setDelimiter() 메소드가 있긴 하지만 현재는 deprecated 되어 사용하지 말 것을 권고하고 있네요.

그럼 마지막 소스코드의 결과는 어떠할까요?

- Hobby : Driving,Photo,Mobile,Game,Baseball
- Option : Opt1,Opt2,Opt3

설정파일에 기록한 내용 그대로 받아 올 수 있게 되었습니다.
이렇게 받아온 값을 입맛에 맛게 사용만 하면 되는 것이죠.
하지만 getList() 와 getStringArray() 가 두번씩이나 값을 중복하여 넘기는 것을 해결 할 수 만 있다면 그 쪽이 더 나을 지도 모르겠습니다.

더 좋은 방법을 발견하신 분이 계시다면 알려주시면 감사하겠습니다. ^^
  1. SG

    | 2015.04.28 20:13 | PERMALINK | EDIT | REPLY |

    오래전에 쓰신 글이네요 작성자분은 이미 아셨을거라 생각합니다만 혹시나 지금 보는 분들을 위해 적고 갑니다.

    결과가 중복해서 나오는 현상은 Load 가 두번되어서 그렇습니다.
    config = new XMLConfiguration("D:\\download\\configuration.xml");
    config.load();

    이부분인데요 인스턴스 생성시 파일 경로를 넣으면 바로 config.load() 하고 동일한 작업이 진행됩니다.
    거기에 다시 load() 를 하게 되면 설정파일이 두번 로드 되어 결과가 두번 나오게 됩니다.
    config.load() 를 실행하지 않거나

    config = new XMLConfiguration();
    config.load("D:\\download\\configuration.xml");
    으로 설정하시면 중복되어 나오지 않습니다.

    그럼 좋은 하루 되세요..

Write your message and submit
« PREV : 1 : ··· : 70 : 71 : 72 : 73 : 74 : 75 : 76 : 77 : 78 : ··· : 101 : NEXT »