자바 애너테이션 기반의 HTTP 클라이언트 라이브러리.


안드로이드 관련 프로젝트를 진행하면서 안드로이드 애플리케이션이나 SDK에서 안드로이드 SDK를 제외하고 가장 많이 공통적으로 쓰였던 부분은 HTTP Client가 아니었나 싶다.

HTTP 통신은 비교적 손이 많이 가는 편이고, 핵심 코드에 비해 주변코드가 많이 작성된다. DB를 프로그래밍 할 때와 비슷하게 주변코드는 공통적으로 처리되는 부분이 많고, 핵심 코드에 집중해서 HTTP 클라이언트를 작성하고 싶다는 생각을 항상 하고 있어서, 이를 애너테이션 기반으로 만들어보면 어떨까 하는 생각에 구상하게 되었다.


프로젝트 네이밍은 자바의 애너테이션 기호인 @을 우리말로 읽을 때 '골뱅이'라고 많이 읽는 것에서 '골뱅'으로 하고, 영어로 쓰면 'gol bang'이므로, 의미는 없지만 '#!' 을 해쉬뱅(Hash bang)으로 읽으니 'Gol!' 으로 축약하였다. (하이고 의미없다, 그치만 개인적으로는 마음에 든다 하하;)


Gol!의 목표는 HTTP 통신을 간편하게 핵심코드만으로 처리할 수 있도록 하는 것이다. 즉 핵심 로직에만 집중할 수 있도록 하여 생산성을 향상시키는데 있다. 고려해야하는 것들은 HTTP 프로토콜, 비동기 요청의 처리 및 비동기 요청 시의 콜백 처리 등이다.

Gol!의 기본적인 개념은 메서드와 HTTP 요청을 1:1로 매핑하는 것이고, 메서드 호출이 곧 HTTP 요청이며, 메서드 파라미터는 쿼리스트링이나 HTTP 메시지 본문이 되며, 리턴 타입이 응답 메시지이다. (비동기의 경우에는 리턴에 대한 처리를 콜백에서 하도록 해야한다.) 이 외에 요청에 관한 데이터(헤더, 요청 URL, 메서드 등)은 애너테이션을 통해 메타 데이터로 제공한다. 애너테이션의 경우 리터럴 상수만 인자로 받을 수 있으므로, 동적으로 요청에 대한 정보를 변경할 수 없다. 따라서 메서드 파라미터 애너테이션을 통해 요청에 대한 정보를 동적으로 제공할 수 있도록 설계하여야 한다.

개별 요청에 대한 정보는 메서드 및 메서드 애너테이션으로 제공하고, 서버에 대한 공통적인 설정은 인터페이스에서 할 수 있도록한다.


기본적으로는 위와 같은 모습으로 메서드가 작성이 되고, 자바의 동적 프록시를 통해 HTTP 요청을 공통으로 처리할 것이므로, 위 요청 메서드는 인터페이스 내에 작성하도록 한다. 따라서 Gol! 사용시에는 요청에 대한 데이터만 인터페이스로 제공하고, 요청에 대한 세부적인 로우레벨의 코드 구현은 최대한 배제할 수 있도록 한다.


예상되는 가장 큰 이슈는 메모리와 속도 이슈가 아닐까싶다. 애너테이션은 리플렉션을 통해 실제 값을 얻을 수 있으므로 여기에서 한번 속도 및 메모리 이슈가 발생하고, 사용자의 구현을 단순하게 하게 위해서 동적 프록시를 적용하게 되므로 또 한번 속도 및 메모리 이슈가 발생한다. 또한 사용자 구현은 단순화되지만, 라이브러리 자체의 복잡도가 높아져서 설계를 잘해야할 듯 하다.. ㅜㅜ


조금씩이라도 부지런하게 작성하고, 개선해봐야겠다. :)

AWS 상에 설치한 OpenShift의 브로커를 이중화하고, 잘 돌아가는 것을 확인하고, 대표님께서 보고 싶다고 하셔서 보여드리려고 했더니. 그때부터였다.

멀쩡히 돌아가고 MCollective Ping도 확인했을 때 잘 돌아가던 그놈이 배신을 했다.

OpenStack에 설치했던 Broker의 설정을 변경해서 AWS의 Node에도 연결을 해보고,

새로 Broker를 몇번이나 다시 설치해서 해보고, 설정값도 이리저리 바꾸어보고, 의심가는 것들을 모두 해보고 확인해봤지만 계속 안된다.


3일 째..

여전히 AWS의 문제는 해결이 되지 않아서 새로 클러스터를 구성하려다가 귀찮았던 바람에 Broker와 Node만 새로 설치하고, ActiveMQ와 MongoDB는 이전의 것을 그대로 두고 사용했다. 여전히 안된다. MongoDB 쪽에는 전혀 문제가 없다.

역시 Broker-ActiveMQ-Node 간의 통신 문제인데, 잘 되던 게 갑자기 안되니 도무지 이유를 모르겠고, 웬만한 트러블 슈팅을 다 할 수 있다고 자만하던 내게 벌을 내린게 아닌가 싶을 정도다.


그러다가 다시 오픈시프트 관련 메일링 리스트를 뒤져보다가

같은 문제의 제목을 찾았고, 전에 MCollective와 관련해서 한번 읽었던 글이지만 혹시나 하는 지푸라기라도 잡는 심정에 다시 천천히 읽어봤다.

그러다가 이 스레드에서 Brenton찡이 clock skew가 아니냐고 물어보길래 응? 설마 이것 때문에 그러려고.. 하다가 혹시나 싶어서 VM들의 시간을 확인해보니, Broker와 Node는 일치하지만 ActiveMQ는 2분 정도의 차이가 났다.

ActiveMQ가 설치된 서버에 ntpd를 설치하고 clock.redhat.com과 시간 동기화를 한 후 접속해보니 되는게 아닌가..!?


아.. 인생 무상.. 사람이 이렇게 미칠 수도 있겠구나 싶었다. 아니.. 안될거면 처음부터 안될 것이지 되다가 아니되냔 말이다. 하하.

이 문제 때문에 사흘을 버리긴 했지만.. 다시 돌아가니 다행이다. ㅠㅠ

'마음이 뛰다' 카테고리의 다른 글

연락처  (0) 2015.01.23
나름 다듬어 가기  (2) 2015.01.08
OpenShift Node 설정 중...  (0) 2014.09.18
새로운 영역의 공부  (0) 2014.07.25
Do you want to stay here?  (0) 2013.11.22

윈도우 노트북 한대, 이번에 장만한 맥북 프로레티나, 센터에서 대여한 iMac까지 세대가 한 책상에 있다보니

거의 iMac은 안쓰다시피하고, 키보드와 마우스를 번갈아가며 사용하려니 너무 번거롭다.


스위치를 알아보려고 하다가 소프트웨어적으로 키보드와 마우스를 공유할 수 있을까 해서 찾아보다가

Synergy를 알게 되었다.


가운데의 맥북프로를 서버로 사용하고, 왼쪽의 iMac과 오른쪽의 윈도우 노트북을 클라이언트로 설정했다.


처음에는 클라이언트에서 서버로 접속이 되지않아서 당황하다가 서버 설정에 보면 클라이언트를 배치 후에 Screen Name을 지정해줘야 하는데, 클라이언트의 PC이름과 동일하게 지정해줘야 한다.

이는 여러가지 방법으로도 알 수 있지만 Synergy를 처음 실행하게 되면 서버인지, 클라이언트인지 설명하는 창에서 

클라이언트로 선택 시에 해당 컴퓨터의 Screen Name이 무엇인지 확인할 수 있다.


윈도우의 경우 [내 컴퓨터]의 속성창을 띄우면 "컴퓨터 이름"에 해당하는 것이 Screen Name이다.

맥의 경우는 [시스템 환경설정]에서 [공유] 창을 띄우면 상단에 컴퓨터 이름이라고 나타나는데,

그 아래에 써진 텍스트를 보면 '로컬 네트워크에 있는 컴퓨터가 다음에 있는 사용자의 컴퓨터에 연결할 수 있음:' 이라고 써져있고 그 아래에 네트워크에서 사용하는 컴퓨터 이름이 있는데 이를 사용하면 된다.



서버로 사용하는 컴퓨터는 네트워크로 접속가능한 위치에 있어야 한다.

클라이언트에서 서버로 접속 시 IP를 이용하게 되는데, 서버 컴퓨터와 클라이언트 컴퓨터와 같은 공유기를 사용하고 있다면 문제 없겠지만 클라이언트와 서버가 서로 다른 공유기나 혹은 서버만 공유기를 사용하고 있다면

해당 공유기에서 포트포워딩을 통해 사설 IP로 포워딩을 시켜줘야 한다.


공유기 설정과 관련해서 권한밖의 문제라면 방법이 없어보인다. 사실 같은 자리에서 여러대의 컴퓨터를 사용하게 되므로 그런 문제는 발생하기도 어려울 듯하다.



여기까지 설정하고 서버와 클라이언트에서 Synergy를 실행하고 나면 그야말로 감탄이다.

더군다나 무료라는 점에서 매우 큰 매리트도 있다. 기능을 사용해보고 감탄했다면 Synergy에 기부하는 것도 좋은 방법일 듯하다.



그러나 문제는 서버가 맥이고, 클라이언트가 윈도우인 경우 한/영 전환에 문제가 있다.


구글링을 통해 검색해본 결과로는 한영 패치를 적용하는 것이었는데, 일단 이 방법으로는 해결이 안되었거니와

덮어쓰려고 할 때 Synergyc라는 서비스 프로세스가 돌고 있어서 프로세스 강제종료도 까다롭다는 것이다.

일단 패치는 자신의 synergy와 버전이 맞는 것을 구해야하는데, 아마 배포되기 전에는 소스코드로 있는 듯하다. 그냥 구글 검색 창에 "synergy 자신의 버전 한영 패치"라고만 검색해도 다른 분들이 수고해서 컴파일 해준 것들이 있어 쉽게 구할 수 있다.


이건 설치하는 시점에서 해야하고, 설치 완료 후 close를 누르지 않은 상태에서 해야 IPC 오류가 발생하지 않는다.

(윈도우 7이라면) 시작 메뉴 호출 후 "서비스"를 타이핑하면 제어판 -> 관리도구 -> 서비스로 들어갈 수 있는 서비스를 바로 열 수 있다. 여기서 synergy를 찾아 중지 시킨 후 한/영 패치를 덮어씌워야 한다.


패치를 덮어씌웠다면 설치에서 close를 눌러 설치를 완료하고 설정창에서 클라이언트 환경 설정을 해 준 후

start를 누르면 서버로 접속하게 된다.


어쨌거나 위에서도 언급했듯 내 경우는 한영패치로는 한영전환이 되지 않았다는 것.

키보드가 alt키와 한/영 키가 한 키에 있어서 그런지, 서버가 맥이라서 그런지 이유는 잘 모르겠다.


맥이 서버이고 윈도우가 클라이언트일 때의 환경을 중심으로 검색하다보니


?http://allpeopleparty.blogspot.kr/2009/10/synergy-macserver-client-km.html? 에 autohotkey? 를 이용해서 한영 전환문제를 해결하는 글이 포스트되어있어 이를 참고해서 설정했더 아주 깔끔하게 해결이 되었다.


autohotkey를 이용한 방법을 간단하게 요약하면 

autohotkey 설치 후 완료되고 프로그램을 실행하면 메모장이 뜨면서 autohotkey의 스크립트(혹은 설정?)이 나타나는데

거기서 #z::Run www.autohotkey.com 이라고 된 부분을 #space::Send, {vk15sc138}로 수정해준 후 저장하고,

autohotkey GUI화면에서 메뉴를 찾아보면 reload script를 한번 실행하면 바로 적용이 되어 맥에서 사용하던 command+space로 한영전환을 할 수 있다.



 나름 어렵사리 설정한 Synergy 덕분에 책상이 아주 깔끔해졌다.

무료로 이런 기능을, 그것도 완성도 있게 사용할 수 있는 것만 해도 감지덕지해야겠지만 하나 아쉬운점이라면

매직 마우스를 이용해서 맥에서 스크롤을 하게 되면 맥 특유의 미끄러지듯 스크롤 되는 기능이 클라이언트가 맥임에도 불구하고 일반 휠 마우스에서 휠 하는 듯이 동작한다는 것. 불편하진 않으므로 넘겨버리면 될 문제라 상관없다.


이제 잠자고 있던 iMac을 좀 제대로 활용해야겠다.


+ Recent posts