2009년 12월 22일 화요일

Transaction 서비스

Java Transaction 관리 방법을 설명한 좋은 문서를 찾았다.

자바코드에서 DB 트랜젝션을 관리하는 방법은 위와 같이 두가지가 있다.

선언적 트렌젝션 관리 방법과 프로그래밍적 트렌젝션 관리 방법.

프로그래밍적 트렌젝션 관리 방법은
소스코드에 직접 트렌젝션을 얻어서, 트렌젝션 코드 수행 후, 트렌젝션을 종료하는 코드를
코드레벨에서 직접 써주면 된다.
이런 방법은 오래 전부터 사용되던 방법이다.

선언적 트렌젝션 관리 방법은 최근에 알게 된 방법이며,
XML이나 Annotation 으로 어떤 단위를 트렌젝션 처리 하라고, 선언만 해 놓으면,
알아서 트렌젝션이 처리가 되는 방법니다.
스프링 프레임웍이 있어서 가능한 방법인 것 같다.

이번 내가 맏은 프로젝트에서는
진보된 방법으로 볼 수 있는 선언적 트렌젝션 관리 방법를 사용해 보려고 한다.

자세한 기술적인 내용은 위 링크를 가면 알 수 있으니 참고하세요.






2009년 12월 21일 월요일

주말을 이용한 java struts2를 이용한 웹 개발 후기

최근에는 혼자 웹 개발을 할때는 Ruby on Rails를 주로 이용하는데,
이번에는 Java Struts2를 이용하여 개발하고 있다.

이유는 유지보수 부분을 다른 분에게 양도해야 하기 때문에,
듣보잡인 RoR로 개발해서 넘겨줄 수 없기 때문이다.

방법을 활용해서 개발했다.

iBator 에서 DB Access소스 제너레이션을 하고, 내가 만든 scaffold generator를 이용하여,
기반코드를 작성하니 좋았다.
이제는 이런 소스 제너레이터 없이 개발하는 것은 상상하기도 싫다.

CRUD 를 위한 RESTful plugin, Convention plugin등을 사용하여 RoR 환경에 비슷한 방향으로
개발 할 수 있도록 노력했다.

plugin에 버그가 조금 있는 것 같은데, (아니면 문서화가 부족해서 내가 잘 모르는 부분이 있거나..)
우회하는 방법으로 피해서 사용하고 있다.

그래도 Ruby on Rails보다는 개발하기 번거로운 부분이 많다.
RoR 생각을 간절히 하면서..
Java 노가다 코드를 삽입하며, 천천히 코드를 개발중이다.

그래도 나중에 Java환경에서 개발을 할 일이 있을 때,
많은 도움이 될 개발이 될 듯 하다.

만약에, 회사에서 처럼 이런 라이브러리 쓰지 말고 개발하라고 요구 했다면??

못한다..-_-

2009년 12월 13일 일요일

windows mysql Ruby gem 설치 에러

windows 에 mysql ruby gem 을 설치하면 에러가 발생한다.

이것을 해결하기 위해, mysql 에 있는 libmysql.dll 파일을 ruby설치경로\bin 디렉토리에 복사한 후,

$ gem install mysql --version 2.7.3

명령어로 설치하면 RDoc은 에러가 나긴 하지만, 정상적으로 사용할 수 있다.

현재 2.8 버전에서는 테스트를 다 안해봐서, 잘 모르겠다.
현재로서는 그냥 2.7.3 버전을 사용하려고 한다.


2009년 12월 11일 금요일

개발자의 성향과 회사

나는 비교적 큰 회사에 다니고 있다.
규모로 따지자면 한국 IT업계에서는 한국에서는 손에 꼽을 만큼 규모가 있는 회사이다.
그런데, 나는 가끔은 이 큰 조직에서 회사를 위해서 내가 할 수 있는 일이 무엇인지 가끔은 고민해 본다.
회사에서 월급을 받으니, 그에 따른 회사에 기여를 해야 한다는 것이 나의 생각이다.

그런데, 내가 회사에서 하고 있는 일이나 업무 역량을 보면..
뛰어나지 않은 그냥 그런 보통의 개발자로 보인다. (어쩌면 조금 뒤쳐질지도..)
시키는 일을 그때그때 잘 하는 편 같다. 시키면 한다.

그런데, 좀 더 능동적인 행동은 되지 않는 듯 하다.
아니, 능동적으로 행동해서 변화 될 수 있는게 별로 없다.

요즘 드는 생각은, (능동적으로 해보려고.)
회사에서 내가 하는 일이 데이터 관리 시스템을 만드는 것이기 때문에,
Java EE 개발환경 보다는 Ruby on Rails가 적합해 보인다. 생산성이 좋고, 데이터 무결성 유지에 좋아보인다. 데이터 정규화도 더 잘 될 듯 하고..(몇백만건, 몇천만건 넘는 대용량은 아직 잘 모르겠지만..)

그래서 팀원들에게 Ruby on Rails를 당장 쓰자고 말하는 것도 아니고,
세미나를 한번 해주고 싶은 마음이 솟구쳐, 팀 세미나..
스터디 시간에 살짝 언급을 했었는데..  한방에 퇴짜 맞았다.

퇴짜 이유는? Java 기술이 아니라서 ㅎ
생산성이 월등히 좋다고 다시 한번 더 설득을 시도 하였으나,,
그렇다면,, php를 쓰겠다고 한다..-_- php가 java보다 생산성이 좋다고..ㅡㅡ
내가 php를 잘 몰라서 반문할 여력은 별로 없다.

그런데, 나는 개발자 성향을 가진 팀원으로서, 생산성 좋은 Ruby on Rails를 보면 적용하고 싶고, 좋다는 것을 알리고 싶다.
Ruby on Rails의 Active Record, Formtastic .. 등등 수많은 라이브러리들을 보면.. 흥분된다 -_- 단지 좋아서.ㅎㅎ

하긴, 회사에서는 java 중에서도 내가 쓰고 싶은 java framework 이나 라이브러리를 쓰지 못하는 판에.. 왠 Ruby on Rails니..ㅎ
회사에서는 회사 자체의 라이브러리로 개발해야 한다. (내생각엔 좀 뒤쳐진..)
java로 개발 하더라도, java framework, 라이브러리 사용의 자유를 줬으면 한다..


해외 여행 호텔을 예약하려면..HotelTravel.com

이번에 말레이시아 코타 키나발루에 여행계획을 세우면서
hoteltravel.com으로 호텔을 예약을 했다.


Hotel Travel


예약과정이 아주 편하고, 직관적이다.
처음 접속하면 영어로 기본으로 보이지만, 오른쪽 상단에 태극기로 한국어 설정을 하면
한글로 편하게 볼 수도 있다.

심지어, 한가지 놀라운 점은.. 바로 채팅으로 고객문의를 들어준 다는점.
그것도 한국어로 채팅을 해서 고객문의 서비스를 받았다.

이전 포스트에서 쓴 호텔 3곳을 예약하는 과정에서,
단순 변심으로 카드 결제까지 한 호텔을 하나 취소하게 되었다.
취소도 잘 된다.
결제 취소 관련해서 궁금한 것이 생겨서, 채팅 고객문의 서비스를 이용해 보니, 아주 편하다. 대만족.

물론, 결제에도 ActiveX 가 사용되는 것이 아니고, https로 그냥 한다.
너무 쉽게 결제가 되고,
브라우저의 html form에서 카드번호 등의 기존입력 값들이 자동 완성이 되어서,
너무 편해 걱정스러울 정도다. (이건 거짓말임.)

여기서 잠깐 예기를 옆으로 세보면..
"저런 form자동완성 보안문제 때문에 ActiveX써야되.." 라고 말하는 분이 계시다면..OTL
공공PC는 브라우저 설정에서 form 자동완성을 꺼놓으면 된다. (이건 공공PC를 운영하는 곳에서 신경을 써 줘야 할듯.)
개인용 PC면 위 기능이 제공되면 편해서 좋은거 아닌가..

우리나라의 Flash로 된 메뉴, 웹표준화 안지키고, ActiveX의 결제시스템 등..
이런 오바스러움을 떨면서도 주민등록 번호는 https가 아닌 http로 전송 받는다. -_- 안습.
우리나라 전형적인 웹서이트들을 보면 좀 안쓰럽다. 왜 이렇게 되었는지..

실용주의 소프트웨어(http://jaehyun.userstorybook.net/2181/ )의 깨진창문 얘기가 떠오른다.
한번 깨지기 시작하면 쉽게 연속으로 깨지고, 금방 집이 폐허가 될 수 있다는 것.

호텔 얘기로 시작해서 개발자 얘기로 끝나는 -_- 뭥미.

2009년 12월 9일 수요일

코타키나발루 여행 계획

1월 16일부터 22일까지 말레이시아 코타키나발루 휴양지로 겨울에 따듯한 나라로 휴가를 계획했다.

일단 항공권은 아시아나 보너스 항공권으로 결정.
지금까지 모은 10만 5천 마일리지 중에서 7만 2천 마일리지를 사용하게 되었다.
동남아 보너스 항공권이 원래는 1인당 4만 마일 차감인데, 2인 이상 아용시 10% 할인이라서
7만 2천 마일리지 차감으로 2인 왕복 탑승권 득템.
유류세 및 공항세가 1인당 8만원이 나와서 16만원으로 항공은 해결

숙소는 인터넷으로 예약을 하기로 했는데,
http://www.hoteltravel.com/
http://www.agoda.co.kr
두군데 인터넷 호텔 예약 사이트중에서 hoteltravel 를 이용하기로 했다.
agoda가 순수 가격은 더 저렴한 상품이 꽤 많이 있는데, 조식이 불포함 된 경우가 많다.
아침은 호텔에서 먹는것이 좋은 것 같아서 hoteltravel로 결정.

도착이 새벽 17일 새벽 1시쯤 될 것 같아서,
첫날을 리조트나 고급호텔에 머무르기에는 돈이 아까운 듯 하여,
첫날은 저렴한 호텔을 이용하기로 했다.
베벌리 호텔 사바 1박 $64
http://www.hoteltravel.com/kr/malaysia/sabah/karamunsing.htm

둘째, 세째날은 리조트에서 보내기로 결정.
퍼시픽 수테라 리조트 $158 * 2박 = $316
http://www.hoteltravel.com/kr/malaysia/sabah/pacific_sutera.htm

넷째, 다섯째날은 고급 호텔에서 보내기로 결정.
르 메르디앙 코타 키나발루 $122 * 2박 = $244
http://www.hoteltravel.com/kr/malaysia/sabah/le_meridien_kota.htm
처음에는 하얏트 리젠시 호텔을 고려하였으나,
블로그를 검색하다 보니, 르 메르디앙이 더 좋은 평을 가지고 있다.

이만,, 여행 후에 자세한 후기를 올리도록 하겠습니다.


2009년 12월 1일 화요일

아이폰으로 본 증강현실 체험과 다음 로드뷰

오늘 아이폰을 개통 한 후,
Navigator라는 App을 다운로드 받아서 증강현실을 테스트 해 보았다.

무엇보다 놀란 점은 아이폰을 내 눈으로 보면서 내 몸을 움직이면,
아이폰이 나의 움직임을 모두 파악해서 화면을 보여준다는 점이다.

동서남북 방위 각도는 물론이고,
상하 각도 움직임까지 모두 센싱해서 화면 처리를 해 줄 수 있다는 점이다.

1. Navigator by Niftybrick Software

아래 화면은 우리집에서 반포공원을 증강현실 뷰로 보게 된 것이다.
8miles 저 방향에 반포 공원이 있다는 것을 알려준다.
8miles는 12.8Km정도 된다.
물론, http://www.youtube.com/watch?v=sWFcys5-HNY 에 소개된 것과 같이, 반포공원 좌표는
검색 후, 등록을 해 두었다. (이것은 등록된 지점 DB문제이니 나중에 풍부해 질 것으로 생각된다.)



2. Daum 지도의 로드뷰 App

지금 아래 정지된 사진으로 보니, 실감이 나질 않는데,
다음 지도로 내위치를 확인 후, 로드뷰를 보면 현재 위치의 로드뷰를 볼 수 있다.
여기서 오른쪽 상단의 시야맞춤(?) 버튼을 클릭하면,
아이폰을 들고 움직이는 것만으로, 마치 시야가 움직이는 것처럼 보여진다.

정말 신기한 세상이다.

동서남북 방위가 맞아서 내가 저 위치에 서있는 다면 눈으로 아파트를 둘러보는 것과 같이,
아이폰으로도 아파트를 둘러 볼 수 있게 되었다.
스티브잡스가 발표 현장에서 시연을 했던 것이 이와 같은 것이였던 것 같다.




아이폰이 새로운 세상을 만들어 주는 것 같은 기분이 든다.
점점 빠르게 변할 것 같다. 새로운 비지니스 기회도 많을 것 같고..




2009년 11월 30일 월요일

아이폰 도착

오늘(월요일) 아침 8시 45분에 아이폰 택배가 집으로 도착했네요.
이제 출근해요.

2009년 11월 26일 목요일

구글 웨이브 초대장 8장 다시 생김. Invite others to Google Wave

초대장이 다 쓰니까 금방 또 생기는군요.
구글 웨이브 초대장이 8장이 생겼습니다.
email주소를 알려주시면 초대해 드릴께요.



2009년 11월 23일 월요일

Ruby on Rails에서 View를 중복없이 개발하기 Haml, Sass and Compass

Ruby on Rails에서 HTML을 중복없이 개발하는 프레임 워크 중에 Haml이라는 것이 있다는 것은 알고 있었는데,
HAML 사용하기 에서 언급된 단점들 때문에 사용하지 않고 있었다.

치명적인 것은, Javascript친화적이지 않다는 단점.

그런데 웹 프론트를 개발하다 보면 HTML보다 CSS에는 엄청난 중복이 있다는 것을 알 수 있다.
그래서 나온 것이 Sass 라는 CSS 프리프로세싱 언어가 있다.

석준님께서 알려주신 http://ruby-toolbox.com/ 에서 알게 된 compass 라는 CSS 관련 gem을 알게 되었는데,
이것이 뭐하는 gem인가 하면,
Sass로 코딩된 것을 CSS로 프리컴파일 해주는 역할을 한다.

$ compass --watch

라고 명령을 주면 Sass 파일을 고치면 자동으로 CSS를 다시 생성해 주어서 개발시에 pre-processing에 대한 불편함이 없다.

Sass 의 사용평은,, 훌륭한 물건이다. 아주 편하다는 것이다.

Ruby on Rails로 웹 개발을 하시는 분은 Sass의 사용을 검토해 보라고 권유해 드리고 싶다.

그리고,, http://ruby-toolbox.com/ 사이트는 대박 유용하다는 것.!!
라이브러리의 용도별로 user rating을 해 두어서 사용자 선호도를 알 수 있다.
아주 훌륭한 수많은 라이브러리들이 있으니,
Ruby , Ruby on Rails 개발자라면 http://ruby-toolbox.com/ 를 적극 활용하기를..
 

구글 웨이브 초대장 8장 생김. Invite others to Google Wave

구글 웨이브 초대장이 8장이 생겼습니다.
email주소를 알려주시면 초대해 드릴께요.
(Mail: jaehyunkim at 쥐메일 닷컴 ,Twitter: @jaehyun )

8장 모두 소진되면 이글은 수정하겠습닌다.

참고로,, 저는 초대장을 빨리 보내드리는데, 바로 초대장이 가지 않을 듯 해요.
구글 웨이브가 아래와 같이 말해주고 있어요. (아마 몇시간 걸리지 않을까..)
Invitations will not be sent immediately. We have a lot of stamps to lick. 

구글 웨이브 초대장이 모두 소진되었습니다.
또 생기면 블로그에 배포를 알려드리도록 하겠습니다.

2009년 11월 19일 목요일

유용한 ruby gem 목록


목록을 페이징 해주는 will_paginate

이미지 첨부파일을 업로드 하고, DB로 관리하며 사이즈별 리사이즈 해주는 attachment_fu

로그인 모듈을 만들어 주는 restful_authentication

간단한 메뉴 네비게이션을 만들어 주는 simple_navigation

이미지 라이브러리 대명사 imagemagick 를 루비로 포팅한 rmagick

잘 모르지만, mysql 관련 성능향상.

prototype.js + scriptaculous.us 를 대체하는 jQuery 기반의 RoR Javascript 대안.

도메인명별로 구분을 할 수 있게 하는 subdomain_fu

사용자에게 페이지 디자인을 위임할 수 있는 템플릿 엔진 liquid

템플릿을 active-record DB에 데이터로 관리할 수 있게 해주는 dynamic_liquid_templates

Mongrel보다 빠른 Passenger  ( + Ruby Enterprise Edition 도 함께 쓰면 좋아요.)

html 파서 hpricot

디렉토리 이벤트 감시 derectory_watcher

문자 캐릭터셋을 알아내는 rchardet

Textile Markup 을 사용할 수 있게 해주는 redcloth

RSS피드를 파싱해 주는 rfeedparser

OpenID Ruby 라이브러리 ruby-openid


더 생각나는 것이 있으면 코멘트 달겠습니다.
사용하시는 유용한 ruby gem이 있으면 알려주세요.


2009년 11월 17일 화요일

mysql 의 my.cnf 설정중에 innodb_buffer_pool_size

내가 사용하는 서버가 두개가 있는데,

하나는 메인 메모리가 512M이고, 또다른 하나는 1G이다.

그런데 둘다 my.cnf에 내가 아는 아래와 같은 옵션 몇개만 설정하고 써 오고 있었는데,..
innodb_file_per_table
innodb_flush_log_at_trx_commit = 1

이상하게 mysql process 의 CPU점유율이 항상 20%~30% 대에서 안내려가는 현상이 생겼다.
crontab에 걸린 데이터 크롤도 있고 많이 쓰긴 하지만..
이렇게 CPU를 차지할 만큼 큰 job은 아니라고 생각이 들었는데.. 찾다보니,

innodb_buffer_pool_size

라는 옵션이 있는데, 권장은 메인메모리의 50~70% 면서(아마도 Mysql 전용 머신의 경우일 듯), 기본 default는 8M 인 옵션이다.
그래서, 이 옵션을 서버 각각 64M, 256M 로 설정했다. (내 머신들은 Mysql 전용이 아니니까.. 별짓 다하는 기계들..)
설정 하고 나니 CPU점유율 상황이 조금 좋아진 듯 하다.
간단한 옵션인데, 모르고 있으니 서버를 엉뚱하게 운영하고 있었다는 생각이 든다.

2009년 11월 15일 일요일

DB저장을 기반한 사용자 편집 UI를 위한 liquid template


liquid template 은 Ruby 에서 사용하는 템플릿 라이브러리 인데,
Ruby on Rails에서 바로 사용하기가 생각보다 편하지 않은 것 같다.

그래서 여기저기 둘러보다가 발견하게 된 것이,
인데, 최근에 릴리즈 된 듯 하고,, 아직 부족한 점이 많아 보인다.

그래도, 개념적으로 내가 바라는 형태로 움직일 듯 하다.
이럴때 저 오픈소스 개발에 뛰어들 수 있는 실력만 되면 정말 좋을텐데 -_-;;
업그레이드 시켜주고 싶은데.. 실력부족.

고수님께서 해주시길 기다리는 수밖에..

2009년 11월 12일 목요일

성공적인 쇼핑몰, e-commerce 사이트가 지켜야 할 것들. 2개의 인용글 포함

아래 원문ㅣ링크의 그림과 함께 봐야 이해하기가 좋다.

17 New Rules for Successful E-Commerce Websites

http://www.seomoz.org/blog/17-new-rules-for-successful-ecommerce-websites

1. 사용자가 어디에 있는지 네비게이션 바를 잘 보이는 곳에 제공할 것.
(e.g. Home > Category > Sub-cat > Product)
2. 좁혀진 카테고리에서 나올 수 있는 방법을 제공하라.
3. 다양한 방법의 오더링을 제공하라
가격 오름차순, 내림차순, 인기도, 베스트셀러, 특징, 유저 선호도, 에디터 선호도 등.
4. 서브 카테고리 내에 200개 이상이 있지 않으면, 한페이지에
볼 수 있는 메뉴를 제공하라.
100 items per page 등.
5. 세부적인 옵션을 제공하라. 사이즈 등.
6. 보다 세부적인 카테고리를 제공하라.
7. 가격이 얼마이고, 얼마를 절약할 수 있는지를 명시하라.
8. 검색창을 잘 보이는 곳에 제공하라.
9. 검색에 편리한 세부적인 옵션을 제공하라.
10. 검색 결과에 가장 가까운 (관련된) 목록을 제공하라.
("ted baker endurance shoes" 만약 검색 상품이 만족하는 것이 없다면,,
검색어를 하나씩 줄인 검색 결과를 제공. ebay)
11. 상세한 사이즈 정보를 제공하라.
12. 재고 여부를 보여줘라. 카트에 담고 주문하는 순간에 재고가 없다는 말은 하지 말아라.
14. 배송 가능 지역의 제한을 명시.
16. 구매한 고객에게 이메일로서 안심시켜라.
17. 주문에 관한 모든 정보를 고객에게 알리고, 사이즈를 잘못 주문한 것 같은 오류를 배송전에 수정될 수 있게 하라.


Is your website easy to buy from? Tips you can test to improve your site's checkout process

http://conversionroom.blogspot.com/2009/11/is-your-website-easy-to-buy-from-tips.html

1. 제품 이미지를 상세히 제공하는 것.
ajax, flash, video 등의 기술을 통해.
2. 구매 버튼
눈에 띄는 색깔의 버튼.
크고 읽기 쉬운 글자체.
(+)등의 아이콘
버튼의 위치는 제품의 오른쪽 하단에 위치
버튼은 크게 만들 것.
긴 설명문장을 가지고 있다면? 위에 버튼 하나. 가장 아래에도 버튼 하나.
3. 구매전에 가입을 강요하지 말라.
입력 필드는 꼭 필수인 것만 입력하도록 강요하기.
고객에게 왜 이 입력필드가 필요한지 인지시키기. (이메일 주소는 주문 확인을 하는데 사용됩니다.)
4. 구매 프로세스 상태 스텝 인식 그림.
내가 구매 스탭중 어디까지 와 있는지?
구매가 끝날 때 까지 몇개의 스탭이 더 남았는지?
다음 스탭은 무엇인지?
내가 주문한 제품을 다시한번 확인 할 수 있는 스탭이 남아있는지?
5. 입력창은 간단해야 한다.
입력 필드명은 산업에서 사용하는 명확하고 범용적인 것을 사용할 것.
체크박스나 라디오 버튼을 활용하여 옵션을 보여줄 것.
팝업 에러를 피하고, 문제 영역에 인라인 에러를 보여줄 것.
어떤 상황에서도 폼을 리셋시키지 말것. (사용자가 뭔가를 잘못 입력해서 에러가 발생하더라도.)
6. 고객에게 잦은 질문(FAQ)에 대한 답변을 제공할 것.
7. 구매를 위한 특별한 프로모션 이메일을 구매 전에 확인하라고 강요 하지 말것.
구매 후에도 할수 있는 마케팅들.
구매 후에 우아하게 나중에 마케팅 정책을 할 것.
8. 고객에게 사이트에 대한 신뢰를 주기 위해, 신뢰 인증 마크를 보여줄 것.
9. 구글 웹사이트 옵티마이저를 이용하여, 사이트를 지속적으로 테스트 하고 최적화 할 것.



외국의 쇼핑몰과 국내의 쇼핑몰은 완전히 다르다. 문화적 차이가 큰 듯 하다.
그나저나,, 쇼핑몰도 SaaS로 운영되면 Social 의 매력을 묻어나게 할 수 있지 않을까?


2009년 11월 10일 화요일

구글 크롬 chromeplus + Daum 영어사전

최근에 브라우저를 파이어폭스를 주로 사용하는데, 메모리를 너무 많이 먹는다.
그리고 처음 나왔을 때는 빠르다고 느꼈었는데, 요즘은 빠르다고 느끼지 못한다.
아무래도 그때는 인터넷 익스프로러 6.0 을 기준으로 비교해서 그런 듯 하고.. 최근에는 크롬이 나오면서 파이어폭스도 느리다고 느껴질 때가 많다.

게다가 회사에서 Eclipse, 사내메신저, Outlook, IE7.0 을 기본으로 사용하는데다가 Firefox까지 띄우면 컴퓨터가 아주 느려진다.

그래서 발견한 것이
구글 크롬의 장점 + 마우스 제스쳐 + javascript 셀렉션 등의 많은 장점을 가지고 있다.

다만 구글 툴바 및 플러그인등을 설치할 수가 없어서.. 사전 기능을 사용하지 못한다는 점.

그래서, 셀렉션 영역을 다음 사전으로 검색하는 Javascript북마크릿을 만들었다.
사전은 다음 사전이 좋다.


위 링크를 즐겨찾기 영역에 드래그 해서 북마크릿으로 사용하면 편리하다.

2009년 11월 7일 토요일

Apache Lucene + Solr (아파치 루씬 + 솔라) 오픈소스 텍스트 검색 엔진 사용

ApacheLucene
오픈소스 검색엔진인 Lucene


Solr
엔터프라이즈 검색서버인 Solr


오픈소스 검색엔진인 Lucene 과 그의 서브 프로젝트로서 엔터프라이즈 검색서버인 Solr 를 활용하여,
Twicco 서비스의 검색 기능을 개선하게 되었다.



처음에는 Twicco를 오픈 하였을 때는 트위터 글이 적어서 데이터베이스의 like 검색으로 가능 할 줄 알았다.
그런데, 몇만건 이상의 트위팅 글이 쌓이면서, DB like 검색은 수십초가 넘게 걸리는 문제가 발생했다.

이뿐만 아니라, 쇼핑몰을 만들어도 쇼핑 아이템 수가 늘어나면 검색 기능이 필요해 지고,
Stackoverflow와 같은 Q&A 커뮤니티 서비스를 만들어도 검색 기능은 빠질 수 없는 필수 기능이다.
그리고, DB like검색으로는 해결이 안되는 용량의 수준은 어느 서비스에서나 겪을 수 있는 문제라고 생각된다.

그래서, 이번 기회에 기존에 들어봤던 오픈소스 검색엔진인 Lucene 을 적용해 보기로 했다.
(회사에서 검색 부서 옆에서 일하면서도, 검색을 잘 모르지만... )

예전에 검색 교육을 받았던 문서도 뒤져보고, 웹서핑을 하면서 검색의 기초 개념을 조금 익혔다.

예전부터 거론된 Lucene을 사용하기에 가장 문제가 되는 점은..
한글 형태소 분석기가 없다는 것이다.

이 말은 쉽게 표현하자면,
"톱스타 장동건이 연인 고소영을 위해 담배를 끊었다고 일간스포츠가 7일 보도했다."
라는 문장을 검색 할 때,
Lucene에 기본으로 포함되어 있는 형태소 분석기를 이용하게 되면 스페이스 기준으로
Term을 구분하고 indexing하게 되어,
"장동건이" 를 치면 검색이 되지만, "장동건" 을 치면 검색이 되지 않는 치명적인 문제가 있다.
"담배를" 을 검색하면 검색이 되고, "담배" 를 검색하면 검색이 되지 않는..
얼마나 치명적인 문제점인가!

이 문제를 오픈소스로 해결해 주신 멋진, 존경스러운 분이 계셨다.
네이버에 루씬 한글 분석기 오픈소스 프로젝트 까페( http://cafe.naver.com/korlucene )
에 가면 KoreanAnalyzer 를 다운로드 받을 수 있다.

검색을 위한 형태소 분석 면에서 영어에 비해서 한글은 훨씬 어려운 점을 가지고 있다.
잘은 모르지만, 우리나라에서 한글 검색기술은 잘 오픈되지 않았던 것 같다.
그래서, 더 갑진 듯 하다. 이 한글 형태소 분석기를 개발해 주신분께 다시한번 감사의 말씀을 전한다.

KoreanAnalyzer를 활용하여 Lucene 커멘드 명령어로  한글 검색을 해 보니,
한글의 조사, 어미, 접두어, 접미어, 조합어 등의 사전을 기반으로 하기 때문에,
Lucene의 기본 형태소 분석기와는 차원이 다르게 훌륭한 결과를 얻을 수 있었다.
그리고, 기본 사전을 추가, 변경하면서 검색 성능을 향상 시킬 수도 있다.

위 문장에서 예를 들었던  "장동건", "담배" 등이 검색이 잘 된다.

2단계 Apache Solr.

검색 결과를 어플리케이션으로 전달하기 위해서는 많은 작업을 해 줘야 한다.
보통 아래와 같은 XML로 검색결과를 전달하는 방법이 많이 사용하는 것 같다.


















검색 대상 도큐먼트 추가, 색인 데이터 관리, 검색 결과를 전달 하는 등의 동작을
HTTP XML RESTful 방식으로 사용할 수 있게 해 주는 것이 Solr 이다.
아래와 같은 웹 인터페이스로 질의 테스트 및 색인어 보기 등의 많은 기능을 제공하여 편하게 사용할 수 있다.

































Solr를 사용하기 위해서는 위에서 언급했던 KoreanFilter, KoreanTokenizer 의 Factory 클래스를 아래와 같이 만들어 줘야 한다. 이것은 Solr의 설정을 통해 Lucene의 에서 사용된다.


package org.apache.lucene.analysis.kr;

import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenFilterFactory;

public class KoreanFilterFactory extends BaseTokenFilterFactory {
    public TokenStream create(TokenStream input) {
        return new KoreanFilter(input);
    }
}


package org.apache.lucene.analysis.kr;

import java.io.Reader;
import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenizerFactory;

public class KoreanTokenizerFactory extends BaseTokenizerFactory {
    public TokenStream create(Reader input) {
        return new KoreanTokenizer(input);
    }
}

그리고, Solr 홈페이지에 있는 Getting Started (Tutorial) http://lucene.apache.org/solr/tutorial.html 을 보고 설치하면 된다.
설정하는 과정에서 schema.xml 파일의 설정을 보면
<fieldType> 의 <analyzer>부분을 아래와 같이 수정한다.

...
      <analyzer type="index">
        <!-- modified by jaehyun
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        -->
        <tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
        <filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...
      <analyzer type="query">
        <!-- modified by jaehyun
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        -->
        <tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
        <filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...

그리고 검색할 데이터의 형태에 맞게 field를 정의해야 한다.
이것은 마치 DB설계를 할 때, 테이블 설계와 유사한 형태라고 생각하면 된다.

그리고 몇가지 설정해야 할 것들이 더 있는데, 아래 문서를 보면서 따라하면 쉽게 될 것으로
생각되어 모두 기술하지는 않겠다. 자세한 사항은
http://lucene.apache.org/solr/tutorial.html
http://www.ibm.com/developerworks/kr/library/tutorial/os-dw-os-apachelucene.html
http://wiki.apache.org/solr/
http://gurchin.tistory.com/153
등의 문서를 참고 하면 된다.
Tomcat을 같이 사용하려면 http://wiki.apache.org/solr/SolrTomcat 을 보면 된다.


끝으로..
지금까지는 검색엔진 기술은 전공자가 아니면 쉽게 따라할 수 없는 기술로 여겨져 왔으나,
훌륭한 오픈소스인 Apache Lucene, Solr, KoreanAnalyzer 등을 이용하면, 누구나 기초적인 텍스트 검색엔진 구축하여 활용 할 수 있게 되었다.
이제 막 기초적인 설정을 마무리 하였으니, 앞으로 Lucene, Solr 를 좀 더 공부해 봐야겠다.


2009년 11월 6일 금요일

Stackoverflow 사용하면서 또 하나 알게 된 것

짧은 나의 영어실력으로 오늘 간단한 질문을 하나 올려보려고, Stackoverflow에 갔다.

http://stackoverflow.com/users/174583/jaehyun

Tag를 ruby-on-rails, hudson, ci-server 로 달려고 했는데.. ci-server가 없다.
내가 보기엔 적당한 tag인것 같은데..

글쓰기를 누르니, reputation 250점 이하는 신규 tag생성을 못한다는 룰이 있다.
그래서 다시 tag를 입력하다보니, continuous-integration 라는 Tag로 글이 많더라는...
이것으로 Tagging했다.

생각하고 보니, 낮은 reputation 사용자에게 tag를 생성하게 하면,, 많이 난잡해 질 것 같다.
이것은 훌륭한 사용 제한.!

역시나,, 이 블로그글 쓰는 약 10분여 동안 답글이 두개나 달렸다..
이건 정말 훌륭한 시스템! Stackoverflow ..

2009년 10월 23일 금요일

구글리더의 Popular Items 목록 기능이 추가된 것에 대하여

구글 리더 블로그 원문:
http://googlereader.blogspot.com/2009/10/reading-gets-personal-with-popular.html


오늘 구글 리더에 Popular Items라는 항목이 생겼다. (한국어에는 아직 기능이 안보이는 듯 하고, 언어 인터페이스 설정을 영어로 변경해야만 이용할 수 있다.)

이 기능은 내가 구글 리더를 처음 사용할 때 필요하다고 느꼈던 기능중에 하나다.

1. 구글 리더 아이템을 공유 할 수 있고, 친구들과 코멘트를 교환 할 수 있는 것.
2. 많이 공유된 글을 코멘트와 함께 다른 사용자들과 커뮤니케이션 할 수 있는것.
3. 리더를 이용하는 이용자들끼리, 모르는 사람들이라도, 공유라는 관심 표현으로 관심사가 같은 사용자들을 친구로 추천해 주는 것.
4. 위와 같이 사용자 관심을 직접적으로 받은 글은 구글 검색 결과에도 상위 rank에 노출 될 수 있도록 높은 점수를 줘야 할 듯.
5. 이 다음에는 친구 목록으로 더 타이트 하게 엮이는 기능을 내 놓지 않을까? 지금은 친구들의 공유 댓글을 Item을 중심으로 모아서 볼 수가 없다. 이게 모아서 볼수 있게 되야 할 듯.
6. 점점 집단지성이 좋은 컨텐츠를 가려내는 힘을 발휘하면서 사람이 더 모이게 될 듯.

꼭 필요한 기능을 차근차근 천천히 추가해 가는 구글의 모습을 볼 수 있다.
이제 막 소셜의 시작 단계에서 꿈틀대고 있는 것 같다는 생각이 든다.
social web을 향해, 구글도 잘 하고 있고, facebook도 잘 하고 있는 듯 하다.

이런 상황에서 우리나라에서는 뭘 해야 할까.....


2009년 10월 22일 목요일

스택오버플로우의 태그 인기 순위 stackoverflow tag popular ranking

스택오버플로우 사이트는 개발자 QNA사이트로서 훌륭한 점들을 많이 가지고 있는 사이트다.

오늘은 tags의 질문 개수 순위를 보다 보니, 우리나라와 크게 다른 경향을 보이고 있는 듯 하여,
외국(영어권?)의 소프트웨어 개발 트랜드와 국내의 트랜드의 다른 점을 비교해 볼까 한다.


1. 왜 C#이 1위 일까?
스택오버플로우가 조엘이 MS플랫폼으로 만든 사이트라서 1등이 된것인지..
실제로 우리나라보다 외국에서 C#이 더 많이 쓰이든지 할 것 같다..

2. Java는 역시 상위권 3위.
우리나라의 개발 트랜드라면 Java가 1위 하지 않았을까?

3. PHP가 의외로 상위권으로 5위.
facebook이 사용중이고, 아직도 많은 웹사이트에서 사용중이다.
우리나라에서는 Java 를 선호하는 웹개발자들에게 무시받는(?) 경향이 있는 듯 한데, 외국에서는 많이 쓴다.
(물론 무시받는건 잘못된 것 같고..)

4. python > django 인데 ruby < ruby on rails
파이썬의 웹 프레임워크인 장고는 파이썬보다 하위권이고
루비는 특이하게,, 루비의 웹 프레임워크인 루비온레일즈가 루비보다 상위권이다.
이것은 RoR이 잘 만들어지고, 많이 사용되어지는 웹 프레임웍이라는 것을 짐작하게 한다.
우리나라였으면 이 4개 테그 모두 순위에 들지 못하지 않았을까.?

5. jquery
javascript framework으로서 jquery가 독보적이다.

6. iphone 약 10위권, 그리고 꽤 순위가 높은 objective-c
App Store에서 돈을 벌 수 있으니까,,
최근에 이슈가 된 것에도 불구하고, 시장 논리에 따라 순위가 막 올라가 있다.

7. eclipse
툴에 대한 문의가 이렇게 많나? 하는 생각을 해봄..

8. ibatis는 이 글을 쓰는 순간 46건으로..
순위와는 거리가 멀다.
우리나라였으면 꽤 상위권에 있지 않았을까..?
ibatis는 왜 우리나라만 쓰는 거 같다는 생각이 들까..?

9. spring, struts2, webwork 등의 우리나라에서 많이 사용되는
java웹 개발관련된 것은 찾아 볼 수 없다는 점.

10. 역시나 흐름대로..  웹 관련된 기술이 많이 보인다는 점.




2009년 10월 14일 수요일

Windows 7 런칭파티





파워블로거 응모 하는 곳이라 크게 기대하지 않았는데, 초청을 받았다. 와우~!

2009년 10월 11일 일요일

데스크탑 대용 저가형 노트북 구입 - Lenovo SL500




예전부터 집에 있는 데스크탑에 불만이 있었다.
CPU, 하드, 램 등의 스팩에 비해 성능이 안나오는 것.
베어본 shuttle이 조용하다고 해서 선택하게 되었는데, 성능도 약간 떨어지고, 소음도 약간 있는 편..
아무래도 소음 없고, 저전력인 노트북으로 교체를 하려고 벼루고 있었다.

Windows 7 이 나오면 Windows 7이 포함된 노트북을 구매하려고 기다려야 하나 고민도 해보고,
다나와에서 구경하면서 아래 제품들을 고려하고 있었다.

Lenovo T400s를 사고싶으나 300만원? 넘비싸..
맥북 Pro .. 맥도 소음이 있다. 더 좋아지면 사야지.
Lenovo T400 170만원 <= 램이 4G에 Windows 7 up 등등
Lenovo T400 140만원 <= 램 2G, Windows 7 up, 저가인 이유는 비디오카드, 메모리가 share형
Lenovo SL500 85만원 <= 가장 저가. 조금 마음에 걸리는 점은 CPU가 펜린이 아닌 메롬 이라는 점.
                                   그래서 최신 DDR3가 아닌 DDR2를 써야 한다는 점.
                                   해상도가 15인치에 비해 낮은 1280x800 해상도.

그런데 오늘 SL500 가격이 dnshop에서 더 싼게 나왔다.! 798,000원.
저렴한 가격에 100대 한정이라는 문구에 혹해서 그냥 질러버렸다.

[디앤샵 판매율1위 특가할인 100대한정!] 명품노트북 IBM ThinkPad SL500 2746-RP7
913,100  쿠폰가 798,000
http://www.dnshop.com/front/product/ProductDetail?PID=A195_RP7&CID=R2100129&Sid=0101_10070000_01_01&szSearchKeyword=sl500

Vista에서 XP로 다운그레이드 하고 사용하고 있는 중이다.

사용소감은,
우려했던 가장 큰 두가지인
메롬이 펜린에 비해서 많이 느린거 아닐까?
그렇지 않았다. 체감상으로는 큰 차이를 못느끼겠다. (X200 팬린 DDR3 2G와 비교하여..)
펜린이나 메롬이나 뭐.. 몇년 지나면 비슷한 고물 취급 당할 껀데 뭐.. 굳이 비싼 제품을 살 필요가 없다는 생각.

해상도가 15인치에 1280x800이 너무 떨어지지 않나?
보기 좋은 글자크기다. 데스크탑 대용으로 쓰기에는 딱 괜찮은 폰트 사이즈. 더 작았으면 데탑대용으로 쓰기 불편했을 듯.

이제 우리집에 Thinkpad 노트북만 3대. X31, X200, SL500
X31 2004년 초 210만원
X200 2009년 초 135만원
SL500 2009년 10월 80만원

조금 더 기다리면?? 30만원??

결론은 Lenovo SL500은 소음도 적은 편이어서 조용하고, 성능도 만족스러운 제품이다.
80만원으로 만족할만한 노트북을 살 수 있다니.. 세상 좋아졌다.



2009년 9월 21일 월요일

Getting Real by 37signals 를 읽고..

Getting Real by 37signals
http://gettingreal.37signals.com/toc.php

Getting Real by 37signals (한글 번역)
http://gettingreal.37signals.com/GR_kor.php


최근 재미있게 읽은 책(혹은 인터넷 글) 이다.
지금까지 내가 소프트웨어를 하면서 느끼는 점, 고민을 잘 이야기 해 주고 있다.
전적으로 내가 생각하는 소프트웨어 개발 방법론과 일치한다.

내 주변에서 개발되고 있는 대부분의 소프트웨어는
너무 많은 기능을 가지고 있고, 감당하지 못할 정도로 덩치가 커지고 있다.
이것은 유지보수에 치명적인 악영향을 끼침에도 불구하고,
당장 기능 구현에 급급한 나머지.. 소프트웨어의 크기가 커짐을 의식하지 못한 채 개발에 열중하고 있다.
이런 개발문화는 빨리 없어져야 한다.

Getting Real 글을 읽으면서 많은 부분 공감했다.
그런 나의 마음을 잘 해아린 글 처럼 느껴진다.
소프트웨어 개발자라면 한번쯤 읽어 보고.. 깊히 생각해 볼만하다고 생각한다.



2009년 9월 20일 일요일

아이폰 어플리케이션 개발

objective-c, COCOA 프래임웍을 조금 알아야 한다.

이걸 모르면 [ ] 가 너무 많아서, C, Java만 한사람들 에게는 모두 배열로 보인다.
이게 배열이 아니고 java에서 . 과 비슷한 건데..

책: 코코아 프로그래밍
http://www.yes24.com/24/goods/3287305

책: 아이폰 개발
http://www.yes24.com/24/goods/3287305

우선 한글 자료가 많은 곳.
http://iphoneos.co.kr/
http://cocoadev.tistory.com/

이미지 2D기반의 게임을 개발하려면 라이브러리를 이용해야 좋다.
물리엔진도 이용할 수 있으니, 활용도는 아주 높다.
http://code.google.com/p/cocos2d-iphone/




PHP Fest 2009 실용주의 PHP

PHPKorea 주최로,
PHP Fest 2009 실용주의 PHP
세미나를 합니다.
자세한 내용은 : http://new.imaso.co.kr/seminars/phpfest2009

저는 등록했으니, 등록하신 분 있으시면 같이가요.~






2009년 8월 8일 토요일

Java로 Ruby on Rails의 RESTful, scaffold처럼 웹개발하기

Ruby on Rails가 생산성이 좋은 이유에는 여러가지가 있지만,
그중에서 한가지가 RESTful동작의 scaffold를 자동으로 생성해 준다는 것이다.

Ruby on Rails는 Creating a weblog in 15 minutes with Rails 2
를 보면 알겠지만, DB를 기반으로 모델을 생성하고,
create, update, delete, list 등의 기본 동작을 하는 controller와 view를 생성해 준다.
이런 기능을 발판코드를 만든다고 말하며 scaffold 기능이라고 한다.

이것은 개발 초기에 생산성을 크게 향상시켜준다.

이와 비슷한 동작을 Java에서 구현 할 수 있는 방법을 소개하려고 한다.
사용할 프레임워크와 플러그인, 라이브러리는
  • Struts2 - 웹개발프레임워크 ( + Spring 사용)
  • iBATIS - DATA Mapper
  • iBATOR - DB Table을 기반으로 DAO, Model 소스 제너레이터
  • Struts2 Convention Plugin - Java의 XML홍수 속에서 XML을 대신한 Convention으로 동작 하도록 함.
  • Struts2 REST Plugin - Ruby on Rails와 같은 RESTful 지원
  • uBATOR - (자체제작) DB Table을 기반으로 controller, view 소스 제너레이터

DB Table을 생성하고,
iBATOR를 이용해서 Java Model과 DAO를 만든다.

Struts2를 다운로드 받으면, struts2-rest-showcase-2.1.6.war 가 들어있는데,
아주 훌륭하다.
이것을 기반으로 RESTful application을 만든다.

그런데, Controller, View를 노가다로 만들어 주려니 여간 힘든 것이 아니다.
iBATOR 소스코드가 공개되어 있으니, 약간 수정하여
Controller, View를 자동 생성하는 uBATOR를 만든다.

이렇게 만들면..
DB에 Table만 생성하면, Ruby on Rails에서 scaffold와 같이
Java에서도 RESTful로 동작하는 web application을 몇분만에 만들 수 있다.

 


2009년 7월 10일 금요일

회사에서 사용하는 비공개 웹 프레임워크 라이브러리의 문제점

회사에서 전사적으로 사용하고 있는 웹 프레임워크가 있는데,
오픈소스가 아니고, 사내 전용 소프트웨어 입니다.

그런데, 이것이 처음 사용될 당시.. 수년 전에는 좋은 시도였을지 모르겠으나,
현재는 많은 신기술, 개발자의 창의적 생각을 가로막는 것 같습니다.

오픈소스들도 발전하고 있고,
소프트웨어 기술도 발전하고 있는데..

굳이 사내에서 전용 프레임워크를 만들어서..
구글링에 답이 없어서 문제 해결이 어렵고..
문서화도 부족하고..
현존하는 훌륭한 외부 오픈소스 라이브러리들과 잘 붙지 않는..
이런 소프트웨어를 만들어서 써야 하는가?

정말.. 진심으로 현존하는 웹 프레임워크가 부족하여 보완하고 싶다면,
정정 당당하게 Apache Project를 출범하던지.. SourceForge에 올려서..
세계를 무대로 평가 받으면 좋지 않을까?(물론 어려움이 많겠지만..)
아니면,, 그냥 가벼운 정도로 오픈된것에 플러그인 정도 보완을 한다던가..

회사에서 강제로 비공개 소프트웨어 라이브러리를 만들어서,,
모든 개발 부서에 사용을 강요하는 것은..
회사로서 큰 손실인 듯 합니다.
(물론 비공개로 개발된 사내 라이브러리가 매우(x100) 훌륭하고 좋다면이야, 좋겠지만.. 대부분 그렇지 못하니..)


2009년 7월 8일 수요일

자바로 웹개발시 사용되는 프레임워크, 라이브러리

만약에 내가 자바로 웹개발을 한다면,
아래 프레임워크, 라이브러리를 사용하려 합니다.

다른 좋은 것들 있으면 알려주세요.~

Web Framework
Struts 2 - http://struts.apache.org/2.x/index.html
Spring Plugin - http://struts.apache.org/2.x/docs/spring-plugin.html

Web Presentation
FreeMarker - http://freemarker.org/
SiteMesh Plugin - http://struts.apache.org/2.x/docs/sitemesh-plugin.html

Javascript
Struts2 jQuery Plugin - http://code.google.com/p/struts2-jquery/
Struts2 jQuery Plugin Showcase - http://www.weinfreund.de/struts2-jquery-showcase/index.action

DB Access
iBatis - http://ibatis.apache.org/
iBator - http://ibatis.apache.org/ibator.html

Log
Log4j - http://logging.apache.org/log4j/

Build, Deploy
Apache Ant - http://ant.apache.org/

Operation
Apache Tomcat - http://tomcat.apache.org/

Misc.
Struts 2 Plugins - http://cwiki.apache.org/S2PLUGINS/home.html

또 필요한게 뭐가 있을까??

2009년 7월 3일 금요일

자바와 루비온레일스의 웹개발 ( Java vs. Ruby on Rails for Web Development )

Java Warehouse Developer Center vs. Rails


엄밀히 따지자면, Java는 언어이고, Ruby on Rails는 웹 개발 프레임워크이기 때문에 두 개가 비교되기에는 부적합 합니다.
여기서 말하는 Java는 Java를 이용한 웹 개발 이라는 의미에서 해석하시면 좋을 듯 합니다.

제가 하고 싶은 질문은,
Java와 Ruby on Rails 중에서 웹 개발을 하기에 어떤 것이 더 적합한 언어, 프레임워크인가? 입니다.

결론부터 말씀드리자면, Java보다 Ruby on Rails에 손을 들어주고 싶습니다.

저는 개인적으로 Java 언어를 오랫동안 사용해 와서,
언어 자체로만 따지자면 Java가 익숙한 언어입니다.
그런데 최근 들어서(사실은 지속적으로 고민했습니다만..) 회사에서 Java를 이용해서 웹 개발을 하다 보면, 참 여러 가지가 비효율적이라는 생각이 듭니다.

Java진영에서 웹 개발에 사용되고 있는 프레임워크로는 webwork, spring, ibatis 를 사용 중이고, 빌드 배포에는 maven을 사용 중이며, 운영환경으로는 apache + tomcat을 사용 중입니다.
Java를 이용한 웹 개발에서는 위에 나열한 것 외로, 여러 가지로 얽힌 프레임워크와 라이브러리가 더 사용되게 됩니다.

일단 위 프레임워크, 라이브러리를 사용하기 위한 XML configuration을 하면서 그 복잡함에 지치게 되죠.
그리고, 코딩을 할 때에는 BO, BOImpl, DAO, DAOImpl에 동일한 패턴의 코드들을 죄다 나열하게 됩니다.
이것이 정석이라고 하는데, 노가다 코드를 작성하면서 이것이 과연 필요한 것인가.. 라는 생각을 지속적으로 하게 됩니다.
그 중에서도 특히 DAO, DAOImpl은 거의 기계적인 패턴의 코드만을 작성하게 되는데도 말이죠.

xwork.xml(webwork url 설정), applicationContext.xml(spring object설정), BO(Business logic Object), DAO(Data Access Object) 4군데에서 동일한 네이밍 규칙을 지키려고 개발자가 신경을 쓰며 수많은 반복되는 패턴의 복사 코드를 생성하게 됩니다.
이 반복적인 작업이 저에게는 너무 큰 비효율로 인식되는 군요.

게다가 코드가 파일마다 몇 백 라인씩 되어가는데, 위에서 언급한 4군데에서 동일한 패턴으로 사용되는 코드들의 네이밍 규칙이 다들 제 각각으로 되게 되면.. 개발하는데 여간 해깔리고 힘든 일이 아닐 수 없습니다.
이 수많은 코드들은 바로 유지보수의 어려움이라는 직격탄으로 개발자들에게 날라오게 된다고 생각합니다.

게다가 Java라는 언어가 기본적으로 compile time을 가지는 언어라서,, Java Object가 수정될 때마다 tomcat을 restart해야 하는 불편함이 있습니다. 개발 생산성에 상당한 치명타를 입히게 되죠.
게다가 xml등의 resource파일이 수정되는 때에는,, 무시무시한 maven빌드 과정을 다시 거쳐야만 합니다.
몇 십 초 되는 과정을 개발 중간중간에 거치려니.. 답답합니다.
몇 초라도 손해를 덜 보기 위해서는 개발장비를 더 좋은 것으로 바꿔야겠군요!


반면 Ruby on Rails 웹 개발 프레임워크의 개발환경은 위에 언급한 대부분의 단점을 보완하고 있습니다. 게다가, 웹 프론트, 프레젠테이션 레이어에서 사용되는 수많은 장점을 더 가지고 있죠.

그렇다고 해서, Ruby on Rails가 Java에 비해서 모든 면에 서 뛰어나다는 것은 아닙니다.
많은 사람이 협업해야 하는 대형 프로젝트에서는 Ruby 보다 Java가 더 적합하다고 생각합니다.
그러나 대규모의 웹 프로젝트가 아니라면,, 제가 지금 하고 있는 규모의 프로젝트 대부분에서 Ruby on Rails가 적합하다고 생각합니다.

끝으로, 제가 꼽는 Ruby on Rails에 비해서 Java의 장점은 아이러니하게도 좀 전에 언급한 Java언어의 단점인 Compile time 이 있다는 데에서 찾을 수 있습니다.
컴파일을 한다는 것으로 compile time에 수많은 오류를 찾아 낼 수 있기 때문입니다.
Ruby on Rails는 compile 과정이 없기 때문에 run time 에 에러를 만나게 됩니다. 이것은 Ruby on Rails의 안 좋은 점이네요.
그리고 Java언어는 Compile 과정이 있는 언어이기 때문에, IDE에서 코딩 시에 auto completion 을 지원해 줍니다. Ruby언어는 동적인 성향이 강한 스크립트 언어이기 때문에 이 부분의 지원이 쉽지 않다는 점이 있습니다.

이 두 가지의 장점을 Ruby on Rails에서 누릴 수 있는 방법이 있거나..
위에서 언급한 Java언어의 웹 개발 환경에서의 수많은 단점을 극복할 수 있는 방법이 있었으면 좋겠습니다.

개인적으로는 노가다 코드로 대부분의 시간을 낭비하는 Java로 하는 웹개발 보다는 생산성 좋은 Ruby on Rails로 개발하고 싶습니다. Ruby on Rails로 개발하다보면 Ruby언어도 점점 익숙해 지겠죠.
그러나 회사에서 저의 생각을 받쳐주지는 않네요.-_-;
그래서 당분간 Java를 계속 하게 됩니다. 안타깝게도,, 이러면서 저의 짧은 Ruby, Ruby on Rails의 지식도 점점 잊혀져 가는 듯 합니다.

끝으로,,
이글은 개발관련 잡담, 개인적인 생각임을 밝힙니다..
제가 개발관련 지식이 부족해서 오판을 하는 것일 수도 있죠.ㅎ

2009년 6월 25일 목요일

내가 회사에서 담당하는 서비스의 장애.

제가 회사에서 담당하는 서비스가 지난 월요일 저녁시간에 장애가 발생했습니다.
비교적 빠른시간에 장애대처를 할 수 있어서, 서비스는 비교적 빠른 시간 내에 정상화 되었습니다.

회사의 업무 프로세스에 따라,
장애 원인을 보고하고, 장애 재발 방지 대책도 제출했습니다.

그런데, 어느 QA팀장님께서,
저에게는 정말 높으신 분들 줄줄이.., 그리고 수많은 개발 그룹분들을 참조로 넣어서 두가지를 물어오셨습니다.
1. 장애의 원인과 재발방지 대책은?
2. 그리고, 수많은 참조자들에게 보내는..  이런 장애가 나지 않게 조심하라는 경고.

그런데, 수많은 참조자 앞에서 마치 제가 장애를 일으킨 듯한 저 이메일과..
저는 이미 프로세스를 통해서 보고한 내용(원인과 재발방지 대책) 을..
굳이 저 많은 참조자들을 넣어서 저에게 되물음을 하는 이유는 무엇일까요?

장애 내용 전파를 저에게 원인과 재발방지 대책을 묻는 것과 별개로
사례로서 따로 사내 전파를 하면 안되는 것이였을까요?

굳이 장애 원인 제공자를 따지자면, (제 주관적인 생각입니다만) 저에게는 약 10%의 책임이 있다고 생각됩니다.

제 입장에서 겪은 일은 별것 아닌 일이지만, 신경이 쓰입니다.
이런 일 자체가 신경이 쓰이는 것이 아니고,
회사에서 저런식으로 일하는 분(배려가 부족한..)이 윗분들에게 인정을 받을 것을 생각하면.. 흠..
제가 이런 조직에 있다는 것 자체가...ㅡㅡ;;







2009년 6월 18일 목요일

지난 약 2일 동안의 리플링 서비스 장애 사과문

지난 일요일 오후부터 수요일 새벽까지 repling.com 서비스의 장애가 있었습니다.
장애의 원인은 호스팅 서버의 하드디스크 물리적 결함이었고,
대부분의 데이터는 복구가 되었습니다.

그런데 아쉽게도 사용자 프로필 이미지 데이터가 손실되었습니다. 죄송합니다.
번거로우시더라도,
http://repling.com 에 접속하셔서, 다시한번 사용자 프로필 이미지를 등록해 주세요.

앞으로 고객님의 소중한 데이터가 유실되지 않도록 더욱 주의하겠습니다.
앞으로도 지속적인 서비스 이용 부탁드립니다.

PS. 언제나 고객님의 소중한 의견을 기다리고 있습니다.
http://www.repling.com/about/feedback

2009년 6월 15일 월요일

repling.com, newscast.kr 서버장애

호스트웨이에서 서버호스팅을 받고 있는데,
일요일 저녁에 서버 장애가 났습니다.
이용자가 거의 없습니다만,
서버 장애로 인해 불편을 겪으셨다면 죄송하다는 말씀을 우선 드립니다.

아직 정확한 원인 파악이 되지는 않았지만, 하드디스크의 물리적인 장애로 판단됩니다.

jaehyun@newscast:~$ top
-bash: /usr/bin/top: Input/output error
jaehyun@newscast:~$ du
-bash: /usr/bin/du: Input/output error

거의 모든 리눅스 명령어에 위와 같은 IO에러가 발생합니다.

우선, 서버를 복구 해야 하는데..
이 시점에서 장기적인 서버 운영에 대한 여러가지 고민을 하게됩니다.

1. 생각보다 서버호스팅이 책임져 주는 것이 없다는 것입니다.
HDD물리적 고장인데도 불구하고,
서버호스팅 업체에서는 HDD교체 후, OS설치비를 요구할 듯 합니다.
저에게는 적은 금액이 아니라서 OS설치를 해야 하는지 고민입니다.

2. 최근 Google App Engine for JAVA에 Java web project 를 deploy해 보았는데,
생각보다 쓸만합니다. 구글이라 믿을 수도 있습니다.
불편한 점은, JDO, JPA와 같이 Java Persistence Layer를 제공하고,
MySQL등의 RDB를 제공하지 않는다는 것 입니다.
JDO, JPA는 좋은 개념이라고 생각은 되는데, 새로 배워야 한다는 부담과,,
아직 RDB모두를 포괄 할 만큼은 성장하지 않았다고 느껴집니다.

3. Google App Engine for JAVA를 사용하기에 또 다른 불편한점 한가지는
Ruby on Rails를 사용할 수 없다는 것입니다.
Java도 익숙해서 큰 문제는 안됩니다만,
기존 개발된 repling, newscast 서비스가 Ruby on Rails로 개발되어 있습니다.

4. 왠지 믿음이가는 스마일서브 http://www.1000dedi.net 에서 풀 가상화 호스팅 서비스를 시작하였습니다.
이 서비스는 올해 초쯤 시작한듯 하더군요.
http://www.1000dedi.net/docs/renew/core_host/core_host02_01.htm
개인적인 의견이지만 지금 이용하고 있는 호스트웨이보다 스마일서브가 믿음이 갑니다.
월 이용료도 더 저렴한 서비스를 이용할 수 이겠군요..
성능이 어느정도나 나올지는 잘 모르겠습니다.
한가지 걸리는 것은 해외 접속 트래픽을 제한을 한다는 것입니다. (왜 제한을 하는 것인지 궁금하네요.)
작은 서비스이긴 합니다만, 해외 접속도 생각하고 있기에, 이 내용이 조금 걸리긴 하네요.

이번 장애로서 백업의 중요성, 이중화의 필요성을 느끼네요.. (운영장비의 이중화는 비용이 문제.)
작게나마 서비스를 운영해 보면서.. 느끼는것이 많네요..

오래간만에 쓰는 글인데,
두서없이 주저리주저리~~

호스팅 관련하여 좋은 대안이 있으시면 추천해주세요.~~

2009년 5월 28일 목요일

리플링(repling.com) 탄생 배경


안녕하세요.
오늘은 리플링 서비스를 준비하게된 동기및 탄생 배경에 대해 말씀드리겠습니다.

리플링 서비스의 목적은,
"웹에 있는 컨텐츠를 친구들과 함께 공유하여 보고, 서로 정보를 교환하며, 공유된 컨텐츠에 댓글을 쓰면서 의견을 교환하자."
입니다.


우선, 리플링 서비스를 기획하면서 벤치마킹대상 서비스로는
구글 리더의 공유피드, friendfeed, twitter, 네이버 오픈캐스트, 마이크로탑탠 서비스 등을 들 수 있습니다.
위 언급한 모든 서비스들은 각각의 특징들을 잘 가지고 있고, 훌륭한 서비스들 임에 틀림 없습니다.



1. 구글 리더의 경우, 불과 한두달 전만 해도 공유한 컨텐츠에 추가적인 댓글을 쓰는 기능이 없었습니다.
최근에 공유글에 대한 댓글을 추가적으로 달수 있게 되었습니다.
그런데, RSS구독항목에 없는 컨텐츠의 경우, 공유를 하지 못한다는 불편함이 있습니다.

2. 프랜드피드와 트위터의 경우, 링크를 글줄임 기능을 이용하여 줄여서 표현하고 있습니다.
링크를 포함하여 글을 쓴 사람 모두를 볼 수 있는 기능이 약하다고 판단하였습니다.
링크를 공유하고 싶다는 목적에 부합되지 않는다는 것을 느끼고,
링크 중심에 지인간의 댓글을 주고 받을 수 있는 기능을 생각하게 되었죠.

3. 네이버 오픈캐스트와 마이크로탑탠의 경우에는,
글 모음을 발행하기 위해서는 일정양의 정보를 모아야 한다거나, 발행을 하는데 번거로움을 느낄 수 있었습니다.
한번의 발행을 하기 위해서는 시간투자를 해야 합니다. 잡지를 발행하듯이 말이죠.
실시간성, 즉시성, 편리함, 쉬움을 필요로 한다고 느꼈습니다.
그래서, 웹서핑을 하다가 관심 있는 글, 발행 하고 싶은 글을 보게 된 경우, 즉시 나의 RSS피드에 발행할 수 있으면 좋겠다는 생각을 하였습니다.

그래서 리플링 서비스가 탄생하게 되었습니다.

아래 그림과 같이 웹서핑을 하다가, 친구와 함께 공유하고 싶은 글을 보았을 때,
간편하게 리플링하기 북마크릿을 활용하여 나의 리플링 공유피드로 발행 할 수 있습니다.



이렇게 발행된 글들은 아래와 같이 나의 리플링 홈에 쌓이게 되며, 친구들과 댓글을 주고 받을 수 있습니다.




조금 더 쉬운 이해를 돕기 위하여
소개 동영상을 준비하였습니다.

























그럼, 아직 부족함이 많지만,
조금씩 개선해 나가는 서비스가 되도록 노력하겠습니다.

4개의 항목만 입력하면 되는 아주 간편한 가입 절차가 준비되어 있습니다.
이용해 보시고, 서비스에 대한 의견을 주시면 좋겠습니다.
감사합니다.

리플링 서비스 바로가기



2009년 5월 3일 일요일

뉴스캐스트 서비스 리뉴얼


연휴기간에 시간이 좀 남아서,
귀찮아서 방치해 두었던 서비스인 뉴스캐스트(NEWSCAST.kr) 서비스를 리뉴얼 하였습니다.

작년 8월쯤에 LGT OZ공모전에 출품하기 위해서 혼자서 대략 1~2주의 여가시간을 활용하여 만든 서비스이구요.
역시나 Ruby on Rails로 개발되어 있습니다.
아래와 같이 간단한 형태로 생겼습니다.

작년 8월부터 newscast.kr 도메인을 사서 서비스를 시작하였는데,
우연히 올해1월부터 네이버에서 서비스하는 뉴스캐스트와 이름이 중복어 사용되었네요.
제가 작게 시작하였지만, 뉴스캐스트라는 이름을 먼저 사용하였습니다.
믿지 못하시는 분은 안계시지만, 증거 산출물로서,
아래 NEWSCAST로고는 dotty님께서 작년 8월쯤에 그려주신 것이랍니다.^^

주제는,
"실시간 급상승 검색어" 에 노출된 단어로 최근 뉴스기사를 추출하여 실시간 업데이트하여 보여주는 서비스 입니다.
약 1일이 지나면 기사는 사라지게 되고, 계속 새로운 기사로 채워지게 됩니다.



아래와 같이 아이팟 터치로 접속하시면 전용화면을 보실 수 있습니다.
물론 LGT 오즈폰으로 접속 하셔도 전용화면을 보실 수 있습니다.


그럼 많은 이용 부탁드리고,
개선사항의견 있으시면 말씀해 주세요.~~



2009년 2월 10일 화요일

읽은 책: 프리젠테이션 젠

프리젠테이션 젠
카테고리 자기계발
지은이 가르 레이놀즈 (에이콘출판, 2008년)
상세보기


3월부터 새로운 스터디를 시작하기도 하고, 책이 출판되면서 부터 많은 블로거들에게 소개가 되어서, 한번 읽어봐야겠다는 생각하고 있었던 책 입니다.

좋은 점중에 하나는 그림이 많아서 지루하지 않게 빠르게 읽을 수 있었습니다.

많은 내용이 있지만,
프리젠테이션을 준비 할 때, 장인정신을 발휘 해서, 정성을 들여서 준비를 하고, 청중들의 시간이 아깝지 않도록 좋은 프리젠테이션으로 준비를 해야 겠다는 생각을 했습니다.
(잘 할 수 있을지는 모르겠습니다만...)

2009년 2월 5일 목요일

집에서 개발서버 운영하기

저희 집 거실에 아래 사진과 같이 IBM X31 노트북으로 운영하는 개발 서버가 있습니다.
이 노트북 구입한지는 만5년이 넘은 듯 하네요. 구형이긴 하지만 제품이 워낙 좋아서 리눅스 서버로 사용하는데 전혀 문제가 없습니다.



집에서 서버를 운영하기에 PC가 아닌 IBM X31 노트북으로 서버를 운영하는 데에는 몇가지 장점이 있습니다.
1. 무소음에 가깝습니다.
2. 발열이 거의 없습니다.
3. 전력소비가 적습니다.

우분투 리눅스를 설치해서 사용중인데, 개발용으로 사용하는데에는 전혀 불편함이 없습니다.
ftp, ssh, svn, ruby on rails, java, tomcat, apache, mysql, php등의 개발환경을 갖추고 있습니다.

운영 기간은 약 1년을 넘었는데, H/W불안정으로 서버가 장애를 일으킨 적이 한번도 없었습니다.
개발서버로 사용하기에는 안정성에는 전혀 문제가 없다는 것이죠.

도메인 설정은 어떻게 하고 있는지 소개해 드리겠습니다.
국내 가비아, 닷네임등의 도메인 구입 대행 업체에서 도메인을 구입한 다음, 아래와 같은 무료 DNS서버를 이용하여 DNS를 설정합니다.

무료 DNS서비스로 http://zoneedit.com/ 이 있습니다.
국내에도 유사한 서비스가 있는 것으로 알고 있습니다만, 다양한 설정을 할 수 있고, 깔끔한 인터페이스를 가지고 있는 zoneedit 서비스를 추천합니다.
무료 회원은 도메인 5개 까지 DNS서비스를 받을 수 있습니다.
부족하다면 아이디를 더 만드셔서 10개, 15개.. 더 많이 관리 할 수 있겠죠. (아이디만 더 만들면 무료로 더 많은 ip를 관리 할 수가 있겠죠..)


위와 같이 로그인 화면이 있습니다.

위와 같이 다양한 설정을 할 수 있습니다.

그리고 가장 중요한 것은 도메인을 alias로 하여 아래 소개 할 유동IP를 고정 IP로 바꾸어 주는 no-ip서비스에 alias를 설정 해 줍니다. 


개인 가정의 유동 IP를 고정IP인 듯이 서비스를 해주는 http://www.no-ip.com/ 서비스를 이용하고 있습니다.
no-ip에서 고정IP서비스를 사용하기 전에는 http://codns.com 에 유료 서비스를 이용 해 본적이 있습니다. 1년에 약 17000원 정도의 비용을 들여서 유료 서비스를 받았었죠.
그런데, 안정성 면에서 무료인 no-ip도 전혀 문제가 없습니다. 오히려 안정성이 더 좋은 것 같기도 합니다. 제가 no-ip 서비스를 이용하는 동안에 장애가 발생한 적이 한번도 없었으니까요.

그런데, no-ip의 무료서비스를 이용하면 60일 마다 email로 날라오는 무료사용 만료 경고 메일에 계속 사용하겠다는 click을 해 주어야 합니다. (유료로 전환하라는 광고를 보면서..)
이정도 작업은 전혀 번거로움이 없습니다. 무료이니 충분히 감수 할 수 있는 불편함 정도라고 생각됩니다.

위와 같이 작업을 하면, 아래와 같이 고정 IP를 가진 개발 서버를 운영비용이 거의 들이지 않고 운영할 수 있습니다.

예)
http://dev.jaehyun.kr
http://board.jaehyun.kr/board/freeboard

그럼, 저렴한 비용으로 개인 서버를 운영해 보세요.~