기본 콘텐츠로 건너뛰기

11월, 2014의 게시물 표시

Log4J Async 설정하기

  현재 진행 중인 검색 (Solr + SolrJ) 프로젝트에서 Paging 처리를 하고 있는데 페이지를 랜덤으로 이동을 하게 되면 시간이 너무 오래 걸리는 증상이 발견이 되어, 이런 저런 테스트와 Solr 관리 화면을 통해서 start 와 rows 를 지정하고 검증을 해 보면 약간 느리다는 느낌을 받지만 그 다지 문제가 되지는 않을 정도로 결과가 나왔다. 그런데 막상 구현한 SolrJ 클라이언트를 통해서 검색을 하면 무려 11초 이상이 걸리는 증상이 계속되고 있다.     여러 가지 의심되는 부분들을 조정하면서 검증을 수행한 결과 Log4J 의 Logging 처리 때문이라는 것이 확인이 되었다. 이유는 기본 Log4J 에 LogLevel을 Debug로 설정 상태에서 Solr 의 결과를 Debug 출력하고 있었던 것이 문제가 된 것이다. 로그 출력을 INFO 수준으로 높이고 실행한 결과 대략 Solr 관리 화면에서 수행한 것과 비슷한 수행 시간이 걸리는 것을 확인했다.     검증을 위해서 결과 출력을 제외할 수는 없기 때문에 비 동기 방식으로 전환을 하여 적용하면 약간은 느리겠지만 정보를 확인하는데 문제는 없기 때문에 이번에는 비 동기 설정에 대해서 정리를 하도록 한다.   Log4J Async 설정     Log4J 에서는 AsyncAppender를 제공하고 있으며 이를 통해서 로그를 비 동기로 처리하게 된다. 설정 방법은 기존에 사용하는 것과 크게 다르지 않다. 다만 CONSOLE 이나 FILE 등의 Appender 를 사용하고 있었다면 AsyncAppender로 기존 Appender를 연결해서 사용하도록 해 주면 된다. 아래의 예제를 확인해 보자.   <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4...

[ SOLR ] DataImport 처리할 때 주의할 점.

  Solr 에 외부 데이터를 Import 할 때 사용하는 것이 DataImport 패키지다. Solr 를 다운로드하면 존재하는 별도의 라이브러리로 Solr 에서 Batch Import 역할을 담당한다. 다양한 데이터 소스로 부터 데이터를 처리하는 방법을 제공하고 있기 때문에 실제 적용할 때는 관련된 Wiki 정보 를 확인해 보면 된다.   Solr 에서 자체적으로 제공하는 UpdateHandler 와는 다르게 동작하는 것으로 파악이 된다. 즉, UpdateHandler에서 처리하는 Chain 들의 처리를 DataImport에서 따로 설정해서 처리를 하여야 한다는 점이다. 이런 처리를 수행할 때 주의할 점이 존재한다.   데이터를 가져올 특정 테이블에 HTML 태그들을 포함하는 "content" 컬럼이 존재할 경우에 이를 가져와서 HTML 이 존재하는 정보 (원본 데이터 그대로) 화 HTML 이 제거된 정보를 사용하여야 하는 경우라면 아래와 같이 설정을 하여 처리를 하게 된다. <dataConfig> <dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="DB 연결 문자열" batchSize="-1" user="사용자 아이디" password="사용자 비밀번호" /> <document> <entity name="Entity이름" pk="id" transformer="TemplateTransformer, HTMLStripTransformer" query=...

[ JAVA ] Spring + Tomcat 에서 한글 (UTF-8) 설정하기.

  스프링 프레임워크와 Tomcat을 사용하는 환경에서 한글을 UTF-8 로 처리하는 방법은 여러 가지가 존재한다. 그 중에서 일반적으로 사용할 수 있는 방법을 정리해 놓도록 한다.    우선 당연한 것이겠지만 원본 소스 코드의 문서 인코딩이 당연히 UTF-8 이어야 한다. Windows Preference 에서 Workspace의 텍스트 파일 인코딩을 UTF-8로 설정하면 된다.   Tomcat의 Server.xml 에서 Connector에 URIEncoding을 UTF-8로 설정하면 된다. ... <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" /> ...   스프링 프레임워크에서 기본적인 POST 에서 한글 처리 방식으로 Filter를 설정하면 된다. web.xml 아래와 같이 설정이 가능하다. ... <!-- 모든 Filter 들 중에서 가장 처음에 존재하여야 함 (단, String 기반의 JSON 반환에서는 적용되지 않음) --> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>enc...

[SOLR] 나름대로의 Solr 를 정리해 보자.

  이번 프로젝트는 검색엔진을 구성해 보는 것이다. 전문 검색업체를 통해서 진행되는 것은 아니고, 이미 구축되어 있는 시스템에 검색엔진을 연계하는 작업이다. 주변에서 검색 엔진을 연동하는 프로젝트들을 좀 보았지만 막상 혼자서 시작하려니 막막하다.   항상 그렇듯이 구글을 통해서 사용가능한 검색엔진을 찾던 중에 Lucene이라는 것을 알게 되었고, 이미 개념을 탑재하신 분들도 Lucene을 권장한다. 단, Lucene은 말 그대로 엔진일 뿐, 실제 사용을 위해서 주변 머리를 정리하는 것도 일이라... 좀 더 많은 검색을 통해서 Solr 와 ElasticSearch 라는 두 가지 오픈소스 검색엔진을 찾았다. 정확히는 Lucene 엔진을 실제 사용하기 쉽게, 그리고 실 사용에 필요한 많은 추가 기능들을 탑재한 검색 서버라고 하는 것이 맞을 듯 하다.   아무리 잘 만든 검색 서버라고 해도 사용할 사람이 지식이 없으면 말짱 도루묵인 것처럼... 막상 찾아놓고도, 그리고 Tutorial을 봤음에도 정작 중요한 개념들과 어떤 것들이 어떻게 설정이 되어야 제대로 사용하는 것인지에 대한 고민만 늘어간다. 그래서 "Solr in action" 이라는 책을 근거로 해서 하나씩 정리를 해 볼 생각이다.   앞으로 진행은 Solr in action의 챕터별 단원별로 하나씩 정리를 하되, 발 번역한 내용에 문제가 많을테니, 가급적이면 이해된 내용을 기준으로 짧게 정리를 해 볼 생각이다. 이미 많은 분들이 많은 부분들과 중요한 기법들을 정리해 놓은 것들이 많기 때문에 여러가지를 참조하면서 느리더라도 가능하면 쉽게 이해하고 사용할 수 있도록 정리가 되었으면 하는 희망을 가지고 진행하도록 하자.   그리고 현재 시점의 버전인 4.10.2 (Solr, Lucene, SolrJ 모두 동일 버전) 를 기준으로 한다. (다른 글들은 이전 버전을 기준으로 하고 있어서 크고 작게 변경된 부분이 많다) Part I - Meet So...