기본 콘텐츠로 건너뛰기

[ SOLR ] Schema 에 기본 값 설정

  Solr 기반 검색 어플리케이션을 테스트하면서 재미있는 증상이 발견 되었다. 증상이라는 것이 일반적인 전체 데이터 조회 (q=*:*) 에서 Score 기반의 정렬에서는 특정 필드가 보이지만, 개별 필드에 대한 정렬 (sort=DueDate desc) 을 실행하면 특정 필드가 사라지는 현상이다.     이런 현상 때문에 여러 가지 테스트를 진행하면서 원인을 파악하던 중에 Solr 에서는 값이 존재하지 않는 필드를 조회할 때 무시하는 상황이 존재한다는 것이다. 즉, 문서에 10개의 필드가 존재하고 전체 필드를 조회할 때 해당 문서에 A 라는 필드가 값이 없다면 이를 제외한 9개의 필드만 반환하는 상황이다.     특정 필드처럼 보였던 이유는 MySQL 에서 Data Import 를 수행할 때 StartDate / EndDate / DueDate 의 일자 컬럼이 존재하는데 EndDate의 경우는 값이 존재하지 않을 수 있기 때문에 Solr 로 전달될 때 NULL 값이 전달되고, Solr 에서는 값이 NULL 이기 때문에 해당 문서에 EndDate를 처리하지 않는 상황인 것이다. 따라서 전체 데이터를 조회할 때는 Score 순서에 따라서 문서들이 보여지면서 EndDate 가 존재하는 데이터들이 보였지만, DueDate를 기준으로 정렬을 다시 구성해서 조회할 때는 상위에 보여지는 문서들에 EndDate 값이 존재하지 않아서 조회 결과에 EndDate 필드가 누락되어 보여진 것이다. 계속 페이징을 해서 내려가 보면 EndDate가 존재하는 문서는 제대로 해당 필드가 보인다.     이 문제를 해결하기 위해서는 Schema.xml 의 필드 정의에서 아래와 같이 기본 값을 설정하여 NULL Value 로 인해서 해당 필드가 누락되지 않도록 설정해 주면 된다. <field name="endDt" type="tdate" indexed="true" sto

[ MySQL ] Windows 8.1 환경에서 Workbench 실행할 때 오류가 발생하는 경우

  윈도우 8.1 을 설치하고 설치 버전이 아닌 포터블 버전의 MySQL Workbench 를 실행하면 (x64, x86 모두) 오류가 발생하는 경우가 존재한다. .NET 환경의 개발자라면 이런 상황은 발생하지 않을 수 있지만 Java 개발 환경이라면 이 오류가 발생할 수 있다.   오류 원인은 MySQL Workbench의 기본 환경 요소 때문에 발생하는데 별다른 설명이 없이 그냥 오류나면서 끝나 버린다. -_-;;; Workbench 실행에 필요한 기본 요소는 다음과 같다. (이 부분은 MySql Workbench 다운로드 사이트  Prerequisites 에 설명되어 있다) Microsoft .NET Framework 4 Client Profile - 이 부분은 Windows 8.1 설치 시에 기본으로 설치되므로 직접적인 원인은 아니다. Visual C++ Redistributable for Visual Studio 2013 - .NET 개발 환경이라면 Visual Studio를 설치했으므로 문제가 되지 않지만 Java 개발 환경이라면 이 부분이 없을 가능성이 높기 때문에 여기서 다운로드 해서 설치를 하면 된다.   얼마 전부터 Java 개발을 하면서 .NET 개발 환경 구성을 하지 않다가 보니 항상 만나는 문제인데, 정리를 해 놓지 않으니 항상 까먹고 원인을 찾겠다고 똑같은 뻘짓을 계속 하고 있다. ㅠㅠ 이휴~   참고로 내 PC 에 .NET Framework이 설치되어 있는지를 확인하는 방법은 Registry  Editor 에서 아래와 같은 키 정보를 확인하면 된다.  여기 사이트 를 참조하면 내용과 다른 방법에 대해서 알 수 있다. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP

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 "log4j.dtd"> <log4j:configuratio

[ 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 Solr     Chapte

[ JAVA ] Google Guava 코드에서 @Nonnull, @Nullable, ... 의미

  Collection 관리 등의 이유로 인해서 Google 의 Guava 라이브러리를 참조해서 사용하고 있다. 여러 가지 상황들에 대한 코드 검토 중에 눈에 띄는 코드가 있어서 정리해 둔다.    @Nullable, @Nonnull 등등의 코드는 액면상으로 보면 뭔가 액션을 취하는 Annotation 코드다. 테스트를 위해서 클래스를 생성하고 해당 코드를 작성하면 "javax.annotation.Nonnull", "javax.annotation.Nullable" 이 필요하지만 찾을 수가 없는 상태다. 무엇이 문제일까?    상기에서 설명한 Annotation에 대해서 검색을 해 보면 자바 메모리 모델 (Java Memory Model) 과 FindBugs 로 유명한 Bill Pugh 교수팀에서 "JSR 305 - 소프트웨어 결함 탐지" 를 위한 Annotation 시작한 것으로 나온다. 그리고 이를 Google 의 Guava 에서 "google findbug jsr305" 팩키지로 배포 및 소스에서 사용하고 있는 것을 볼 수 있다.    실제 해당 Annotation을 코드에서 사용하기 위해서는 아래와 같이 해당 팩키지를 Maven Dependency로 설정해 주어야 사용할 수 있다. ... <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>1.3.9</version> </dependency> ...   FindBugs 프로젝트에서 이미 Method Parameter 와 Return Type 들에 대해 @Nullable, @NonNull, @CheckForNull 등을 사용했으나 이제는 표준화를 위해서 JSR Spec 쪽에 적용을 하고 있는

[ WINDOWS ] Windows 10 TP 에서 Bing Site 가 자동으로 열리는 경우 대응 방법

  어제 저녁에 다른 일을 하고 있는데 뜬금없이 Chrome 에서 Bing 사이트가 열렸다. TP 버전 발표 이후에 잘 쓰고 있었는데 처음으로 겪은 좀 황당한 상황이다. 아~ 쫌 뭔가 생뚱맞은 짓 좀 하지 않았으면 좋겠다. 업데이트 후에 오히려 장애가 생기는 문제나, 알게 모르게 Keylogger를 심어 놓기도 하고 (이 부분은 TP 버전의 특성을 감안하더라도), 이제는 Bing 사이트 자동 오픈까지… 점점 더 그나마 별로 없던 애정도 식어가는 듯…   여기 저기 검색을 하다보니 윈도우 8 부터인 것 같은데 Network Connection (Internet) 이 살아있는지를 검증하기 위해서 “msftncsi.com” 에 접속을 시도한다고 한다. 그런데 이 사이트가 막혀있는 경우에 항상 Connection Fail 이 발생하기 때문에 이런 경우에는 기본 설정된 페이지로 접속을 시도하여 상태를 검증한다고 한다. 기본 설정된 페이지는 아래와 같다. http://go.microsoft.com/fwlink/?LinkID=219472&clcid=0x409  ( 이 URL은  http://www.bing.com  으로 이동 )   이런 처리를 해제하기 위해서는 Registry 를 변경해 주면 쉽게 해결할 수 있다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\EnableActiveProbing   위의 키 값을 1 에서 0 으로 변경 해 주면 된다.

[ WINDOWS] Windows 10 TP 의 Keylogger 에 대한 대응???

  Windows 10 TP (Technical Preview) 가 발표된 후에 얼마 후에 외국의 블로그를 통해서 사용자의 정보등 여러 가지 정보를 MS 로 전송하는 문제를 제기 (“Keylogger Issue”) 한 것을 본 적이 있다. TP 버전이고 사용계약에 명시된 것이라고 해도 실제 데이터가 전송되는 것이 그닥 기분이 좋지는 않다. 더욱이 우리나라처럼 전 국민정보가 공개 정보가 된 상태라서 더 기분이 좋지 않을 수 밖에는 없다.   다른 블로그들의 정보를 검색해 보니 대략 아래와 같은 두 가지 유형의 방법이 있는 것 같다. 작업 스케줄러에 설정되어 있는 작업을 비 활성화하는 방식 Windows 10 설치 시에 관련된 서비를 삭제하고 작업 파일의 접근을 제한하는 방법   위의 처리 방식이 실제 전송을 해제하는지 다른 문제는 없는지에 대한 것은 정보가 없기 때문에 해법이라고 할 수 있는지도 모르겠다. ㅠㅠ 작업 스케줄러 비활성화 방식   아래와 같이 작업 스케줄러를 실행한다. 윈도우키 + R 을 누르고 taskschd.msc 을 입력하거나 윈도우 관리도구에서 작업 스케줄러 실행   작업 스케줄러의 왼쪽 메뉴에서 Windows > Application Experience 로 이동하여 "AitAgent" 작업을 Disable 로 설정   작업 스케줄러의 왼쪽 메뉴에서 Windows > NetTrace 로 이동하여 "GatherNetworkInfo" 작업을 Disable 로 설정   현재 파악된 것은 위의 두 가지 작업이지만 더 존재하는지는 현재 알 수가 없다. 설치 시점에 처리하기   이 방식은 기존 Windows 설치 시에 "Administrator" 계정을 살려서 설치를 진행해 본 경험이 있다면 쉽게 이해할 수 있는 방법이지만 처음 접하는 것이라면 어려울 수도 있다.   1. 설치 과정 중에서 "사용자 계정 생성&q

[ TOMCAT ] 하나의 웹 어플리케이션을 여러 개의 인스턴스로 구동해 보기 (테스트용)

  이전 게시글에서 Tomcat 수동 배포에 대해서 검토를 해 보았으니 이번에는 하나의 웹 어플리케이션을 하나의 Tomcat Engine 으로 Instance 만 여러 개를 만들어 구동하는 방법에 대해서 알아 보도록 한다. Tomcat Multiple Instance 개념   하나의 Tomcat 으로 여러 개의 인스턴스를 만들어서 사용하기 위해서는 약간의 개념(?)을 이해해야 한다. 제일 먼저 Tomcat 의 구조를 이행해야 하므로 간단하게 알아보도록 하자.   위의 그림은 Tomcat 의 기본 폴더 구조를 나타내는 것이다. 각 폴더의 의미는 다음과 같다. lib - Tomcat Engine 이 사용하는 외부 라이브러리 (*.jar) 관리 폴더 bin - Tomcat 실행/종료와 관계되는 스크립트 관리 폴더 conf - Tomcat 에 올라갈 웹 어플리케이션에 대한 설정 파일 관리 폴더 logs - Tomcat 의 로그 관리 폴더 temp - Tomcat Engine 에서 사용하는 임시 파일 폴더 webapps - 웹 어플리케이션이 배포되는 어플리케이션 관리 폴더 work - JSP 파일이 Servlet 으로 컴파일된 클래스 (*.class) 관리 폴더   폴더들이 상당히 많이 존재하지만 정작 Tomcat 만을 위해서 존재하는 폴더는 "lib" 와 "bin" 폴더 뿐이다. 따라서 웹 어플리케이션의 서비스를 운영하는데 사용되는 폴더들은 나머지 "conf", "logs", "temp", "webapps", "work" 폴더가 된다.    여기서 헷갈리지 않아야 하는 것은 어플리케이션이 하나의 인스턴스이고 인스턴스가 생성되어 실행이 되려면 하나의 JVM 에서 처리가 되어야 한다. 따라서 Multiple Instance 라고 하는 것은 결국 여러 개의 JVM을 운영하겠다는 것이고 여기에 각