본문 바로가기

Java

[Java] Map과 List로 검색엔진 구현해보기 -3- 이 주제에 대한 마지막 글입니다. 이전에 Indexing 부분까지 작성하고 까먹고 있었네요.. --ㅋ 이전 포스트까지 문서를 Indexing하고 해당 문서를 저장하여 두는 Store까지 살펴보았습니다. 간단하게 요약하면 문서의 내용을 분석하여 키워드를 추출하고, 그 키워드를 필드별로 해당 키워드를 가진 문서번호(내부적인 unique number)와 연결하여 인덱스 파일에 저장해두는 개념이었습니다. 그렇다면 검색은 어떤 방식일까요? 키워드를 통해 위 인덱스파일에서 문서번호를 검색하여 리턴하는 구조가 될 것 입니다. IndexSearcher.java 인덱스파일은 변경이 될 수 있도록 외부에서 인덱스파일을 셋팅 할 수 있도록 하였습니다. 소스의 간소화를 위해 "제목"과 "본문" 필드에 대해서 키워드로 검색을 .. 더보기
[OAuth] OAuth 이해하기 http://dev.springnote.com/pages/1083036 더보기
[Java] Map과 List로 검색엔진 구현해보기 -2- 앞서 말씀드린대로 검색엔진의 가장 기본적인 구조와 자바에 대한 기초 교육을 겸하려했던 예제입니다. 우선 Map과 List로 검색엔진의 원리를 구현하려면 우선 검색엔진에서의 역인덱스 구조에 대해서 알아야 합니다. 제 블로그에서도 몇 번 언급은 되었었지만 간단하게 말씀드리면 문서들로부터 키워드를 추출하고 그 키워드가 어느 문서에 있는지를 기록해 둔 형태입니다. 책을 사면 맨 앞에 목차(INDEX)가 있고 일반적으로 맨 뒤에 보면 키워드와 해당 키워드의 내용이 있는 페이지가 들어있는 부록이 있는데 이것이 역인덱스 구조입니다. 순서보다는 원하는 키워드로 찾고자 하는 내용을 가장 빠르게 접근 할 수 있는 구조로 되어있습니다. 이것을 Map과 List로 구현한다고 하면... Map의 Key가 키워드가 될 것이고 V.. 더보기
[Java] Map과 List로 검색엔진 구현해보기 -1- 회사에서 검색 파트를 맡고 있으면서 신규로 검색 파트로 들어오는 후배들 교육을 위해 만들었던 예제 소스입니다. 검색이 역인덱스 구조로 되어있고 대략 이런이런 형태로 검색과 색인이 된다.. 말로 설명을 하는 것 보다 간단하게 직접 자료구조를 구현해 보는 것도 도움이 될 것 같아서 만들었었습니다. 실제로 자료구조의 구현이라하면 굉장히 어려운데 교육 목적이었기 때문에 자료구조라 부르기도 민망 할 정도로 간략화 시켰습니다. 검색 엔진의 구현이라고 하였지만 사실 키워드 추출/ 키워드를 통한 색인 및 검색으로 한정지어 간략화시켰기 때문에 검색엔진을 만드는데 있어서 필요한 다른 고려 사항은 하나도 들어가 있지 않습니다. 역인덱스 구조를 Map과 List로 간단하게 구현하였고 (Map의 Key가 키워드, Value가 .. 더보기
[Java] Proxy를 사용하여 MyBatis의 Mapper 구현해보기 -3- 이전 글에서 Mapper를 MapperFactory라는 클래스를 통해 생성하여 구현하였었습니다. 앞에서도 말씀드렸지만 이전 예제는 Mapper의 return type이 고정되어 버린다는 단점이 있었습니다. 이 부분을 Generic을 사용하여 수정해보려고 합니다. 기본적으로 앞서 구현했던 Select 어노테이션과 User클래스, 그리고 User를 Select 할 수 있는 UserMapper외에 Depart 도메인에 대한 Mapper를 추가하겠습니다. Depart.java DepartDataMapper.java Depart와 Depart를 Select하는 Mapper입니다. 그 다음 이 Mapper를 대신하여 수행 될 ProxyHandler입니다. MapperProxyHandler.java 보시면 아시겠지만.. 더보기
[Java] Proxy를 사용하여 MyBatis의 Mapper 구현해보기 -2- 우선 앞선 포스트에서 말씀드렸듯이 http://pungjoo.tistory.com/17 이곳에서 Proxy API의 사용방법과 내용에 대해서 먼저 읽어주세요. 위 내용을 기반으로 예제가 작성됩니다. myBatis에서 사용하는 Mapper를 한번 비슷하게 구현해보겠습니다. 우선 Mapper에서 쿼리문을 지정하기 위해 사용될 Annotation을 만들어야 합니다. 실제 MyBatis와 동일하게 Select라는 이름을 사용하겠습니다. Select.java RetentionPolicy가 RUNTIME으로 되어 있으므로, 이 Annotation은 JVM이 실행되는 동안 사용가능하게 됩니다. 그리고 query라는 변수를 통해 위 Annotation은 쿼리식을 가지고 있을 수 있게 됩니다. 그 다음 필요한 클래스는 .. 더보기
swing 예제 하나 돌리는데 Exception이 나네... 그냥 간단한 JFrame 하나 띄우는 예제인데 실행하면 Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: sun.font.FontManager.initIDs(Z)V at sun.font.FontManager.initIDs(Native Method) at sun.font.FontManager.access$000(Unknown Source) at sun.font.FontManager$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.font.FontManager.(Unknown Source) at sun.java2d.Su.. 더보기
[Java] Proxy를 사용하여 MyBatis의 Mapper 구현해보기 -1- 얼마전에 Ibatis 3.0에 해당되는 mybatis가 나왔었습니다. xml에 쿼리를 작성하지 않고도 어노테이션과 인터페이스만으로 쿼리를 실행하고 결과를 받을 수 있게 기능이 추가 되었는데요 대략적인 API의 사용 예를 보면 아래와 같습니다. MyBatis에서 Mapper의 사용예제 UserDataMapper.java 위와 같이 Mapper 인터페이스에 어노테이션을 활용하여 쿼리문을 넣어 놓으면 별도의 구현클래스를 만들지 않아도, SqlSession으로부터 Mapper를 얻어와서 바로 쿼리를 실행하고 그에 따른 결과를 받을 수 있게 되어있습니다. 물론 SqlSession에는 MyBatis에서 사용하기 위해서 기본적은 DB 관련 정보들을 properties로부터 읽어와서 사용하도록 되어있을 것 입니다. 어.. 더보기
Apache common Pool을 사용한 Object Pool 만들기 Apache common 프로젝트 중 Pool이라는 것이 있습니다. Object Pool을 개발 할 수 있는데요.. 간단한 예제를 만들어보려고 합니다. Pool은 풀링 메카니즘을 쉽게 구현 할 수 있도록 해주는 프로젝트입니다. DBCP도 이것을 활용해서 구현되어있구요.. 기본적으로 Pooling 해서 사용 할 클래스를 하나 만들어 보겠습니다. MyPoolableObject 그리고 필요한 것이 위 클래스의 객체를 생성하여주는 Factory 클래스입니다. MyPoolableObjectFactory 위와 같이 두개의 클래스와 Pool에서 제공되는 GenericObjectPool을 사용하면 간단히 테스트 코드를 만들어 볼 수 있습니다. TestPool 결과는 아래와 같이 나옵니다. MyPoolableObject.. 더보기
BigDecimal과 기본형 난 정수가 아닌 소수점 계산이 필요 할 때 거의 대부분에 있어서 BigDecimal을 사용한다. 결과를 예측하기 쉽고 의도대로 계산식을 구현하기 쉽고 정확하게 나오기 때문에.. 이번에 데이터 마이닝 (물론 아주 기초적인 마이닝이지만...)을 하면서도 당연히 BigDecimal을 사용했다. 뭐 느려봐야 얼마나 느리겠어.. 라고 생각하고 있다가.. 이번에 속도를 좀 개선하면서 BigDecimal을 double형으로 바꿨더니 속도가 상당히 빨라졌다. 약 3-6배는 빨라진 것 같다. 멀티스레드로 바꾸면서 개선되었던 속도만큼 빨라진듯.. 뭐 double, float이라는게 계산을 빠르게 근사치로 하기 위해서 만들어졌다고 하니.... 메모리 사용도 줄어들었을테고.. 아무튼.. 대용량처리에서는 정확한 값이 필요한 경.. 더보기