간혹 소스 상에서 강제로 다른 설정 파일을 읽어야 할 때가 있을 수 있습니다.
이 경우 아래와 같이 설정파일 위치를 재정의할 수 있습니다.
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
try {
configurator.doConfigure("파일위치");
} catch (JoranException e) {
e.printStackTrace();
}
log4j 는 매우 간단하게 처리할 수 있습니다.
PropertyConfigurator.configure("파일위치");
or
DOMConfigurator.configure("파일위치");
당연하게도(?) PropertyConfigurator 을 이용할 때에도 xml 파일을 지정하면 잘 읽어옵니다. DOMConfigurator의 경우는 안해봐서...
2015년 1월 27일 화요일
2014년 11월 11일 화요일
OpenVPN 윈도우즈 설치기
먼저...OpenVPN 을 설치하게 된 이유부터 밝힙니다.
회사에서 자체적인 인터넷 회선을 사용하지 않고 공동으로 사용하는 회선을 사용하고 있습니다. 그래서 원하는 포트를 마음대로 포트 포워딩 하기 힘듭니다.
그리고 망 관리자가 VPN 도 열어주기 쉽지 않은 상황입니다.
회선의 포트 포워딩도 A 회사는 14001~14009 번까지, B 회사는 14002~14009 까지...이런 식으로 일괄적으로 IP 하나를 정해서 회사에 부여를 해주더군요. 그런데 사용하는 Couchbase 는 포트를 임의로 바꾸면 컨트롤 하기 어렵습니다.
결론은??? 포트를 하나만 이용하는 OpenVPN 이 해결책입니다. 물론 SSH Tunneling 도 괜찮은 방법이지만 사용상의 까다로움은 OpenVPN 쪽이 덜하다고 생각합니다. 물론 구축은???
어쨌든...
회사에서 이미 서버를 Windows...그것도 Windows 7 으로 깔아놓은 상황이라(도대체 전임자는 무슨 생각인건지) 몇 가지 문제점과 그에 따른 해결을 모색하면서 기존에 오해했던 부분들도 바로 잡을 수 있었습니다.
1. 설치
www.openvpn.net 에 접속합니다. Community 에 들어가 Download 메뉴에 들어갑니다. 지금 이 글을 쓰는 시점에선 OpenVPN 2.3.5 -- released on 2014.10.28 버전이 가장최신 버전입니다. 본인의 OS 에 맞는 설치 파일을 다운로드 받습니다.
여기서 잠깐...서버와 클라이언트가 같이 있으므로 접속 대상자에게도 이 파일을 제공해야 합니다.
종래의 *NIX 에는 갖가지 패키지 시스템(ports, pkgsrc, apt-get, yum 등)을 통해 의존성이 있는 프로그램을 설치해주지만, 윈도우즈의 경우 중간에 선택하여 설치할 수 있습니다. 중요한 건 TAP 이라는 네트워크 드라이버를 설치해주는데, 이건 설치를 해야 한다는 것입니다.
설치를 마치면 보통 C:\Program Files\OpenVPN 에 프로그램이 설치됩니다. 하위 디렉토리인 sample-config 디렉토리로 이동하면 sample 이 3 개 존재합니다. 당연히 Server 구축 시에는 server.ovpn 을 이용해야 합니다. 이 파일을 OpenVPN 디렉토리 하위의 config 디렉토리에 복사합니다.
그리고 설정 파일을 텍스트 편집기(저는 Editplus 정식 구매자로, Editplus 을 애용합니다)로 열어서 편집합니다. 주의할 것은 Administrator 로 접속하지 않았다면 텍스트 편집기를 열 때 관리자 권한으로 열어서 설정 파일을 열어야 합니다.
주의깊게 봐야 될 옵션은 다음과 같습니다.
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.255.0"
push "redirect-gateway"
push "dhcp-option DNS 168.126.63.1"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
사실 위 옵션만 있으면 모든게 끝납니다.
port 와 proto, dev 는 각각 OpenVPN 의 포트, 프로토콜, 방식입니다. 포트는 외부에서 접근 가능하게 열려있는 포트, 포로토콜은 말 그대로 프로토콜입니다. 방식의 경우 tun 와 tap 이 있는데, 국내 문서는 대부분 tun 으로 되어 있습니다. tun 은 공유기와 같이 해당 머신에서 다시 NAT 을 이용해서 가상의 IP 대역을 만들어 분배를 하는 방식입니다. 상단에 DHCP 가 존재하고 IP 발급이 자유롭다면 tap 형식으로 바꾼 뒤 bridge 방식으로 설정하면 머신과 동일한 레벨에서 IP 을 받아 사용할 수 있습니다. 하지만, 이 경우 네트워크 연결(제어판\네트워크 및 인터넷\네트워크 연결)에서 기존의 랜카드와 새롭게 생긴 TAP(로컬 영역 연결로 생성되며 TAP-Windows Adapter V9 으로 장치 이름이 나타납니다) 장비와 bridge 을 미리 생성해야합니다. 이 때 원격에서 작업하게 되면 네트워크 연결이 끊겨서 재접속이 안되니 주의를 해야 합니다. tun 은 기존의 랜카드로 들어가 인터넷 연결 공유(속성>공유>인터넷 연결 공유)을 체크하고 홈 네트워킹 연결에서 TAP 장치를 선택해주면 됩니다.
tun 으로 설정할 것이기 때문에 아래의 server 옵션과 push 옵션이 중요합니다.
server 옵션은 새롭게 생성할 가상 IP 의 대역입니다. 공유기를 써보신 분들은 아시겠지만 공유기 내에서는 외부의 IP 하나를 가상의 IP 여러개가 공유해서 쓰는 방식입니다.
그래서 저렇게 새로운 가상 IP 영역이 필요한데, 기본값은 10.8.0.x 를 사용하도록 되어 있습니다. 본인이 평소 쓰는 대역과 다르게 해주는게 좋습니다.
그리고 push 에서 route 부분은 외부의 인터넷의 대역을 적어줘야 합니다. 이 값은 기존의 랜카드의 자세히 보기를 통해 확인할 수 있는데, 제가 있는 곳은 10.0.0.x 형태로 아이피를 발급하고 Subnet Mask 는 255.255.255.0 을 제공해주기 때문에 위와 같이 적었습니다. 이런 mask 기입은 여기서 설명하자면 좀 기니까...명령 프롬프트에서 ipconfig 명령 등으로 확인하고 기입하는 법을 좀 공부하시는 것도 좋겠네요.
나머지 두 개의 push 는 저와 같이 그대로 적어주시는 것도 좋습니다. 저 옵션은 VPN 으로 연결한 뒤에도 VPN 서버를 통해 인터넷을 하기 위해 적어주는 옵션입니다. redirect-gateway 을 통해 VPN 서버를 통해 인터넷을 하겠다는 것과 dhcp-option DNS 을 통해 새로 발급한 가상 IP 에 DNS 정보를 적어주는 것입니다. 168.126.63.1 은 우리나라 대표 DNS(KT 에서 운영)로 자신의 환경에 맞는 DNS 을 적어줄 수 있고, 여러 개를 쓰고 싶을 경우 이어적지 마시고 여러줄 적어주시면 됩니다.
그 외에 OpenVPN 은 개인키/공개키 방식의 보안 접속을 기본으로 하기 때문에 ca, cert, key 을 생성해서 등록해줘야 하고, config 디렉토리에 넣어둘 경우 저렇게 파일 이름만, 다른 위치에 두고자 할 때에는 ca "C:\\ca.crt" 와 같이 쌍따옴표를 이용해 경로를 지정해주고 역슬래쉬(\)는 두 번을 적어줘야 합니다.
keepalive 는 접속 유지 시간, comp-lzo 는 통신 내용 압축, status 는 로그 파일, verb 는 로그 단계(내용)에 관련된 내용입니다. 기본값 유지를 권장합니다.
이렇게 서버를 설정하신 뒤 server.ovpn 파일에서 마우스 우측 버튼으로 Start OpenVPN on this config file 을 실행하시면 서버가 실행됩니다. 명령 프롬프트 창이 뜨니까 거기에 나오는 내용을 잘 보세요. 혹시 에러가 있을 경우 내용을 보고 수정을 해야 합니다.
물론 서비스에도 등록이 되기 때문에 서비스로 가셔서 OpenVPN 을 실행해도 됩니다.
클라이언트의 경우 서버와 비슷합니다. 마찬가지로 sample-config 에서 client.ovpn 을 config 디렉토리로 복사한 디 설정파일을 서버와 내용을 맞춰가면서 설정하면 됩니다.
client
dev tun
proto udp
remote 123.123.123.123 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3
dev와 proto 는 서버와 동일하게 해주시고, remote 에서 OpenVPN 서버를 생성한 서버의 실제 IP 와 포트를 적어줍니다. 그 외에는 모두 그대로 두시고, ca, cert, key 역시 생성된 것을 config 디렉토리에 넣어줍니다. ca 는 서버와 동일한 파일이고 cert, key 는 클라이언트용 파일입니다. 이 역시 생성 방법은 찾아보면 많습니다.
주의하실 점은 처음 생성할 때에는 client 키를 잘 만들었는데, 그 다음부턴 오류가 난다(C:\*.old을 찾을 수 없습니다)는 분들이 계신데, easy-rsa 에서 init-config 와 vars 을 다시 실행한 뒤 생성하시면 됩니다.
그리고 클라이언트에서는 openvpn-gui.exe 파일로 트레이에 아이콘을 띄워놓고 쓰는게 편한데, 관리자 권한으로 실행되야 합니다. 그러므로 해당 파일을 항상 관리자 권한으로 띄우도록 설정한 뒤 사용하는게 편합니다.
이상 끝!!!
이 문서는 처음 OpenVPN 을 설치하는 분이 아닌, 기존 문서를 보고 좀 막힌다 싶은 분들을 위한 문서입니다. 처음 구축을 하시는 분들은 구글에서 "openvpn 윈도 설치" 로 먼저 검색(http://goo.gl/OqFdM5) 한 번 해보시고 문서들 보면서 좀 익히신 뒤 따라해보세요.
회사에서 자체적인 인터넷 회선을 사용하지 않고 공동으로 사용하는 회선을 사용하고 있습니다. 그래서 원하는 포트를 마음대로 포트 포워딩 하기 힘듭니다.
그리고 망 관리자가 VPN 도 열어주기 쉽지 않은 상황입니다.
회선의 포트 포워딩도 A 회사는 14001~14009 번까지, B 회사는 14002~14009 까지...이런 식으로 일괄적으로 IP 하나를 정해서 회사에 부여를 해주더군요. 그런데 사용하는 Couchbase 는 포트를 임의로 바꾸면 컨트롤 하기 어렵습니다.
결론은??? 포트를 하나만 이용하는 OpenVPN 이 해결책입니다. 물론 SSH Tunneling 도 괜찮은 방법이지만 사용상의 까다로움은 OpenVPN 쪽이 덜하다고 생각합니다. 물론 구축은???
어쨌든...
회사에서 이미 서버를 Windows...그것도 Windows 7 으로 깔아놓은 상황이라(도대체 전임자는 무슨 생각인건지) 몇 가지 문제점과 그에 따른 해결을 모색하면서 기존에 오해했던 부분들도 바로 잡을 수 있었습니다.
1. 설치
www.openvpn.net 에 접속합니다. Community 에 들어가 Download 메뉴에 들어갑니다. 지금 이 글을 쓰는 시점에선 OpenVPN 2.3.5 -- released on 2014.10.28 버전이 가장최신 버전입니다. 본인의 OS 에 맞는 설치 파일을 다운로드 받습니다.
여기서 잠깐...서버와 클라이언트가 같이 있으므로 접속 대상자에게도 이 파일을 제공해야 합니다.
종래의 *NIX 에는 갖가지 패키지 시스템(ports, pkgsrc, apt-get, yum 등)을 통해 의존성이 있는 프로그램을 설치해주지만, 윈도우즈의 경우 중간에 선택하여 설치할 수 있습니다. 중요한 건 TAP 이라는 네트워크 드라이버를 설치해주는데, 이건 설치를 해야 한다는 것입니다.
설치를 마치면 보통 C:\Program Files\OpenVPN 에 프로그램이 설치됩니다. 하위 디렉토리인 sample-config 디렉토리로 이동하면 sample 이 3 개 존재합니다. 당연히 Server 구축 시에는 server.ovpn 을 이용해야 합니다. 이 파일을 OpenVPN 디렉토리 하위의 config 디렉토리에 복사합니다.
그리고 설정 파일을 텍스트 편집기(저는 Editplus 정식 구매자로, Editplus 을 애용합니다)로 열어서 편집합니다. 주의할 것은 Administrator 로 접속하지 않았다면 텍스트 편집기를 열 때 관리자 권한으로 열어서 설정 파일을 열어야 합니다.
주의깊게 봐야 될 옵션은 다음과 같습니다.
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.255.0"
push "redirect-gateway"
push "dhcp-option DNS 168.126.63.1"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
사실 위 옵션만 있으면 모든게 끝납니다.
port 와 proto, dev 는 각각 OpenVPN 의 포트, 프로토콜, 방식입니다. 포트는 외부에서 접근 가능하게 열려있는 포트, 포로토콜은 말 그대로 프로토콜입니다. 방식의 경우 tun 와 tap 이 있는데, 국내 문서는 대부분 tun 으로 되어 있습니다. tun 은 공유기와 같이 해당 머신에서 다시 NAT 을 이용해서 가상의 IP 대역을 만들어 분배를 하는 방식입니다. 상단에 DHCP 가 존재하고 IP 발급이 자유롭다면 tap 형식으로 바꾼 뒤 bridge 방식으로 설정하면 머신과 동일한 레벨에서 IP 을 받아 사용할 수 있습니다. 하지만, 이 경우 네트워크 연결(제어판\네트워크 및 인터넷\네트워크 연결)에서 기존의 랜카드와 새롭게 생긴 TAP(로컬 영역 연결로 생성되며 TAP-Windows Adapter V9 으로 장치 이름이 나타납니다) 장비와 bridge 을 미리 생성해야합니다. 이 때 원격에서 작업하게 되면 네트워크 연결이 끊겨서 재접속이 안되니 주의를 해야 합니다. tun 은 기존의 랜카드로 들어가 인터넷 연결 공유(속성>공유>인터넷 연결 공유)을 체크하고 홈 네트워킹 연결에서 TAP 장치를 선택해주면 됩니다.
tun 으로 설정할 것이기 때문에 아래의 server 옵션과 push 옵션이 중요합니다.
server 옵션은 새롭게 생성할 가상 IP 의 대역입니다. 공유기를 써보신 분들은 아시겠지만 공유기 내에서는 외부의 IP 하나를 가상의 IP 여러개가 공유해서 쓰는 방식입니다.
그래서 저렇게 새로운 가상 IP 영역이 필요한데, 기본값은 10.8.0.x 를 사용하도록 되어 있습니다. 본인이 평소 쓰는 대역과 다르게 해주는게 좋습니다.
그리고 push 에서 route 부분은 외부의 인터넷의 대역을 적어줘야 합니다. 이 값은 기존의 랜카드의 자세히 보기를 통해 확인할 수 있는데, 제가 있는 곳은 10.0.0.x 형태로 아이피를 발급하고 Subnet Mask 는 255.255.255.0 을 제공해주기 때문에 위와 같이 적었습니다. 이런 mask 기입은 여기서 설명하자면 좀 기니까...명령 프롬프트에서 ipconfig 명령 등으로 확인하고 기입하는 법을 좀 공부하시는 것도 좋겠네요.
나머지 두 개의 push 는 저와 같이 그대로 적어주시는 것도 좋습니다. 저 옵션은 VPN 으로 연결한 뒤에도 VPN 서버를 통해 인터넷을 하기 위해 적어주는 옵션입니다. redirect-gateway 을 통해 VPN 서버를 통해 인터넷을 하겠다는 것과 dhcp-option DNS 을 통해 새로 발급한 가상 IP 에 DNS 정보를 적어주는 것입니다. 168.126.63.1 은 우리나라 대표 DNS(KT 에서 운영)로 자신의 환경에 맞는 DNS 을 적어줄 수 있고, 여러 개를 쓰고 싶을 경우 이어적지 마시고 여러줄 적어주시면 됩니다.
그 외에 OpenVPN 은 개인키/공개키 방식의 보안 접속을 기본으로 하기 때문에 ca, cert, key 을 생성해서 등록해줘야 하고, config 디렉토리에 넣어둘 경우 저렇게 파일 이름만, 다른 위치에 두고자 할 때에는 ca "C:\\ca.crt" 와 같이 쌍따옴표를 이용해 경로를 지정해주고 역슬래쉬(\)는 두 번을 적어줘야 합니다.
keepalive 는 접속 유지 시간, comp-lzo 는 통신 내용 압축, status 는 로그 파일, verb 는 로그 단계(내용)에 관련된 내용입니다. 기본값 유지를 권장합니다.
이렇게 서버를 설정하신 뒤 server.ovpn 파일에서 마우스 우측 버튼으로 Start OpenVPN on this config file 을 실행하시면 서버가 실행됩니다. 명령 프롬프트 창이 뜨니까 거기에 나오는 내용을 잘 보세요. 혹시 에러가 있을 경우 내용을 보고 수정을 해야 합니다.
물론 서비스에도 등록이 되기 때문에 서비스로 가셔서 OpenVPN 을 실행해도 됩니다.
클라이언트의 경우 서버와 비슷합니다. 마찬가지로 sample-config 에서 client.ovpn 을 config 디렉토리로 복사한 디 설정파일을 서버와 내용을 맞춰가면서 설정하면 됩니다.
client
dev tun
proto udp
remote 123.123.123.123 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3
dev와 proto 는 서버와 동일하게 해주시고, remote 에서 OpenVPN 서버를 생성한 서버의 실제 IP 와 포트를 적어줍니다. 그 외에는 모두 그대로 두시고, ca, cert, key 역시 생성된 것을 config 디렉토리에 넣어줍니다. ca 는 서버와 동일한 파일이고 cert, key 는 클라이언트용 파일입니다. 이 역시 생성 방법은 찾아보면 많습니다.
주의하실 점은 처음 생성할 때에는 client 키를 잘 만들었는데, 그 다음부턴 오류가 난다(C:\*.old을 찾을 수 없습니다)는 분들이 계신데, easy-rsa 에서 init-config 와 vars 을 다시 실행한 뒤 생성하시면 됩니다.
그리고 클라이언트에서는 openvpn-gui.exe 파일로 트레이에 아이콘을 띄워놓고 쓰는게 편한데, 관리자 권한으로 실행되야 합니다. 그러므로 해당 파일을 항상 관리자 권한으로 띄우도록 설정한 뒤 사용하는게 편합니다.
이상 끝!!!
이 문서는 처음 OpenVPN 을 설치하는 분이 아닌, 기존 문서를 보고 좀 막힌다 싶은 분들을 위한 문서입니다. 처음 구축을 하시는 분들은 구글에서 "openvpn 윈도 설치" 로 먼저 검색(http://goo.gl/OqFdM5) 한 번 해보시고 문서들 보면서 좀 익히신 뒤 따라해보세요.
2014년 8월 17일 일요일
Couchbase 사용기 - 2
Couchbase 는 기본적으로 key/value 타입의 NoSQL 제품입니다. 다시 말해 Unique 한 Key 을 이용해서 문서(Document)을 빠르게 가져오는 것을 목적으로 한 제품이라는 것이죠. 그렇다면 사용자가 읽어오길 원하는 문서의 Key 을 알고 있다면 언제든지 문서를 가져올 수 있습니다. 실제로 Couchbase SDK 에서는 set() 와 get() 을 통해서 문서를 저장하고 가져올 수 있으며 매우 단순한 형태이기 때문에 초급 개발자도 금새 배울 수 있습니다.
하지만, 현실상 특정 key 의 문서만 가져오는 경우는 매우 드뭅니다. 가까운 예로 게시판의 경우만 해도 특정 조건을 만족하는 데이터(=문서)의 집합을 가져와서 화면에 출력하는 형태가 되죠. Couchbase 는 이러한 것을 map/reduce 기반의 View 을 통해 처리할 수 있도록 하고 있습니다. map/reduce 는 Couchbase 의 독자적인 기술은 아닙니다만, 솔루션마다 처리 방식을 조금씩 다르게 하기 때문에 여기서 Couchbase 의 View 을 통해 Couchbase 만의 특징을 살펴보고자 합니다.
Couchbase 의 웹콘솔에 접속하면 Views 항목을 볼 수 있습니다. 여기서 View 을 생성할 수 있습니다. 이 때 "Design Document Name" 이라는 항목과 "View Name" 을 입력하게 되어 있는데, 쉽게 말해 Design Document Name 은 뷰의 그룹명, View Name 은 View 의 이름입니다. 생성을 하게 되면 "VIEW CODE" 부분에 "Map" 와 "Reduce" 을 입력할 수 있습니다. 모두 Javascript 문법을 이용한 하나의 function 이며, 매개변수는 doc 와 meta 을, View 에서 생성되는 인덱스에 들어가는 정보는 emit() 으로 입력할 수 있습니다.
자세한 사용법을 설명하는 것은 아니므로 구현 부분에 대해서는 다른 기회가 되면 글을 적어보겠습니다. 여기서 설명할 내용은 View 에 대한 특성입니다.
먼저, View 은 처음 생성할 때를 제외하고는 문서를 추가하거나 갱신, 삭제 등의 작업을 할 때 처리된 후 저장됩니다. 처음 생성할 때에는 모든 문서를 읽어서 View 의 인덱스를 구축합니다. 이 구축 작업은 비동기로 이루어지기 때문에 생성 버튼을 눌러도 바로 적용되지 않고 수초~수십초의 시간이 흐른 뒤에야 제대로 View 의 결과가 나타납니다. 그리고 문서가 추가되는 등의 작업이 발생하면 메모리에 저장을 하면서 map/reduce 코드를 통해 인덱스 정보가 생성된 뒤에 2.5.1 까지는 디스크에, 3.0 부터는 메모리에 인덱스 정보가 저장되기 때문에 저장 완료 후 즉시 조회를 하면 바로 적용이 되질 않아서 추가/갱신/삭제된 문서 정보가 제대로 반영이 안되어 있습니다. 2.5.1 이하 버젼에서는 3초 정도 걸리는 경우가 비일비재합니다. 3.0 부터는 메모리에 저장되기 때문에 1초 이하가 될꺼라고 합니다만 완벽히 동기화 된다고 볼 수 없습니다.
그리고 View 는 조건에 대한 처리가 아니라 문서에 대한 처리이기 때문에 사용자가 조회시 보내는 매개변수에 따라 그때그때 조회하는 것이 아니라 인덱스된 문서의 key의 범위 사이의 값을 돌려보내주는 것입니다. 그래서 배열 형태로 2개 이상의 매개변수를 보낼 경우 일반적인 RDBMS 의 검색과는 판이한 검색결과가 나옵니다. 게다가 숫자형의 값일 경우 일반적인 조회에서는 숫자형태로 저장되어 있지만, View 을 생성하면 숫자형이 문자형으로 바뀌기 때문에 인덱스 생성시 1,2,3,...,10,11,12,...,20,21,22,... 와 같은 형태가 아닌 1,10,100,...,11,... 와 같이 정렬이 됩니다. 복합적인 매개변수의 경우도 아래와 같이 됩니다.
위와 같이 인덱스가 생성되면(입력 순서에 상관없이 세 값의 순서대로 정렬되어서 인덱스가 생성됩니다) 아래와 같은 형태로 범위검색을 할 수 있습니다.
startKey : [1,"dreamwiz", "korea"]
endKey : [3,"facebook", "usa"]
처음에는 RDBMS 의 or 조건처럼 검색이 되나 싶었습니다만(엔투엠에서도 그런 식으로 이해하시면 될 것 같다고 했습니다만...) 사실 그렇지 않더군요. 어찌보면 더 간단한 것인데요...
추가로 startKey 와 endKey 을 입력한다고 하면 어떤 위치에 값이 들어가게 될까요? 각각 1 번 다음과 3번 다음에 위치하게 될 것입니다. 그러므로 위의 범위 검색 결과는 2 번과 3 번이 되게 됩니다. 이런 식으로 범위 검색을 통해서 이미 입력된 인덱스의 값을 가져오기 때문에 RDBMS 의 like 검색과 같은 것은 이용할 수도 없고, 숫자를 이용한 범위 검색도 불가능합니다. 그래서 항상 View 을 생성하고 난 뒤 원하는 결과가 나오는지 꼼꼼히 확인하는 것이 중요합니다.
좀 더 다양한 검색 결과를 원하신다면 검색엔진과의 연동이 필요합니다. Couchbase 에서는 Elasticsearch 와 연동하는 방법을 제공하고 있습니다. 이 방법을 통해 View 의 map/reduce 방식이 가지는 한계를 어느 정도 극복할 수 있습니다.
또다른 사용기는 다음 글에...
하지만, 현실상 특정 key 의 문서만 가져오는 경우는 매우 드뭅니다. 가까운 예로 게시판의 경우만 해도 특정 조건을 만족하는 데이터(=문서)의 집합을 가져와서 화면에 출력하는 형태가 되죠. Couchbase 는 이러한 것을 map/reduce 기반의 View 을 통해 처리할 수 있도록 하고 있습니다. map/reduce 는 Couchbase 의 독자적인 기술은 아닙니다만, 솔루션마다 처리 방식을 조금씩 다르게 하기 때문에 여기서 Couchbase 의 View 을 통해 Couchbase 만의 특징을 살펴보고자 합니다.
Couchbase 의 웹콘솔에 접속하면 Views 항목을 볼 수 있습니다. 여기서 View 을 생성할 수 있습니다. 이 때 "Design Document Name" 이라는 항목과 "View Name" 을 입력하게 되어 있는데, 쉽게 말해 Design Document Name 은 뷰의 그룹명, View Name 은 View 의 이름입니다. 생성을 하게 되면 "VIEW CODE" 부분에 "Map" 와 "Reduce" 을 입력할 수 있습니다. 모두 Javascript 문법을 이용한 하나의 function 이며, 매개변수는 doc 와 meta 을, View 에서 생성되는 인덱스에 들어가는 정보는 emit() 으로 입력할 수 있습니다.
자세한 사용법을 설명하는 것은 아니므로 구현 부분에 대해서는 다른 기회가 되면 글을 적어보겠습니다. 여기서 설명할 내용은 View 에 대한 특성입니다.
먼저, View 은 처음 생성할 때를 제외하고는 문서를 추가하거나 갱신, 삭제 등의 작업을 할 때 처리된 후 저장됩니다. 처음 생성할 때에는 모든 문서를 읽어서 View 의 인덱스를 구축합니다. 이 구축 작업은 비동기로 이루어지기 때문에 생성 버튼을 눌러도 바로 적용되지 않고 수초~수십초의 시간이 흐른 뒤에야 제대로 View 의 결과가 나타납니다. 그리고 문서가 추가되는 등의 작업이 발생하면 메모리에 저장을 하면서 map/reduce 코드를 통해 인덱스 정보가 생성된 뒤에 2.5.1 까지는 디스크에, 3.0 부터는 메모리에 인덱스 정보가 저장되기 때문에 저장 완료 후 즉시 조회를 하면 바로 적용이 되질 않아서 추가/갱신/삭제된 문서 정보가 제대로 반영이 안되어 있습니다. 2.5.1 이하 버젼에서는 3초 정도 걸리는 경우가 비일비재합니다. 3.0 부터는 메모리에 저장되기 때문에 1초 이하가 될꺼라고 합니다만 완벽히 동기화 된다고 볼 수 없습니다.
그리고 View 는 조건에 대한 처리가 아니라 문서에 대한 처리이기 때문에 사용자가 조회시 보내는 매개변수에 따라 그때그때 조회하는 것이 아니라 인덱스된 문서의 key의 범위 사이의 값을 돌려보내주는 것입니다. 그래서 배열 형태로 2개 이상의 매개변수를 보낼 경우 일반적인 RDBMS 의 검색과는 판이한 검색결과가 나옵니다. 게다가 숫자형의 값일 경우 일반적인 조회에서는 숫자형태로 저장되어 있지만, View 을 생성하면 숫자형이 문자형으로 바뀌기 때문에 인덱스 생성시 1,2,3,...,10,11,12,...,20,21,22,... 와 같은 형태가 아닌 1,10,100,...,11,... 와 같이 정렬이 됩니다. 복합적인 매개변수의 경우도 아래와 같이 됩니다.
- [1,"daum","korea"]
- [1,"naver","korea"]
- [3,"bing","usa"]
- [3,"google","usa"]
위와 같이 인덱스가 생성되면(입력 순서에 상관없이 세 값의 순서대로 정렬되어서 인덱스가 생성됩니다) 아래와 같은 형태로 범위검색을 할 수 있습니다.
startKey : [1,"dreamwiz", "korea"]
endKey : [3,"facebook", "usa"]
처음에는 RDBMS 의 or 조건처럼 검색이 되나 싶었습니다만(엔투엠에서도 그런 식으로 이해하시면 될 것 같다고 했습니다만...) 사실 그렇지 않더군요. 어찌보면 더 간단한 것인데요...
추가로 startKey 와 endKey 을 입력한다고 하면 어떤 위치에 값이 들어가게 될까요? 각각 1 번 다음과 3번 다음에 위치하게 될 것입니다. 그러므로 위의 범위 검색 결과는 2 번과 3 번이 되게 됩니다. 이런 식으로 범위 검색을 통해서 이미 입력된 인덱스의 값을 가져오기 때문에 RDBMS 의 like 검색과 같은 것은 이용할 수도 없고, 숫자를 이용한 범위 검색도 불가능합니다. 그래서 항상 View 을 생성하고 난 뒤 원하는 결과가 나오는지 꼼꼼히 확인하는 것이 중요합니다.
좀 더 다양한 검색 결과를 원하신다면 검색엔진과의 연동이 필요합니다. Couchbase 에서는 Elasticsearch 와 연동하는 방법을 제공하고 있습니다. 이 방법을 통해 View 의 map/reduce 방식이 가지는 한계를 어느 정도 극복할 수 있습니다.
또다른 사용기는 다음 글에...
피드 구독하기:
글 (Atom)