본문 바로가기

java

[Java] 누가 날 부른거요? 날 호출한 클래스 알아내기. 회사에서 검색 서비스 개발 및 운영을 담당하고 있는데요.. 업무 중 하나가.. 솔루션으로 구매하여 사용하는 엔진의 RAW-LEVEL의 API를 우리 개발자들이 사용하기 편하게 한번 감싸서 검색 API를 개발해 제공하는 업무가 있습니다. 주로 성능보다는 재사용성이나 사용하는 입장에서 쓰기 편하게 그리고 검색 서버의 IP등의 프로퍼티 값들의 변경에 쉽게 대응 할 수 있고 디버깅을 쉽게 할 수 있도록 하는데 중점을 두고 API를 만들어 제공하고 있는데요.. 검색 API라는 것이 단순히 쇼핑몰의 검색결과 페이지에서만 사용되는 것이 아니고 카테고리, 기획전, 리뷰, 모바일, 오픈API등 굉장히 많은 곳에서 사용되게 마련이지요.. 그러다보니 의도하지 않은 검색 쿼리들이 유입되는 경우가 있거나 의도적인 악성 검색 쿼.. 더보기
[Java] Map과 List로 검색엔진 구현해보기 -3- 이 주제에 대한 마지막 글입니다. 이전에 Indexing 부분까지 작성하고 까먹고 있었네요.. --ㅋ 이전 포스트까지 문서를 Indexing하고 해당 문서를 저장하여 두는 Store까지 살펴보았습니다. 간단하게 요약하면 문서의 내용을 분석하여 키워드를 추출하고, 그 키워드를 필드별로 해당 키워드를 가진 문서번호(내부적인 unique number)와 연결하여 인덱스 파일에 저장해두는 개념이었습니다. 그렇다면 검색은 어떤 방식일까요? 키워드를 통해 위 인덱스파일에서 문서번호를 검색하여 리턴하는 구조가 될 것 입니다. IndexSearcher.java 인덱스파일은 변경이 될 수 있도록 외부에서 인덱스파일을 셋팅 할 수 있도록 하였습니다. 소스의 간소화를 위해 "제목"과 "본문" 필드에 대해서 키워드로 검색을 .. 더보기
[Java] Map과 List로 검색엔진 구현해보기 -1- 회사에서 검색 파트를 맡고 있으면서 신규로 검색 파트로 들어오는 후배들 교육을 위해 만들었던 예제 소스입니다. 검색이 역인덱스 구조로 되어있고 대략 이런이런 형태로 검색과 색인이 된다.. 말로 설명을 하는 것 보다 간단하게 직접 자료구조를 구현해 보는 것도 도움이 될 것 같아서 만들었었습니다. 실제로 자료구조의 구현이라하면 굉장히 어려운데 교육 목적이었기 때문에 자료구조라 부르기도 민망 할 정도로 간략화 시켰습니다. 검색 엔진의 구현이라고 하였지만 사실 키워드 추출/ 키워드를 통한 색인 및 검색으로 한정지어 간략화시켰기 때문에 검색엔진을 만드는데 있어서 필요한 다른 고려 사항은 하나도 들어가 있지 않습니다. 역인덱스 구조를 Map과 List로 간단하게 구현하였고 (Map의 Key가 키워드, Value가 .. 더보기
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이라는게 계산을 빠르게 근사치로 하기 위해서 만들어졌다고 하니.... 메모리 사용도 줄어들었을테고.. 아무튼.. 대용량처리에서는 정확한 값이 필요한 경.. 더보기
[Java] 오늘의 교훈. 위와 같은 코드가 있었다. 위와 같은 상태에서 class A에 있던 public enum을 삭제하고 하나의 독립적인 클래스 파일로 E라는 enum 클래스를 생성하였다. 어차피 public이고 Type도 그대로인지라 컴파일에러는 어디서도 떨어지지 않았고, 변경된 클래스인 A와 새로 만들어진 enum 클래스인 E만을 배포하여 컴파일하였다. 전혀 문제가 없을거라 생각했는데 문제는 User 클래스의 do() 메서드에서 발생하였다. 생각해보면 당연한 것인데... 기존의 E enum 클래스의 return type은 A$E 였고, 새로 뽑아낸 enum 클래스의 Type은 E였다. (기본적으로 앞에 붙는 패키지는 제외..) 결국, 타입이 맞지 않는 오류가 발생하여 위와 같이 기존의 E를 받아 쓰던 클래스들을 전부 다시.. 더보기
[Java] equals의 활용. 더 나아가 코드 구현의 방법. - 2 - 앞서 포스트에서는 결과 값을 List에 담기로 하였습니다. 그래서 중간 중간 나오는 결과를 List에 담아 두는 로직이 들어가 있었습니다. 하지만, 그렇기 때문에 이미 합산 된 검색어를 찾기 위해서 다시 List에 대해 loop를 돌면서 해당 검색어를 가진 TestDomain을 찾아야 했습니다. 순차 탐색을 하기 때문에 최대 n만큼의 시간이 소요됩니다. 합산 되는 결과가 많아져서 List의 크기가 커질 수록 탐색 시간도 길어질 것 입니다. 그러면 이 탐색시간을 줄이면 더욱 속도를 올릴 수 있을 것 같습니다. 여러가지 데이터를 탐색하는 알고리즘 중에서 상당히 빠른 방법이 있습니다. 바로 HashCode를 사용한 방법입니다. 이제 350000개의 7일치 검색어를 loop돌면서 (이건 어쩔 수 없다 치고요.... 더보기
[Java] equals의 활용. 더 나아가 코드 구현의 방법. - 1 - 이번에 작성하는 내용은 딱히 어떤 주제를 정하기가 좀 그렇네요.. 먼저 이 내용은 어떤 코드가 제일 좋다 나쁘다를 얘기하기 위한 것은 아닙니다. 약간의 생각의 전환이 많이 다른 결과를 가져 올 수도 있다는 것을 이야기 하고 싶어서 작성하는 글 입니다. 제가 최근에 한 소스에서 본 내용을 리팩토링 했던 내용을 적어 보려고 합니다. 7일치의 검색어와 그 검색어의 검색 횟수를 합산하는 프로그램이 있습니다. 일단, 어딘가의 로그에서 하루 단위의 각 검색어와 그 검색어의 검색 횟수는 가져 올 수 있다고 가정하고 하루에 검색횟수 상위 5만개의 검색어를 7일치 가져와서 각 검색어의 검색 횟수를 합산하고 이것을 merge하여 다시 검색 횟수순으로 정렬하여 보여주는 프로그램입니다. 어떻게 보면 map and reduce.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 4 - 인터페이스에 대한 얘기를 하다가 여기까지 오게 되었네요.. 이번 포스트에서는 어노테이션을 사용해서 지금까지 만들었던 심플 프레임워크를 바꿔보려고 합니다. 사실 이번 포스트는 인터페이스와는 큰 관련은 없을지 모르겠습니다. 어노테이션은 @XXX 의 형식으로 사용되는 것으로 가장 대표적인 어노테이션은 @Override 그리고 스프링에서 사용하는 @Controller나 JUnit4 이상에서 사용되는 @Test 정도라고 생각하는데요 이 어노테이션은.. 사전에서는 주석이라고 되어 있습니다. 일반적으로 코드에 주석이라고 하면 컴파일러나 JVM은 읽지 못 하고 사람만 볼 수 있는 주석이라고 생각을 했다면 이 어노테이션은 컴파일러나 JVM에서도 볼 수 있고 활용 할 수 있는 주석이라고 보시면 될 것 같습니다. 어노테이션.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 3 - 앞선 포스트에서는 Interface를 사용해서 같은 Interface를 구현한 테스터 클래스들을 한번에 실행하여 그 결과를 볼 수 있는 Tester.java 까지 구현하였습니다. Tester.java 새로운 테스터가 추가되어야 한다면 ProductTester Interface를 구현하여 위 Tester.java 에서 그 클래스를 add해주면 되었습니다. 하지만, 매번 이렇게 테스터가 추가 될 때 마다 클래스를 수정하고, 컴파일해서 배포를 해야 한다면 조금 귀찮은 작업이 될 수도 있습니다. 그리고, 실제로 현장에서 사용되는 테스터 클래스가 한두개가 아닐 수 있는데 그렇게 되면 Tester.java의 클래스는 addTester 메서드로 도배가 될 것 입니다. 그래서 간단하게 프로퍼티를 사용해서 , 테스트 할.. 더보기