티스토리 뷰
이미 앞서 포스팅한 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() 가 두번씩이나 값을 중복하여 넘기는 것을 해결 할 수 만 있다면 그 쪽이 더 나을 지도 모르겠습니다.
더 좋은 방법을 발견하신 분이 계시다면 알려주시면 감사하겠습니다. ^^
'프로그래밍 > Java' 카테고리의 다른 글
java.io.FilenameFilter 의 기본 활용법 (0) | 2010.02.02 |
---|---|
Java로 UTF-8 파일 쓰기 (0) | 2010.02.02 |
NIO Package를 활용한 파일 복사 기능 구현 (0) | 2009.12.10 |
Apache Commons Project - Configuration (2) | 2009.12.09 |
ASCII Code Table (0) | 2009.10.16 |
공지사항