2014. 3. 31. 10:59

OS를 새로 설치하고 톰캣도 새로 다운받고

백업해놨던 이클립스 워크스페이스를 로드하고 나면 톰캣 설정이 꼬여서
새로운 톰캣 서버를 추가할 수 없게 될때가 있습니다.


그런 상황에서는

http://stackoverflow.com/questions/93900/cant-add-server-to-a-moved-workspace

요로코롬

Window/Preferences/Server/Runtime Environments 가셔서

기존에 있던 톰캣들을 지워주시고 올바른 경로로 새 톰캣 서버를 추가해주시면 됩니다.


Posted by 나야

댓글을 달아 주세요

2012. 11. 4. 22:53

스프링에서 mybatis를 설정해서 사용해보기는 했으나, 막상 스프링 없이 사용하려니 버벅여서 정리합니다.


mybatis 공식홈페이지에 가면 어떻게 사용해야 하는지 친절하게 설명되어있습니다.

http://www.mybatis.org/core/getting-started.html


항상 궁금했던 것인데, ibatis 이름은 왜 mybatis로 바뀌었는가? 그래서 검색해봤습니다.

http://ibatis.apache.org

http://mybatis.org/about.html

뭔가 정치적인 재미난 얘기가 써있지 않아서 그냥 넘어가겠습니다. 


1. 커넥션 생성하기

JDBC를 사용한다고 하니 일단 java.sql.Connection을 생성하고 싶습니다. 

연결이 되는지 확인해야 하니까요. 

그래서 간단히 유닛테스트를 작성합니다. 

openSession() 메소드까지 호출해도 실제 연결을 생성하지 않기 때문에 getConnection() 메소드를 호출해봅니다.

@Test
	public void test() {
		try {
			String resource = "net/daum/search/shopping/analysis/sql/mybatis/mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			SqlSession sqlSession= sqlSessionFactory.openSession();
			Connection conn = sqlSession.getConnection();
			assertEquals("shop", conn.getCatalog());
		} catch (Exception e) {
			e.printStackTrace();
			fail("Exception occurs");
		}
	}


  
    
      
      
        
        
        
        
      
    
  
  
  
  

잘 됩니다.


2. 테이블 생성하기

SqlSession을 얻어온 다음에는 mapper클래스를 사용해서 sql문을 사용합니다.

Mapper클래스를 간단히 작성하고, 설정파일에 추가합니다.

import org.apache.ibatis.annotations.Update;
public interface Table {
	
	@Update("DROP TABLE IF EXISTS temp_table")
	int dropTempTable();
	
	@Update("CREATE TABLE temp_table (id integer)")
	int createTempTable();

}

    
 
	@Test
	public void createTable() {
		SqlSession sqlSession = null;
		try {
			sqlSession = openSession();
		} catch (Exception e) {
			e.printStackTrace();
			fail("Exception occurs");
		}
		
		Table tableMapper= sqlSession.getMapper(Table.class);
		tableMapper.dropTempTable();
		tableMapper.createTempTable();
		
		sqlSession.commit(true);
	}

이제 테이블을 만들고 삭제할 수 있습니다.

Posted by 나야

댓글을 달아 주세요

2012. 5. 7. 23:33

서버 설정이 다음과 같이 되어있기 때문입니다. 



servers view에서 서버를 더블클릭하면 이런 설정을 볼 수 있는데,  리소스가 바뀌어야 publish하도록 되어 있죠. 개발을 시작한 프로젝트에서는 어차피 만들면서 리소스가 바뀌는데, 임포트 한상태 후 변경되지 않은 클래스 파일은 수정하지 않는 한 바뀌지 않는 거죠.  publish되지 않는 다는 것은 tomcat을 실행할 임시 애플리케이션 폴더에 컴파일된 class파일이 복사되지 않는 것을 의미합니다. 


이 때 Automatically publish after a built event로 변경한 후 maven build 등으로 build event를 발생시키면 모두 publishing 됩니다. 그 후에는 Automatically publish after a build event로 해놓는 것이 수정할 때마다 자동으로 배포되니 편리합니다. 

Posted by 나야

댓글을 달아 주세요

2012. 2. 29. 15:12
두 관련 없는 파일을 비교할 때, 

예를 들면, 
A라는 프로젝트에서 복사 수정한 B라는 프로젝트가 있는데
A 프로젝트의 소스코드에서 변경된 부분을 확인하고 싶을 때는 다음과 같이 하면 됩니다.

Package Explorer 등에서 두 파일을 모두 선택합니다.
오른쪽 클릭 또는 Context 버튼을 눌러 컨텍스트 메뉴를 띄웁니다.
Compare With > Each Other를 차례로 선택합니다.

출처: Using Eclipse to compare two files

Posted by 나야

댓글을 달아 주세요

2009. 9. 29. 22:52
OS를 64bit로 설치하면, JVM도 64bit로 설치하고 싶어집니다. 하지만, Eclipse를 비롯한 많은 툴들을 64bit로 사용하려면 불편한 점들이 많습니다. 
그래서 64bit JVM의 성능을 테스트 해보기로 했습니다. 64bit jvm으로 검색해보면, 더 많은 메모리를 사용할 수 있지만, 성능에 있어서는 메리트가 없다는 글을 읽어볼 수 있는데, 성능에서 메리트가 없다면, 굳이 64bit JVM을 사용할 필요가 없기 때문입니다. 

결론부터 말씀드리자면 잘 모르겠다이지만, 흥미로운 결과를 볼 수 있습니다. 

일단 32bit JVM과 64bit JVM을 모두 설치했습니다. 
그리고 이클립스도 32bit 버전과 64bit 버전을 모두 다운받아서 압축을 풀어놓았습니다. 
두 가지 이클립스를 모두 실행시켜보니, 32bit 버전의 이클립스는 eclipse.exe 프로세스만 실행되지만, 64bit 버전의 이클립스는 eclipse.exe 프로세스 외에 javaw.exe 프로세스가 별도로 실행되며 이 프로세스가 주된 프로세스입니다. 


위의 그림에서 *32 로 표시되어 있는 eclipse가 32비트로 동작하고 있으며, 메모리가 184MB정도 차지하고 있네요. 

그리고 다음과 같은 간단한 테스트를 해보았습니다. 
1. int 형 더하기 연산
2. long 형 더하기 연산
3. float 형 더하기 연산
4. double 형 더하기 연산
6. ArrayList, LinkedList methods
7. String add method

코드는 조악하기 때문에 일단 생략하고, 최대한 다른 연산은 생략하고, 연산만 여러번 하게 했습니다. 
결과는 다음과 같은데 좀 이상합니다.

위쪽이 64bit jvm, 아래쪽이 32bit jvm이며, 32bit jvm은 시간이 오래 걸려서 세번만 한다음 평균내었습니다. 단위는 ms입니다. 
특이한 점은 64bit jvm 에서의 int, float, double 덧셈 연산의 속도입니다. 32bit jvm과는 비교할 수 없을 정도로 빠른 속력을 보여주었습니다. 
long 역시 2배 정도 빠르게 계산했습니다. 

먼저, int, float, double 연산을 좀 살표보자면, 
9ms라는 것은 뭔가 아무것도 실행되지 않은 것만 같습니다. 

코드는 아래와 같습니다.

long sT= System.currentTimeMillis();
int temp=0;
for(int j=0; j< Integer.MAX_VALUE;j++) { temp= j+j; }
System.out.println(temp);
System.out.println("Integer Addition: "+ (System.currentTimeMillis()-sT));

4번째 줄에 temp를 출력하고 있는데 값이 할당만 되고 사용되지 않으면, 컴파일러가 하는지, jvm이 하는지 모르겠지만, temp에 관련된 코드는 실행되지 않습니다. 그래서 출력하고 있습니다. 
어쨌든, 이런 코드를 9ms라는 경이로운 속도로 계산합니다. 좀 이상해서 아래와 같이  반복문을 한번 더 감쌌습니다. 

long sT= System.currentTimeMillis();
int temp=0;
for(int i=0; i< Integer.MAX_VALUE;i++) {
     for(int j=0; j< Integer.MAX_VALUE;j++) { temp= j+j; }
}
System.out.println(temp);
System.out.println("Integer Addition: "+ (System.currentTimeMillis()-sT));

이번에는 12,839 ms 정도의 시간이 걸렸습니다. 9 ms * Integer.MAX_VALUE 정도의 시간이 걸릴 줄 알았는데, 12 초밖에 안걸렸네요. 
그리고 이번에는 수정한 코드는 32bit jvm 에서 실행하려고 하다가 백만년 걸릴 것 같아서 밖의 루프를 세번만 돌렸습니다. 14초 정도 나왔는데, 한번만 돌렸을 때보다 4배정도 시간이 더 걸렸습니다.

어쨌거나 int, float, double 계산에서는 64bit jvm 이 엄청난 연산 속도를 보여주었습니다. 
float과 double 연산 속도에 차이가 나지 않는 이유도 궁금하지만 지금 시간이 새벽 1시 55분이므로 뭔가 자야겠다는 압박에 패스.

그러나 사실, int, float, double 연산을 어떤 프로그램이 그렇게 많이 하겠습니까.
자바로 포토샵 만들것도 아니라는...
그래서 ArrayList, LinkedList의 add연산 속도를 보았습니다. 

그리고 그 결과는..
사실 별차이가 없을 것이라고 생각했는데, 
ArrayList의 경우는 64bit jvm이, LinkedList의 경우는 32bit jvm이 빠른 속도로 실행되었습니다. 

... 뭥미 ...
add 메소드를 분석해보고 싶지만, 좀전에도 말씀드렸지만 지금 시간이 1시 55분인데다 내일은 마드리드에서 귀국하셔서 아직 여독이 풀리지 않으셨을 교수님과의 랩미팅이 있기때문에 그만 자고 싶습니다. 

그래도 궁금하기 때문에 소스를 쓱 봤는데, 알고 계시는 것처럼, ArrayList의 add연산자는 내부 array객체가 모두 할당되면, 그 전에 만들어져있던 배열 크기의 3/2 배 크기의 배열을 새로 만들고 복사하고, LinkedList 는 앞뒤 객체를 할당하는 연산을 합니다. 

자 이제 그만 자야겠기에 섣부른 결론은 내리겠습니다. 
int, float, double 에 대한 단순 수치 연산은 64bit jvm이 엄청나게 빠르다. 
객체 할당 연산(예를 들면, Object obj= otherObject ) 은 32bit jvm이 2배 빠르다. (요건 메모리 주소 범위가 넚기 때문일 것 같다는...) 

 테스트 환경은 Vaio TT2인데, CPU는 SU9600(1.60GHz), Windows 7 64bit 입니다. 
CPU-Z를 급 다운받아서 확인해보면 아래와 같이 나오네욥. 


TT가 음질, 무게, 배터리 등 장점은 많은데, 아무래도 CPU 성능은 좀 아쉽습니다.
또 뻘짓하다가 3시가 다되었습니다. ㅜㅜ
...
...
Posted by 나야

댓글을 달아 주세요

  1. gaiserne 2010.01.23 16:51 신고  댓글주소  수정/삭제  댓글쓰기

    흥미로운 실험이네요. 예상으로는 별차이가 없을 것 같은데, 생각보다 차이가 많이 나네요.
    저도 한번 테스트 해보고 싶은 실험이네요. ^^

    자바와 C#의 실행 속도 비교도 궁금해지네요.
    C, C++은 확실히 빠를꺼 같고.

  2. broo 2010.05.20 13:35  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다.

  3. nov07 2010.09.14 13:02  댓글주소  수정/삭제  댓글쓰기

    말그대로 흥미롭네요

    이번에 윈764비트를 설치하였는데

    어떤 버전을 설치해야 할지 망설여지네요 ㅋㅋ

    잘보고 갑니다

  4. uj 2013.06.19 09:29  댓글주소  수정/삭제  댓글쓰기

    오 재미있고 나름 유익한 정보입니다. 감사합니다. 잘 봤습니다.

2009. 9. 27. 19:01
JDBC를 사용하면서 매번 불편했던 점은

ResultSet rset= stmt.executeQuery(sql);

이런 문장을 실행하면, 질의 결과를 모두 받아와서 rset에 넣는 다는 것입니다.
따라서 대용량의 데이터를 한번에 처리할 때는 미리 받아올 데이터의 수를 제한할 필요가 있습니다.
해결책은 바로 Statement 인터페이스의 setFetchSize() 입니다.

http://benjchristensen.com/2008/05/27/mysql-jdbc-memory-usage-on-large-resultset/ 을 보고 알게되었는데,
이 글은 MySQL의 경우를 설명하고 있는데, PostgreSQL의 jdbc드라이버에도 사용할 수 있습니다.

2011.12.28 추가.
setFetchSize() 메소드의 구현방식은 jdbc 제공자에 따라 달라집니다. 
구글에서 setFetchSize()를 검색하면 나오는 
http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize  
http://dev.fyicenter.com/Interview-Questions/JDBC/What_does_setFetchSize_really_do_.html 
같은 글들이 setFechSize()를 사용하는데 도움이 될 것 같습니다. 
Posted by 나야

댓글을 달아 주세요

2009. 9. 6. 15:45
텍스트를 처리할 때, replaceAll 을 많이 사용하는데, 내부적으로 Pattern.compile 메서드를 호출해서 정규표현식을 매번 컴파일 합니다. 따라서 같은 정규표현식을 계속해서 사용해야 하는 경우, Pattern.compile을 직접 호출하여 Pattern 객체를 만들어놓고 그 Pattern 객체를 사용하는 것이 좋습니다.
Posted by 나야

댓글을 달아 주세요

2009. 8. 9. 22:49
아래는 다 잡설이고, http://cnx.org/content/m15092/latest/  StarUML tutorial 이네요. UML 툴에 익숙하지 않은 저도 쉽게 따라해볼 수 있었습니다. 

연구실에서 뭔가를 혼자서 만들때 뭔가 도구를 이용해서 디자인하고 문서화도 했습니다. 그런데, uml 도구라는 것이 쉽지 않더군요.
일단 UML 자체를 모르니. 그래서 당당하게 검색해봤습니다. "UML". 나와라. 오바.

UML. 그것은 Unified Modleing Language. 그러나 한국 위키피디아에는 이 항목이 없군요. 그래서 그냥 읽었습니다. 
지금부터 영문 위키피디아 내용.

UML은 소프트웨어 엔지니어링 분야에서 사용되는 표준화된 일반 목적의 모델링 '언어' 입니다. 특정한 시스템의 추상적 모델을 위한 도식화 기술 기법들을 포함하고 있습니다. 
객체지향 소프트웨어 중심의 시스템의 구조(artifact) 를 명세, 도식화, 수정, 구성, 문서화하기 위해 사용되는 공개된 방법입니다. 시스템의  청사진을 작성하기 위한 표준화된 방법을 제공하는데, 다음과 같은 conceptual ccomponent 들이 그 방법입니다. 
conceptual component에는 actors, business processs, system component and activity 가 있습니다. 
또한 다음과 같은 구체적인 것들도 제공하죠.
프로그래밍 언어 설명, 데이터베이스 스키마, 재사용가능한 소프트웨어 컴포넌트.
UML은 entity relationship diagrams, business modeling(work flow), object modeling, component modeling 등으로부터 좋은 것은 모아서 만들어졌습니다.

으아~ 내용이 너무 많네요. 일단 UML이 왜 이런 혼탁한 세상에 존재하는지 알았으니 패스패스.

자 그럼 StarUML 을 시작해보도록 하겠습니다. 일단 StarUML을 켜고...
... 뭐지 이게. 5가지가 있네요. 4+1 View Model, Default Approach, Relational Approach, UML Component Approach. 그리고 Empty Project

1. 4+1 Architectural View Model: 최종 사용자, 개발자, 프로젝트 관리자 등의 다양한 관점에서 시스템들 기술하며, logical, development, process, physical view 등의 네가지 'view'를 통해 기술된다고 합니다. 
Logical View는 최종사용자에게 제공될 기능을 고려하는데, UML Diagram에서 Class Diagram, Communication diagrm, Sequeence diagram 등이 이에 해당된다고. 


Development view는 당연히 프로그래머의 관점에서 시스템을 그리게 되는데, Implementation view라는 이름도 갖고 있다고. 시스템 구성요소를 묘사하기 위하 UML Component diagram를 사용한다고. 
Process view는 시스템을 동적인 관점에서 바라봄. 

... '바라봄'이라고 타이핑을 치고 나니. 하니 박봄이 생각나네요. 요즘 좀 짱인듯! 머리도 아파오는데 잠시 사진 보고 힘내자구요. 목소리가 더 좋음. 근데 누나라는 얘기가 있던데..핫핫... I don't care, 그만할래~ 니가 이디서 뭘 하든 이젠 정말 상관 안할게~ 

(다시 돌아와서 Process view를 보고 있었습니다.) 시스템 프로세스를 설명하고, 프로세스들 간에 통신은 어떻게 이루어지는지, 그리고 시스템이 실행될 때의 행동들을 다룹니다. Process view는 동시성, 분산, 통합, 성능, 가용성 등을 다룹니다. 그리고 Activity diatram을 포함합니다. 
Physical view: 시스템 엔지니어의 관점에서 봅니다. 컴포넌트들의 배치를 다루는 view입니다. deployment view라고 부르기도 하고, Deployment diagram을 포함합니다. 
Scenarios: 적은 수의 use case 또는 scenario로 구조를 기술하며 이것이 다섯번째 view입니다. UML Use case digram을 이용합니다. 

아, 예~ 이것이 4+1 View model이었습니다. 자 다음은 rational approach. 구글에서 검색하니 Journal article이 검색되는데 1.99 달라를 내래나 모래나. 어쨌든 뭔지 모르겠으니 패스. 패스패스.. 흣.그럼 어디 StarUML 5.0 사용자 가이드를 한번 읽어볼까요. approach 에 대한 설명은 없는 듯하네요. staruml approach로 검색하니 http://cnx.org/content/m15092/latest/ 이라는 글이 검색됩니다. 오 튜토리얼이군요. 그래서 따라해봤는데, interface와 이를 구현하는 class를 이용하여 StarUML을 설명하고 있습니다. 친절하게 설명되어 있으니 한번 읽어보시는 것도 좋을 것 같습니다. 

UML 툴 자체가 디자인을 위한 도구이기 때문에, 디자인 공부도 같이 해야 겠네요. 일단 도서관에서 책 좀 빌리고....


Posted by 나야

댓글을 달아 주세요

  1. 무개념 2009.09.07 09:24  댓글주소  수정/삭제  댓글쓰기

    스타유엠엘 개념탑재하러 왔다가 사진보고 댓글 달아요~ 짱임! ㅋㅋ

2009. 6. 21. 17:03
Personalized Web Search 와 관련해서 ODP(Open Directory Project) 를 참조하고 있습니다. 이 프로젝트에서는 구축된 웹페이지들의 계층구조를 RDF파일로 제공하고 있습니다. 문제는 이 파일이 너무 크다는 것입니다. 1.9GB와 700MB 정도 크기입니다.그래서 간단한 자바 프로그램을 작성하여 파일을 자르기로 했습니다. 싹둑. 검색해보면 '커다란 텍스트 파일을 편하게 잘라주는 프로그램, iHP TxT Split' 와 같은 글들을 찾을 수 있습니다. 어쨌든 연습 삼아 간단하게 자바로 코딩해보았습니다.

FileInputStream과 FileouputStream 을 사용해서 하나의 파일을 원하는 크기로(거의)  잘라주는 코드 입니다.
package kr.ac.uos.dmlab.odp.io.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TextFileSplitter {
	public TextFileSplitter(File srcFile, String destDir) {
		this.srcFile= srcFile;		
		this.destDir= destDir;
	}
	
	private File srcFile;
	private String destDir;
	
	public void split(long preferedSize) {
		String fileName= srcFile.getName();
		
		long srcSize= srcFile.length();		
		long quotient= srcSize/preferedSize;
		int fileNoSpace= getFileNumberSpace(quotient+1);
		
		int fileNo= 0;		
					
		int buffSize= 9096;
		
		try {
			String firstFileName= destDir+formatFileName(fileName, fileNo, fileNoSpace); 
			FileOutputStream fos= new FileOutputStream(new File(firstFileName));
			System.out.println(firstFileName);
			OutputStream os= new BufferedOutputStream(fos);
									
			FileInputStream fis= new FileInputStream(srcFile);
			InputStream is= new BufferedInputStream(fis);
			
			byte buf[] = new byte[buffSize];
			int s = 0;
			long writtenSize= 0;
	
			while ( (s = is.read(buf, 0, buffSize)) > 0 ) {
				if (writtenSize > preferedSize) {
					writtenSize=0;
					fileNo++;					
					os.close();
					String outputFileName= destDir+formatFileName(fileName, fileNo, fileNoSpace);
					System.out.println(outputFileName);
					os= new BufferedOutputStream(new FileOutputStream(new File(outputFileName)));
					
				}
				os.write(buf, 0, s);
				writtenSize= writtenSize + s;
			}
			os.close();
			is.close();
			
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}  
	}
	
	private int getFileNumberSpace(long quotient) {
		if (quotient==0) {
			return 1;
		}
		
		int space= 0;
		while( quotient > 0) {
			quotient= quotient/10;
			space++;
		}
		return space;
	}
	
	private String formatFileName(String prefix, int fileNo, int fileNoSpace) {
		int space= fileNoSpace- getFileNumberSpace(fileNo);
		
		
		StringBuffer sb= new StringBuffer();
		
		sb.append(prefix+".part");
		for(int i=0; i< space; i++) {
			sb.append(0);
		}
		sb.append(fileNo);
		
		return sb.toString();
	}
	
		

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TextFileSplitter splitter= new TextFileSplitter(new File("odp/structure.rdf.u8"), "odp/");
		splitter.split(20000000);
	}

}

split 메소드에서 소스 파일을 읽어와서 목적지 디렉터리에 파일을 씁니다. 
이 코드를 사용하면 대강 preferedSize와 비슷한 크기로 파일을 자를 수 있습니다. 
파일을 정확한 크기로 자르지 않는 이유는 그렇게 하려면 원하는 크기까지 쓰고 남은 부분을 따로 저장해놓았다가 다음 번에 쓰는 코드가 추가되어야 하는데, 정확한 크기로  잘라내야 할 이유는 없기 때문에 그냥 두었습니다. 귀차니즘....
클래스 명이 TextFileSplitter인데 그냥 FileSplitter가 맞겠네요.
Posted by 나야

댓글을 달아 주세요

2009. 6. 10. 21:00
http://commons.apache.org/configuration/

연구실에서 프로젝트를 할 때, DB 계정 정보 등의 설정 정보 등을 XML파일로 적어놓고 참조하려고 마음을 먹었습니다. 그래서  XML파일 읽는 코드를 한 20줄 짜고, 이 설정 정보를 java.util.Properties 에 저장하여 메모리에 유지하도록 static 하게 변수를 선언하는 등의 작업을 하였으나, 검색해보니 Apache Commons 프로젝트에 Configuration 이라는 컴포넌트가 있습니다.

구글에서 검색하니 http://twit88.com/blog/2007/09/18/xml-configuration-for-java-program/  에도 간단한 예가 나와있습니다. 어쨌든, http://commons.apache.org/configuration/userguide/user_guide.html 를 보시면 이 컴포넌트의 사용방법이 자세하게 기술되어 있습니다. 그리고 User guide의 Hierarchical Properties 항목을 보면, XML파일을 이용하는 방법이 기술되어 있습니다. 

간단히 따라해보았습니다.
먼저 conf.xml 라는 이름의 xml 설정파일을 만들었습니다. 

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<database>
		<server>
			<type>PostgreSQL</type>
			<host>localhost</host>
			<port>5432</port>
		</server>
		<user>				
			<name>coinus</name>
			<password>1124</password>
		</user>
		<database>
			<name>coinus</name>
			<charset>UTF8</charset>
		</database>
	</database>		
</config>
다음은 XMLConfiguration 를 사용해서 XML파일을 읽는 간단한 예제입니다.

package kr.ac.uos.dmlab.config;

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

public class ConfigLoader {
	
	private static XMLConfiguration load(String file) {
		XMLConfiguration conf= null;
		try {
			conf= new XMLConfiguration("conf/conf.xml");
			
			System.out.println(conf.getString("database.server.type"));
		} catch (ConfigurationException e) {
			e.printStackTrace();
		}
		return conf;
	}
	
	public static void main(String[] args) {
		load("conf/conf.xml");
	}
	
}
load()  메소드 중간에 root element인 config 밑의 database 밑의 server 밑의 'type' element의 문자열 값을 가져와서 출력하는 코드가 13 line에 있습니다. 이렇게 element의 value를 문자열이나 정수형 등으로 가져올 수 있습니다. 물론 attribute도 사용할 수 있습니다. 자세한 내용은 User Guide의 Hierarchical Properties 를 참조해주세요. ^^;;

아 그리고 Configuration 컴포넌트의 코드에서 Commons의 다른 컴포넌트들, lang, collections, logging 등이 사용됩니다. 모두 다운 받아서 추가해주어야 합니다. 현재로서는 많은 기능이 필요한 것은 아니지만, 머 훌륭한 코드들일테니 배워두어서 나쁠리 없겠죠.

[딴얘기]
http://gyuha.tistory.com/193 를 감사히 보고 써보니 정말 좋은 것 같군요. 

Posted by 나야

댓글을 달아 주세요