2009-12-29

어느 독서광의 생산적 책읽기 50



과연 독서를 잘 하려면 어떻게 해야 될까? 하는 궁금증이 생겨서 독서 방법론에 관련된 책을 찾아보았다. 우선, 너무 두껍지 않고 일목요연하게 정리된 것을 찾다 보니, 이 책을 선정하게 되었다. YES24알라딘에서 확인해보니 생각했던 것보다 상당히 인기있는 책이었더군요. 크게 4부로 구성이 되어 있고, 1부와 3부가 책을 잘 읽는 방법을 설명하였고, 2부에서는 책을 읽으면서 하지 말아야 할 사항, 4부에서는 독서의 필요성을 이야기 하였다. 내용중에는 다양한 책들이 소개되어 있어서, 읽어보고 싶은 욕구도 생긴다. 독서량이 많이 적은 나로서는 상당히 도움이 될 만하다. 일단, 목차와 거론된 책 제목을 적어보았으니, 나중에라도 참고하면 좋을 듯 하다. 저자의 홈페이지도 있으니 독서활동에 도움이 될 것이다.

안상헌의 좋은책이야기 : http://www.ashworld.net/

<목차>
1부 책읽기, 이렇게 하라
  1. 잠수함과 토끼 - 언제나 책을 들고 다녀라
  2. 생각하는 사람, 실천하는 사람 - 지금 당장 책을 잡아라
  3. 마음형 인간 - 자신만의 독서시간을 만들어라
  4. 서당의 학동처럼 - 중요한 내용은 외워라
  5. 형광펜과 포스트잇 - 자신만의 밑줄을 그어라
  6. 어린이의 책읽기와 어른의 책읽기 - 내가 왜 이 책을 읽는지 이유를 확실히 하라
  7. 내 사랑 책 - 돈으로 책을 사지 말고 마음으로 책을 사라
  8. 인간적인 것의 힘 - 세상에 대한 애정이 담긴 책을 선택하라
  9. 거꾸로 혹은 삐딱하게 - 외워야 할 책과 넘어가야 할 책을 구별하라
  10. 삼장법사의 의문 - 끊임없이 질문하면서 읽어라
  11. Give and Take - 책에게 정성을 주고 삶의 지혜를 받아내라
  12. 창의적 책읽기 3단계 - 많이 읽고 많이 써라
  13. 책 한 권에 종이 한 장 - 독서의 결과물을 차곡차곡 쌓아가라
2부 책읽기, 이렇게 하면 안된다
  14. 해도 안 된다고? - 금방 답이 나오지 않아도 실망하지 마라
  15. 멀리 가는 향기 - 빨리 읽으려고 애쓰지 마라
  16. 피그말리온 현상 - 두껍고 어려운 책이라고 포기하지 마라
  17. 언젠가는 알아들을 날이 올거야 - 이해할 수 없는 것에 집착하지 마라
  18. 리더십과 헤드십 - 건강하지 못한 책은 '아니다'라고 거부하라
  19. 질투와 편견 - 저자와 소모적인 질투를 벌이지 마라
  20. 집단사고? 불복! - 만장일치와 권위에 굴복하지 마라
  21. 영화배우 주성치 - 반대의견을 올바로 받아들여라
  22. 테세우스의 길 - 남의 생각을 뜯어고치려고 하지 마라
  23. 느림의 미학 - 슬럼프를 피하지 마라
  24. 열심히 살기와 의미있게 살기 - 때때로 책읽기에 브레이크를 걸어라
  25. 빈센트 프리만을 위하여 - 뭔가 있는 것처럼 보이려고 애쓰지 마라
  26. 도서관이냐 자율학습이냐 - 책읽기로부터 스스로를 퇴직시키지 말라
3부 지름길 독서, 입장을 바꿔보면 책읽기가 쉬워진다
  27. Learning by doing - 타인에게 설명하듯이 읽어보라
  28. 역지사지(易地思之) - 저자의 입장에서 읽어보라
  29. 일상에 흘리기 - 자기가 읽은 내용을 남들에게 들려줘라
  30. 내 머릿속의 개념정의 - 나와 연관시켜 책의 내용을 정의 내려보자
  31. 행복한 모티베이션 - 책 한 권마다 나만의 동기부여를 하라
  32. 마지막이 아름다운 사람 - 생계유지형, 외부지향형, 내부지향형 책읽기
  33. 공유의 즐거움 - 다른 사람들의 독후감에 귀기울여라
  34. 평범한 일을 비범하게 - 키워드를 잡아라
  35. 지식의 식민지 - 책에서 창조성을 끌어내라
  36. 책 한 권의 블록버스터 - 다양한 가치를 찾아내라
  37. 머리가 아니라 손 - 많이 읽었으면 글쓰기에 도전하라
  38. 구체와 추상의 대화 - 훌륭한 독자는 또 하나의 저자가 된다
4부 책읽기, 그 곳에 길이 있다
  39. 공짜는 없다 - 미래를 위해 나만의 책 세 권을 골라보라
  40. 자극과 변화 - 책읽기로 세상살이의 내공을 쌓아라
  41. 위기와 기회 - 책 속에서 제2의 인생을 만들어갈 수단을 찾아라
  42. 감동의 힘 - 모든 책에는 배울 것이 있다
  43. 재미와 열정 - 눈높이에 맞는 책으로 자기를 충전하라
  44. 마음 발전소 - 재미있는 책읽기가 자기를 발전시킨다
  45. 실천적 중독자 - 현실과 끊임없이 대화하라
  46. 책읽기와 비즈니스 - 창조적으로 읽어야 해결책이 보인다
  47. 하드 디스크, 헤드 디스크 - 자신의 헤드 디스크를 매력있게 채워가라
  48. 랍비와 지식노동자 - 지식 부자가 진짜 부자다
  49. 비워두기 - 새로운 정보를 위해 머리를 비워두라
  50. 미래를 위하여 - 자기만의 독서법을 써보라

<독서노트에 수록된 책들>
'카네기 인간관계론' - 데일 카네기
'네 안의 잠든 거인을 깨워라' - 앤서니 라빈스
'성공하는 사람들의 7가지 습관' - 스티븐 코비
'슬픔이 기쁨에게' - 정호승
'깨달음이 있는 경영' - 이동현
'니벨룽겐의 노래' - 프란츠 퓌만
'일리아드' - 호메로스(호머)
'오디세이' - 호메로스(호머)
'어린왕자' - 생 텍쥐페리
'산이 움직여주길 기다리는 사람들' - 찰스 핸디
'30대 변화를 먹고 살아라' - 나카타니 아키히로
'삼국지' - 나관중, 이문열, 황석영, 박상률, 김종년, 천웨이동, 요코야마 미쯔데루
'창의성의 즐거움' - 미하이 칙센트미하이
'카네기 연설론' - 카네기
'유쾌한 심리학' - 박지영
'멀리가는 향기' - 정채봉
'노마디즘 1, 2' - 이진경
'천 개의 고원' - 질 들뢰즈, 펠릭스 가타리
'니체의 위험한 책, 차라투스트라는 이렇게 말했다' - 고병권
'차라투스트라는 이렇게 말했다' - 니체
'성공하는 리더는 혼자 뛰지 않는다' - 존 어데어
'베니스의 상인' - 윌리엄 셰익스피어
'조벽 교수의 명강의 노하우&노와이' - 조벽
'나의 문화유산답사기' - 유홍준
'게으르게 사는 즐거움' - 어니 J. 젤린스키
'인형의 집' - 헨릭 입센
'역사 속에서 걸어나온 사람들' - 나카지마 아츠시
'상혼' - 고쓰카 다케시
'아주 특별한 마케팅 과외수업' - 김학선
'먼저 돌아눕지 마라' - 장정빈
'봉이 김선달'
'정재승의 과학 콘서트' - 정재승
'착한 아이의 비극' - 가토 다이조
'리더가 죽어야 리더십이 산다' - 진재혁
'홀러서기 50' - 나카타니 아키히로
'대한민국 광고에는 신제품이 없다' - 이강우
'사기' - 사마천
'시의 길을 여는 새벽별 하나' - 김상욱
'죽었다 깨나도 회사 가기 싫은 날' - 철밥통
'무소유' - 법정스님
'용서' - 달라이 라마
'아무도 기획하지 않은 자유' - 고미숙
'개인 브랜드 성공 전략' - 신병철
'상상력의 한계를 부수는 헤라클레이토스의 망치' - 로저 본 외흐, 박종하 옮김
'오, 한강' - 허영만
'고독한 기타맨' - 허영만
'사랑해' - 김세영, 허영만
'설득의 심리학' - 로버트 치알디니
'장미의 이름' - 움베르트 에코
'펄떡이는 물고기처럼' - 스티븐 C. 런딘, 존 크리스텐슨, 해리 폴
'철학의 외부' - 이진경
'왜 벌써 절망합니까' - 정문술
'펀 경영 (That's s good one)' - 밥 로스(Bob ross)

<그 외 언급된 책들>
'나를 경영하는 변화의 기술' - 오자사 요시히사
'학문의 즐거움' - 히로나카 헤이스케
'소유냐 존재냐' - 에리히 프롬 (Fromm, Erich)
'그리스 로마 신화' - 토마스 불핀치, 이윤기 등 다양한 저자
'감옥으로부터의 사색' - 신영복
'미쳐야 미친다' - 정민
'서유기'
'질문의 7가지 힘' - 도로시 리즈 (Dorothy Leeds)
'돈은 쓰면 쓸수록 늘어난다' - 나카타니 아키히로
'동물농장' - 조지 오웰
'변신' - 프란츠 카프카
'정관정요' - 다양한 저자들의 책이 있음
'권력과 책임' - 베른하르트 A. 그림
'유머로 여는 3분 스피치' - 김진배
'과학혁명의 구조' - 토머스 새뮤얼 쿤
'완전한 행복' - 마틴 셀리그만
'헝그리 정신' - 찰스 핸디 (Charles Handy)
'노인과 바다' - 어니스트 헤밍웨이
'무대리가 일하기 싫을 때 읽는 책' - 가사마키 가츠토시

2009-12-25

Oracle Database 11g Release 2 Installation On CentOS 5.4


보통은 오라클도 데비안 리눅스에 설치해서 사용하지만, RAC 구성을 위해서는 어쩔수 없이 CentOS를 이용해야만 한다. 아직 데비안 리눅스에서는 성공하지 못했기 때문이다.


CentOS 설치시, Memory는 1.5GB 이상, Swap은 2.2GB 이상으로 잡고, SELinux은 disabled 로 설정한다. Firewall도 실행되지 않도록 한다.

오라클 다운로드

아래 링크를 통해서 오라클을 다운로드 받는다.

Hosts File

/etc/hosts 파일을 아래와 같이 설정한다.
<IP-address>  <fully-qualified-machine-name>  <machine-name>
예를 들면, 아래와 같을 수 있겠다.
10.1.11.111    db1.urdomain.com    db1

커널 파라미터 설정

”/etc/sysctl.conf” 파일에 아래 내용을 추가하고 저장한다.
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586
아래 명령어를 실행하여 현재 파라미서 설정값으로 변경한다.
/sbin/sysctl -p
/etc/security/limits.conf 파일에 아래 내용을 추가한다.
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  1024
oracle              hard    nofile  65536
/etc/pam.d/login 파일에 아래 내용을 추가한다.
session    required     pam_limits.so
/etc/selinux/config 파일을 수정하여 SELinux를 Disable한다.
SELINUX=disabled
아래와 같이 해서 Firewall 을 멈추고, ntsysv 를 실행하여 iptables 에 언체크해둔다.
/etc/init.d/iptables stop 

셋업

아래 패키지를 설치한다. (From Enterprise Linux 5 DVD)
# cd /media/cdrom/Server
# rpm -Uvh binutils-2.*
# rpm -Uvh compat-libstdc++-33*
# rpm -Uvh elfutils-libelf*
# rpm -Uvh gcc-4.*
# rpm -Uvh gcc-c++-4.*
# rpm -Uvh glibc-2.*
# rpm -Uvh glibc-common-2.*
# rpm -Uvh glibc-devel-2.*
# rpm -Uvh glibc-headers-2.*
# rpm -Uvh ksh*
# rpm -Uvh libaio-0.*
# rpm -Uvh libaio-devel-0.*
# rpm -Uvh libgomp-4.*
# rpm -Uvh libgcc-4.*
# rpm -Uvh libstdc++-4.*
# rpm -Uvh libstdc++-devel-4.*
# rpm -Uvh make-3.*
# rpm -Uvh sysstat-7.*
# rpm -Uvh unixODBC-2.*
# rpm -Uvh unixODBC-devel-2.*
# rpm -Uvh pdksh*
# cd /
# eject
또는, yum 을 이용해서 자동으로 다운로드 받아서 설치한다.
# yum install binutils-2* compat-libstdc++-33* elfutils-libelf* gcc-4.* gcc-c++-4.* glibc-2.* glibc-common-2.* glibc-devel-2.* glibc-headers-2.* ksh* libaio-0.* libaio-devel-0.* libgomp-4.* libgcc-4.* libstdc++-4.* libstdc++-devel-4.* make-3.* sysstat-7.* unixODBC-2.* unixODBC-devel-2.* pdksh*
새로운 그룹과 사용자를 생성한다.
# groupadd oinstall
# groupadd dba
# groupadd oper
# groupadd asmadmin

# useradd -g oinstall -G dba,oper,asmadmin oracle
# passwd oracle
오라클을 설치할 디렉토리를 생성한다.
# mkdir -p /u01/app/oracle/product/11.2.0/db_1
# chown -R oracle:oinstall /u01
# chmod -R 775 /u01
oracle 사용자로 로그인하여 .bash_profile 파일에 아래 내용을 추가한다.
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=db1.localdomain; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=DB11G; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

파일 풀기

oracle 사용자로 로그인하여 unzip 으로 파일을 푼다.
# unzip linux_11gR2_database_1of2.zip
# unzip linux_11gR2_database_2of2.zip
파일을 풀면 database 라는 디렉토리가 생성된다. 이 안에 설치 파일들이 존재한다.

설치

Cygwin/X 등의 X서버 환경에서 아래와 같이 oracle 사용자로 로그인한다.
# ssh -Y oracle@오라클설치서버
database 디렉토리에서 아래 명령어를 입력하여 Oracle Universal Installer (OUI)를 실행한다.
$ ./runInstaller
설치순서는 아래와 같다.
  1. Configure Security Updates
  2. Select Install Option
  3. System Class
  4. Node Selection
  5. Select Install Type
  6. Typical Install Configuration
  7. Create Inventory
  8. Perform Prerequisite Checks
  9. Summary
  10. Install Product
  11. Database Configuration Assistant
  12. Database Configuration Assistant 2
  13. Execute Configuration Scripts
  14. Finish

설치후 작업

/etc/oratab 파일을 수정한다.
DB11G:/u01/app/oracle/product/11.2.0/db_1:Y
이로써 설치작업이 완료되었다. https://서버주소:1158/em/ 으로 접속해보자. 로그인 화면이 나오면 정상.

2009-12-17

브랜드별 DSLR 특징

각 카메라 브랜드별 특징을 정리해보았습니다. 완전히 주관적인 느낌을 적었으므로 그냥 참고만 하셔요. 카메라를 새롭게 시작하시는 분이라면 약간은 도움이 될 거에요. 다들 장단점이 있고 특징이 다르므로 자신에 맞는 카메라를 고를 수 있는 안목이 필요하지요.

1. 삼성/펜탁스
최최의 SLR을 만들었고, 작고 가벼운 카메라를 잘 만드는 편이다. 보급기에도 중급기와의 차별을 위해서 필수(?) 기능을 없애지 않는다. 중고는 상당히 저렴한 편이어서, 초심자가 부담없이 시작하기에 좋다. 붉은색 표현이 진득하게 잘 표현이 되어 좋아한다. GX-20(K20D) 부터는 고화소의 상당한 화질 향상으로 큰 만족감을 주고있다. 다만, 약간 어두운 곳에서 AF 성능이 딸리다는 문제점이 오랫도록 방치되어 왔다. 최근 K-7 이 나오면서부터 AF 문제가 어느정도 해소되었고, 연사등의 성능도 눈에 띌 정도로 향상되었다. 현재 펜탁스를 인수한 호야에서 다시 펜탁스를 분리시킬 계획이 있으며, 한동안 협력 관계였던 삼성도 독자 모델을 출시하려는 분위기여서 앞으로의 향방이 불투명한 상태이다. 또한, 정식 펜탁스코리아가 없고,AS도 아직은 불편하다. 35mm 센서를 장착한 카메라가 없는 것도 아쉬운 점이다. 펜탁스클럽, 펜탁스포럼, 삼성DSLR 등의 커뮤니티 사이트가 타사 브랜드보다도 더 활발하게 운영되고 있다.

2. 니콘
"남자는 니콘", "검은 야생마" 등의 수식어를 동반하고 있는 국내 2위 업체이다. 기계적인 성능은 누구나 인정할 정도로 우수하다. 연사도 빠르고, AF 정확도도 최고로 인정받고 있다. 기기 성능이 너무 좋다보니 사진가가 사진을 찍는 것이 아니고 카메라가 사진을 찍는 것처럼 느껴질 정도이다. 써드파티를 포함한 렌즈가 상당히 많아서 골라 장착하는 재미가 있다. 가장 치명적인 한가지 단점이라면 JPEG 저채도 현상(그레이 캐스트), 오토화벨이 잘 맞지 않는다는 것 등이 있다. 이런 검은야생마를 잘 길들이면 좋은 품질의 사진을 뽑을 수 있다고 하는데, 보통의 취미 사진가에게는 어려운 부분일 듯 하다.

3. 캐논
국내 1위 업체이다. 인물사진에 좋다고 평이 나 있으며, 특히 여성에게 인기있다고 한다. 역시 풍부한 렌즈군을 가지고 있으며, 많은 사람들이 사용하기에 무난한 브랜드라고 할 수 있다. 성능도 어느정도 니콘과 비슷하게 괜찮고, 스튜디오, 스포츠 등 다양한 분야에서 쓰이고 있다. 캐논의 가장 큰 단점이라면 구라핀을 들 수 있다.

4. 올림푸스
포서드 라고 하는 새로운 포맷의 센서를 장착하고 있다. 가로, 세로 비율이 4:3 이며, 타사 카메라 센서보다 작다. 아무래도 센서가 작다 보니, 아웃포커싱과 노이즈에 약하다. 광각에 불리한 면이 있으며 반면 망원에 강하다고 한다. E-420 + 이오팬 조합은 가장 작고 가벼운 DSLR 사용할 수 있도록 하여, 일상 스냅사진을 위한 최상의 조건을 제공한다. 화이트밸런스도 잘 맞는 편이며, 색감도 인물,풍경등 모든 부분에서 좋은 평을 얻고 있다. E-3(E-30) 의 경우에는 최고의 AF를 자랑한다. 가장 큰 단점은 밝은 렌즈가 거의 없으며, 서드파티도 시그마 일부 제품만 지원되어, 렌즈 선택이 너무 제한적이다. 그렇지만, 가후가 상당히 심한 편이어서 E-420 신품이 30만원 정도 하며, 다른 모델 중고품도 엄청 저렴한 편이어서, 역시 초심자가 접근하기 괜찮은 바디이기도 하다.

5. 소니
올해 가장 선방했던 업체이다. 일본에서는 4위로 펜탁스에 밀리지만, 국내에서는 3위로 껑충 뛰었다. 짧은 시간동안 다양한 제품을 쏟아냈으며, 최고의 단점이었던 고감도 노이즈도 A550 부터는 극복하였다. 만족스러운 색감을 가지고 있으며, 앞으로도 좀더 얼마나 발전할지 지켜볼만한 브랜드이다.

6. 후지
니콘 마운트의 S5pro를 생산하고 있으며, 아마도 후지의 마지막 DSLR 이 될 것같다. 니콘 카메라의 최대 단점인 색감을 완전히 극복하여 최고의 사진을 선사하는 DSLR을 만들어내고 있다. S5pro 의 색감이란.. 모두들 경험해보고 싶어하는 꿈이라고 해야 할까... D200 을 기본으로 하여 만들어서 성능이 괜찮은 편이지만, 배터리가 그리 오리 가지 못한다는 단점이 있다고 한다. 리뷰 속도도 느린편이며, 재부팅하면 처음부터 다시 리뷰를 해야 한다는 문제도 있다고 한다.

2009-12-15

Visual Studio 2008 에서 zlib Win32 Static Library 생성하기


유명한 압축포맷인 GZIP을 만들고, 풀기 위한 라이브러리를 사용하기 위하여 소스를 다운로드 받아서 라이브러리로 만드는 방법을 정리해보았습니다. 실제 이용법도 조만간 정리해서 올리겠습니다. ^^


  1. http://www.zlib.net/ 에서 zlib123.zip 파일을 다운로드 받아서, C:\Project\zlib123 에 파일들을 풀어 놓는다.
  2. 새로운 Static Library 프로젝트 생성하기
    • File 메뉴로부터, New를 선택하고, Project… 를 선택한다.
    • Project types 패널에서, Visual C++ 밑의 Win32를 선택한다.
    • Templates 패널에서, Win32 Console Application을 선택한다.
    • 프로젝트를 위한 이름(zlib)을 입력한다.
    • 솔루션 이름은 입력하지 않는다.
    • Location 은 C:\Project 로 설정한다.
    • 이제 OK 버튼을 누른다. Win32 Application Wizard 다이얼로그 박스의 Overview 페이지가 나오며, Next 버튼을 누른다.
    • Win32 Application Wizard 의 Application Settings 화면이 나오며, Application type 에서 Static library를 선택한다.
    • Win32 Application Wizard 의 Application Settings 화면에서, Additional options 에서 Precompiled header 를 언체크 한다.
    • 프로젝트를 생성하기 위해 Finish 버튼을 클릭한다.
  3. Solution Explorer 에서 Header Files → 오른쪽 버튼 → Add → Existing Item… 을 선택하여, C:\Project\zlib123 에 있는 모든 헤더파일을 선택하여 추가한다.
  4. Solution Explorer 에서 Source Files → 오른쪽 버튼 → Add → Existing Item… 을 선택하여, C:\Project\zlib123 에 있는 모든 C파일(example.c, minigzip.c 제외)을 선택하여 추가한다.
  5. 마지막으로, F7 (Build Solution) 을 눌러서 빌드를 실행하면, Debug 또는 Release 디렉토리에 zlib.lib 를 확인할 수 있다.

2009-12-14

네 멋대로 찍어라


제목을 보면 알겠지만, 사진을 찍을때 너무 형식에 얽매이지 말라고 당부하고 있습니다. 무거운 카메라로 힘들게 하여 장록에 처박아 두지 말고, 똑딱이처럼 가볍고 쉽게 찍을 수 있는 것으로 언제든지 찍을 수 있도록 하라고 합니다. 요즘엔 디지털 카메라를 많이 사용하니 필름값도 들지 않으므로 될 수 있는데로 다양한 각도, 다양한 거리, 다양한 노출로 찍으라고도 합니다. 브라케팅을 활용하라는 뜻이죠. 또한, 대상에 좀더 다가가서 찍으라고도 합니다. 저도 35mm 단렌즈로 찍을때에는 제대로 찍기위해서 어쩔수 없이 다가갈 수밖에 없더군요.

결론적으로, 처음에는 사진을 잘 찍으려면 크고 복잡하고 성능이 좋고 무거운 카메라보다는 작고 단촐한 사진기가 제격일 것 같네요. 저도 다양한 카메라를 사용해보다가 다버리고, 결국에는 Pentax K100D 에 18-55 번들로 최종 구성을 마쳐버렸는걸요. 이런 취지라면 올림푸스의 PEN 도 괜찮을듯 합니다.

사진을 이제 막 시작한 분들에게 추천합니다.

2009-12-11

쿠키폰(김태희폰) 영입


시대의 흐름에 맞추어 터치폰을 마련했습니다. 이번에도 당연히 번호이동으로 무료폰으로 한 것이지요. 따지고 보면 완전무료는 아닙니다. 다다음달 1일까지 오즈무한요금 6,000원 짜리를 사용해야하기 때문이지요. 그래도 이정도면 상당히 저렴한 거죠.

디자인은 상당히 만족스럽습니다. 슬림하고 태희처럼 센스도 있게 보입니다. 색도 짙은 브라운이라 고급스러워 보이지요. 터치감도 그런대로 괜찮습니다. 기능은 일반 핸드폰과 같고, 전에는 없었던 지상파 DMB가 됩니다. 안테나가 내장되어 있어서 편하네요. 특히, Outlook 일정, 주소록과도 연계되어 싱크되는 점이 유용할 것 같습니다. 또, 텍스트 뷰어도 내장되어 있어서 간이 E-Book 으로 쓰기에도 좋습니다. 기본 내장 배경화면과 소리파일들도 아주 좋습니다. 핸드폰을 여러번 바꾸어보았지만 이번에 가장 만족스럽네요. *^^*

아이폰 같은 스마트폰은 어떤 이유를 댄다해도 그다지 메리트가 없습니다. 이쁘고 신기해보이는 것 외에는 그다지 쓸모가 없지요. 요금을 포함한 가격이 너무 비싸지요. 1~2년 뒤에나 일반 터치폰처럼 아주 저렴한 가격으로 나오면 그때나 알아봐야겠습니다.

피아노 연습


이번주에는 연말 성과 관련 작업으로 바쁘게 보내다가 어제 겨우 일찍 퇴근해서 피아노는 연습을 했습니다. 같은 부서 차장님에게 빌려온 야마하 키보드로 연습을 했지요.

적당한 자리가 없어서 바닥에 놓고 했는데, 자세가 좋지 않다보니 금방 손이 아프더군요. 그리고, 아무래도 타건감이 좋지 않아서 실제 피아노를 치게 되면 문제가 있습니다. 전자키보드는 키 하나에 단순히 하나의 음만 나오게 되고, 살짝 치곤 세게 치건 똑같은 소리가 나옵니다. 그런데 진짜 피아노는 그렇지 않지요. 건반도 무게감이 있고 힘있게 치느냐 살짝 치느냐에 따라서 음의 느낌도 달라집니다.

제대로 된 전자피아노를 사고 싶은 생각이 팍팍~ 듭니다. 아직 모델을 정하지 못했는데, 이번 주말에 아차산역에 있는 아이캔피아노라는 매장에 가서 직접 보려구요. 집에서도 가깝고 사이트에 가보니 가격도 저렴한 편인 것 같아요.

요즘 네이버 디피카페에서 다이나톤 공구중인데 가격과 AS기간에 매리트가 있더군요. 20일까지 주문이던데... 몇가지 해결해야 될 문제가 있어서 아쉽지만 그때까지는 구입하지 못 할 것 같습니다.

2009-11-27

니콘 카메라


예전에 D300 을 구입해서 사용하다가 기변을 했었습니다. D300 의 색감과 무게 때문이었지요. 처음 사용한 기종이 Samsung GX-1S 였는데, 색감은 그런데로 괜찮았거든요. 그런데 D300은 아무리 픽쳐콘트롤을 변경하여도 전혀 마음에 들지 않는 색만 보여주었습니다. 그러다가, 올림푸스도 사용해보고, 다시 팬탁스 K100D를 사용하고 있지요.


오늘 어쩌다가 SLRCLUB 의 니콘 포럼을 들어가서 사진들을 보았는데, 이상하게도 대부분 사진들이 괜찮게 나오더군요. JPG로 리사이즈만 한 사진들이 전혀 색감이 이상하지 않고 잘 나오더라는 것입니다. 보통 D300을 야생마 같은 카메라라고 표현합니다. 처음에는 힘들지만 기기에 적응이 되면 더욱 좋은 사진을 뽑을 수 있다는 거죠. 더군다나, 입문기인 D3000 의 경우는 Auto화밸로도 괜찮은 색감을 보여주고 있습니다. 완전히 예상 밖이었습니다. 결국, 제가 노력이 부족해서 D300을 제것으로 만들지 못한 것이었습니다.

이 참에 다시 니콘으로 도전을 해볼까 생각중입니다. 기종은 D90. 저에게는 최적의 크기와 무게를 가지고 있습니다. 기능 또한 타사의 왠만한 중급기에 필적하지요. 원래는 내년 1월쯤에 캐논 50D를 구입하려고 마음 먹고 있었습니다. 이제 다시 50D 대신 D90을 구입하려고 합니다. 그런데, 요즘 피아노를 배우기 시작해서 디지털피아노를 구입해야 해서, D90은 약간 미루어서 4월쯤에나 생각해야겠어요. ^^; 어쩌면 그냥 확 지를지도 모릅니다.

2009-11-23

성인을 위한 피아노 어드벤쳐



결국 피아노 레슨까지 받기로 했습니다. 이렇게 되면, 피아노도 한대 구입해야겠네요. 그리고, 지난번에 바이엘 교본은 당분간 미루어두어야 겠어요. 레슨 선생님이 진행하는 교재가 "성인을 위한 피아노 어디벤처"이기 때문이지요. 잠깐 서점에서 봤을때 구성이 꽤 괜찮았던 것 같아요. 오늘 아침에 주문해서 저녁에 수영 다녀오니 도착해 있네요. 여기에 "나의 첫번째 스케일북"을 동시에 진행한다고 합니다. 이 책은 손가락 기술을 연마하는데 집중한다고 합니다. 이번주 토요일에 첫 레슨이 있는데 무척이나 기대됩니다. 레슨 선생님이 무척 이쁘고 얘기도 잘 통해서 잘 배울 수 있을 것 같네요. *^^*

2009-11-17

바이엘 피아노 교본 (BEYER, VORSCHULE IM KLAVIERSPIEL Op. 101)




저에게 이런 날도 오게 되는군요. 악기를 하나 정해서 연주하고 싶은데 어떤 악기가 좋을까 고민을 많이 했습니다. 그런데, 음악에 대한 지식과 경험은 너무나도 빈약합니다. 처음에는 플룻, 오카리나, 클라리넷 등을 고민해보았습니다. 플룻은 소리를 내는 것부터 고통이더군요. 오카리나는 왠지 멋이 없구요. 클라리넷은 괜찮긴 할 것 같지만 왠지 다가가기가 쉽지 않았습니다. 아무것도 모르는 상태인 저에게는 가장 기본이 되는 악기가 필요했습니다. 결국에는 리코더까지도 생각해내었지요. 관악기의 경우 운지법이 존재하고 각 음역의 소리를 내려면 한정된 구멍을 다양한 조합으로 소리를 내야 했습니다. 음악을 도무지 이해할 수 없는 저에게는 어려운 일이었지요.

그렇다면 그런 조합이 없이 모든 음을 낼 수 있는 악기가 무엇인가 생각해보니, 피아노였습니다. 단지 피아노는 규모가 있기에 휴대하기는 어려워서 아예 생각을 하지 못했던 것이지요. 그리고 악기 연습을 할때 소리로 인해서 주변 사람들에게 피해를 줄 수 있었는데, 피아노는 디지털로 마련한다면 헤드셋으로 혼자서만 들으며 연습할 수 있는 장점도 있습니다. 이런 이유로 피아노를 배우기로 했습니다. 일단 지인으로부터 야마하 전자키보드를 빌리기로 했습니다. 디지털피아노보다는 건반수도 적고 건반을 누르는 감도 그다지 좋지 않지만, 취미로 배우는 저로서는 충분히 좋은 물건입니다.

이제 피아노도 마련이 되었으니, 어떤 과정을 통해서 배우느냐가 관건인데, 일반적인 과정을 살펴보니, 바이엘 → 체르니100 → 체르니30 → 체르니40 등의 순서로 배운다고 합니다. 바이엘이 가장 기초적인 과정이고 체르니는 기본적인 테크닉을 연습하는 과정이라고 합니다. 그렇다면 바이엘을 배우는 것이 첫번째라고 하니 교재가 필요하겠지요. 서점에 가서 보니 아주 다양한 바이엘 책들이 있었는데, 다들 어린이를 위해서 큼직 큼직하게 새로 편찬한 것들이더라구요. 그런 것들 보다는 원문에 충실하게 되어 있는 책이 없을까 찾아보니 위에 있는 책이 바로 그것이었습니다. 아무래도 원문으로 되어 있는 것이 레슨을 받을때에도 참고하기 좋을듯 해서 말이지요. 책의 내용이야 여러세월동안 검증된 것이니 고민할 필요가 없지요. 책 가격도 오프라인에서 4,000원으로 저렴하게 구입했습니다.

레슨은 동영상 강의를 통해서 독학을 하려고 합니다. 바이엘을 마치고 체르니를 진행할때에는 선생님을 통해서 레슨을 받는 것도 괜찮을것 같고요. 멋진 연주를 할 수 있을때까지 즐겁게 배우고 싶습니다. *^^* 혹시 조언을 해주실 분이 있다면 더 좋겠네요~

2009-11-16

세상을 가지고 노는 힘, 유머력



요즘 경제도 좋지않고 사회도 많이 어두워지고 있는 것 같습니다. 좌절하는 사람들도 많고 화를 내는 사람들도 많아졌어요. 저 또한 이런 저런 일들로 인해서 표정이 어두워지는 느낌이 듭니다. 이럴때일수록 즐거운 마음을 가지고 생활하는 것이 필요할 거에요. 항상 즐겁고 행복한 생각들로 가득찬 생각을 하면서 말이죠. 매일 유머 하나씩 생각해서 사람들에게 이야기해주기를 실천해보면 어떨까요? 이런 점에 이 책이 무척 마음에 듭니다. 특히 책 지은이(최규상) 사이트를 운영하면서 메일링도 보내주고 있습니다. 이 메일들이라도 보면서 다른 분들도 즐거운 마음을 가지길 빕니다.

2009-11-12

Tomcat 6 + Struts 2 + iBATIS 2 + PostgreSQL 8.3 설정하기

WindowsXP 환경에서 설치하는 것으로 하였고, JDK는 1.6이 설치되어 있다고 가정합니다.
먼저 각 프로그램, 라이브러리들을 해당 사이트에서 다운로드 합니다.
이제, Tocmat 6 와 PostgreSQL 8.3 을 설치한다. 어렵지 않게 설치가 될 것이다. Tomcat 6의 설치위치는 C:\Program Files\Apache Software Foundation\Tomcat 6.0 이며,
PostgreSQL 8.3 의 설치위치는 C:\Program Files\PostgreSQL\8.3 가 될 것이다.
웹어플리케이션을 위한 디렉토리(C:\Workspace\Project)를 생성한다.
Project 디렉토리 밑에는 src, WebContent 디렉토리도 생성한다.
당연히도, WebContent 디렉토리 밑에는 WEB-INF 디렉토리도 생성한다.
최종 디렉토리,파일의 전체 모습은 다음과 같다.

C:\Workspace\Project
                    \src
                        struts.xml
                        SqlMapConfig.xml
                        SqlMap_Admin.xml
                        \com
                             \test
                                  \action
                                         ListAdmin.java
                                  \dao
                                      AdminDao.java
                                  \model
                                        Admin.java
                                  \util
                                       SqlMapLocator.java
                    \WebContent
                               helloWorld.jsp
                               \admin
                                     listAdmin.jsp
                               \WEB-INF
                                       web.xml
                                       \lib
                                           commons-logging-1.0.4.jar
                                           freemarker-2.3.8.jar
                                           ibatis-2.3.4.726.jar
                                           ognl-2.6.11.jar
                                           struts2-core-2.0.14.jar
                                           xwork-2.0.7.jar
                                       \classes
                                               struts.xml
                                               SqlMapConfig.xml
                                               SqlMap_Admin.xml
                                               \com
                                                   \test
                                                        \action
                                                               ListAdmin.class
                                                        \dao
                                                            AdminDao.class
                                                        \model
                                                              Admin.class
                                                        \util
                                                            SqlMapLocator.class

이제 다운로드한 iBATIS 와 Struts2 파일을 압축풀고, 필요한 파일을 C:\Workspace\Project\WebContent\WEB-INF\lib 에 복사한다.
iBATIS 에서는 ibatis-2.3.4.726.jar 만 복사하면 되고, Struts2 에서는 commons-logging-1.0.4.jar, freemarker-2.3.8.jar, ognl-2.6.11.jar, struts2-core-2.0.14.jar, xwork-2.0.7.jar 을 복사한다.
그리고, PostgreSQL JDBC 드라이버는 C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib 에 복사해둔다.
이로써 필요한 프로그램 설치는 완료되었다.
원활한 테스트를 위해서 도메인 설정을 하자. C:\WINDOWS\system32\drivers\etc\hosts 파일을 열어서 아래 내용을 추가한다. 앞으로 test.com 을 웹브라우저에 입력하며 테스트할 것이다.

127.0.0.1       test.com

Tomcat 6 의 server.xml 을 설정해보자. 이 파일은 C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf 에 존재한다. 우선 67째 라인에 아래 내용을 찾아서 port를 8080에서 80으로 변경한다.

...
    <Connector port="80" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
...

그리고, 맨 밑부분에 닫힌 Host 태그를 찾아서 그 밑에 아래와 같이 버추얼호스팅 설정을 입력한다.

...
      <!-- test.com -->
      <Host name="test.com" debug="0" appBase="" unpackWARs="true" autoDeploy="true">
        <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="test.com_" suffix=".log" timestamp="true"/>
        <Context path="" docBase="C:\Wrokspace\Project\WebContent" debug="0">
          <Resources className="org.apache.naming.resources.FileDirContext" allowLinking="true" />
          <Resource name="jdbc/TestDB"
                    auth="Container"
                    type="javax.sql.DataSource"
                    driverClassName="org.postgresql.Driver"
                    loginTimeout="10"
                    maxWait="5000"
                    username="아이디"
                    password="비밀번호"
                    testOnBorrow="true"
                    url="jdbc:postgresql://127.0.0.1/디비이름" />
        </Context>
      </Host>
...

위의 내용중 아이디, 비밀번호, 디비이름은 PostgreSQL 에서 사용할 적당한 것으로 정하면 된다. 아직은 DB 생성도, 사용자 생성도 하지 않았으니 상관은 없다.
이제 C:\Wrokspace\Project\WebContent에 hellowWorld.jsp 를 작성해서 웹페이지가 잘 열리는지 확인해 볼 차례이다.

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hello, World</title>
</head>
<body>
<h1>잘 보이십니까?</h1>
</body>
</html>

Tomcat6를 실행한후, 웹브라우저에서 http://test.com/ 을 입력해서 내용이 잘 보이면 성공!
이제, DB 생성, 사용자 생성, 테이블 생성을 해보겠습니다.
첫번째로 DB/사용자 생성을 합니다. 시작 → 프로그램 → PostgreSQL 8.3 → SQL Shell (psql) 메뉴를 선택하고 아래와 같이 입력합니다.

Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
postgres 사용자의 비밀번호: <설치시에 입력했던 비밀번호>
이것은 PostgreSQL의 대화식 터미널 psql 입니다. 버전: psql 8.3.8

사용법:  \copyright 저작권 정보
         \h SQL 명령어 도움말
         \? 내장 명령어 도움말
         \g 또는 명령 끝에 ; 쿼리 실행
         \q 마침

postgres=# create user garachi with password 'Rnadmsdlfndjwlsek';
CREATE ROLE
postgres=# create database garachidb with encoding='utf-8' owner garachi;
WARNING:  could not determine encoding for locale "Korean_Korea.949": codeset is
 "CP949"
상세정보:  Please report this to <pgsql-bugs@postgresql.org>.
CREATE DATABASE
postgres=# \q

아이디/비밀번호를 통해서 로그인할 수 있도록 하려면 별도로 설정을해야 합니다.
C:\Program Files\PostgreSQL\8.3\data 디렉토리의 pg_hba.conf 파일을 열어서 아래와 같이 설정하고, PostgreSQL을 재시작 합니다.

host    all         all         0.0.0.0           0.0.0.0           password
local   all         postgres                                        trust
local   all         all                                             password

다시 SQL Shell (psql)을 실행하여 아래와 같이 입력하여 테스트용 테이블을 생성한다.

Server [localhost]:
Database [postgres]: <디비이름>
Port [5432]:
Username [postgres]: <아이디>
아이디 사용자의 비밀번호: <비밀번호>
이것은 PostgreSQL의 대화식 터미널 psql 입니다. 버전: psql 8.3.8

사용법:  \copyright 저작권 정보
         \h SQL 명령어 도움말
         \? 내장 명령어 도움말
         \g 또는 명령 끝에 ; 쿼리 실행
         \q 마침

garachidb=> 
CREATE TABLE tb_admin
(
  id serial NOT NULL,
  "login" character varying(20) NOT NULL,
  passwd character varying(20) NOT NULL,
  "name" character varying(20) NOT NULL,
  register_date date NOT NULL,
  login_datetime timestamp without time zone,
  status_code character varying(4),
  email character varying(40),
  mobile_phone character varying(20),
  CONSTRAINT tb_admin_pkey PRIMARY KEY (id),
  CONSTRAINT tb_admin_login_key UNIQUE (login)
)
WITH (
  OIDS=FALSE
);

insert into tb_admin(login, passwd, name, register_date, status_code, email, mobile_phone)
values('yahoo', 'yahoo123', 'YAHOO...', '2009-11-11', '0000', 'yahoo@yahoo.com', '010-1111-2222');

insert into tb_admin(login, passwd, name, register_date, status_code, email, mobile_phone)
values('google', 'google123', 'GOOGLE...', '2009-11-11', '0000', 'google@gmail.com', '010-3333-4444');

해당 웹어플리케이션에서 스트럿츠를 사용할 수 있도록 web.xml 을 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>TEST</display-name>
 
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
  </filter>
 
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

struts.xml 을 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
  <package name="Test" extends="struts-default" namespace="/admin">
    <action name="ListAdmin" class="com.test.action.ListAdmin">
      <result name="success">/admin/listAdmin.jsp</result>
    </action>
  </package>
</struts>

이것은 웹브라우저에서 http://test.com/admin/ListAdmin.action 를 입력하면 /admin/listAdmin.jsp 를 보여주겠다는 의미를 가지고 있다.
Admin.java 를 아래와 같이 작성한다. 위에서 생성한 tb_admin 테이블에 대한 모델 클래스이다.

package com.test.model;
 
import java.util.Date;
 
public class Admin {
 private int  id;
 private String  login;
 private String  passwd;
 private String  name;
 private Date  register_date;
 private Date  login_datetime;
 private String  status_code;
 private String  email;
 private String  mobile_phone;
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getLogin() {
  return login;
 }
 public void setLogin(String login) {
  this.login = login;
 }
 public String getPasswd() {
  return passwd;
 }
 public void setPasswd(String passwd) {
  this.passwd = passwd;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Date getRegister_date() {
  return register_date;
 }
 public void setRegister_date(Date registerDate) {
  register_date = registerDate;
 }
 public Date getLogin_datetime() {
  return login_datetime;
 }
 public void setLogin_datetime(Date loginDatetime) {
  login_datetime = loginDatetime;
 }
 public String getStatus_code() {
  return status_code;
 }
 public void setStatus_code(String statusCode) {
  status_code = statusCode;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getMobile_phone() {
  return mobile_phone;
 }
 public void setMobile_phone(String mobilePhone) {
  mobile_phone = mobilePhone;
 }
}

iBATIS는 라이브러리파일과, SqlMapConfig.xml, SqlMap.xml 로 구성이 되며, 라이브러리 파일은 위에서 lib 에 복사를 해두었다.
여기에서는 SqlMapConfig.xml 파일을 읽어서 SQL Map 을 얻어오는 클래스를 작성하게 된다.
SqlMapLocator.java 를 아래와 같이 작성한다.

package com.test.util;
 
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
 
public class SqlMapLocator {
 public static SqlMapClient getMapper() {
  SqlMapClient sqlMapper;
  try {
   Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
   sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
   reader.close();
  }catch(IOException e) {
   // Fail fast.
   throw new RuntimeException("Something bad happend while building the SqlMapClient instance." + e, e);
  }
 
  return sqlMapper;
 }
}

SqlMapConfig.xml 을 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
 PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 
<sqlMapConfig>
  <transactionManager type="JDBC" commitRequired="false">
    <dataSource type="JNDI">
      <property name="DataSource" value="java:/comp/env/jdbc/TestDB"/>
    </dataSource>
  </transactionManager>
  <sqlMap resource="SqlMap_Admin.xml" />
</sqlMapConfig>

그리고, SqlMap_Admin.xml 을 아래와 같이 작성한다. 테스트를 위한 tb_admin 테이블의 모든 레코드를 Select 하는 문장만 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
 PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">
 
<sqlMap>
  <typeAlias alias="Admin" type="com.test.model.Admin"/>
  <select id="AdminList" resultClass="Admin">
    SELECT id, login, passwd, name, register_date, login_datetime, status_code, email, mobile_phone
    FROM tb_admin
  </select>
</sqlMap>
</xml>

AdminDao.java 를 아래와 같이 작성한다.

package com.test.dao;
 
import java.sql.SQLException;
import java.util.List;
 
import com.test.model.Admin;
import com.test.util.SqlMapLocator;
 
public class AdminDao {
 private static AdminDao singleton;
 
 private AdminDao() {}
 
 public static AdminDao getInstance() {
  if(singleton == null)
   singleton = new AdminDao();
  return singleton;
 }
 
 @SuppressWarnings("unchecked")
 public List<Admin> list() throws SQLException {
  List<Admin> list = (List<Admin>)SqlMapLocator.getMapper().queryForList("AdminList");
  return list;
 }
}

ListAdmin.java 를 아래와 같이 작성한다.

package com.test.action;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import com.test.dao.AdminDao;
import com.test.model.Admin;
import com.opensymphony.xwork2.ActionSupport;
 
public class ListAdmin extends ActionSupport {
 private static final long serialVersionUID = 1L;
 private String message = "Hello~!";
 private AdminDao dao;
 private List<Admin> list = new ArrayList<Admin>();
 
 public String getMessage() {
  return message;
 }
 
 public void setMessage(String message) {
  this.message = message;
 }
 
 public ListAdmin() throws IOException {
  dao = AdminDao.getInstance();
 }
 
 public String execute() throws Exception {
  list = dao.list();
  return SUCCESS;
 }
 
 public List<Admin> getList() {
  return list;
 }
 
 public void setList(List<Admin> list) {
  this.list = list;
 }
}

마지막으로, listAdmin.jsp 를 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>관리자</title>
</head>
<body>
<s:if test="list.size() <= 0"> 데이터가 없네요. ^^;</s:if>
<h1>관리자 목록</h1>
<table border="1" width="100%">
<tr>
  <th>번호</th>
  <th>아이디</th>
  <th>비밀번호</th>
  <th>이름</th>
  <th>등록일자</th>
  <th>로그인일시</th>
  <th>상태코드</th>
  <th>이메일</th>
  <th>핸드폰</th>
</tr>
<s:iterator value="list">
<tr>
  <td><s:property value="id"/></td> 
  <td><s:property value="login"/></td>
  <td><s:property value="passwd"/></td>
  <td><s:property value="name"/></td>
  <td><s:property value="register_date"/></td>
  <td><s:property value="login_datetime"/></td>
  <td><s:property value="status_code"/></td>
  <td><s:property value="email"/></td>
  <td><s:property value="mobile_phone"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>

드디어 웹브라우저에서 http://test.com/admin/ListAdmin.action 을 입력하면 테이블에 입력되었던 데이터를 볼 수 있을 것이다.