cron 시스템

Programming/linux 2007.11.28 11:09
1. cron 시스템
ㅇ cron 시스템이란?

- 특정 작업을 정해진 시간에 주기적이고 반복적으로 실행하기 위한 데몬과 그 설정들
- cron시스템에는 시스템에서 기본적으로 사용하는 cron설정이 있으며, 이를 시스템크론이라고 함.
- cron시스템에는 root나 일반사용자가 자신의 cron설정을 직접하여 사용하는 사용자크론이 있음.

ㅇ cron에 관한 데몬과 파일들
- cron데몬파일 : /usr/sbin/crond
- cron데몬의 시작/종료/재시작 : /etc/rc.d/init.d/crond start/stop/restart
- crond 실행확인 : ps –ef | grep crond
- cron설정파일 : /etc/crontab
- 시스템크론 설정디렉토리 : /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly
- 사용자크론 설정파일 : /var/spool/cron/* (사용자계정명과 동일한 파일명으로 존재함.)
- 사용자크론설정 명령어 : /usr/bin/crontab
- cron실행내용 기록되는 로그파일 : /var/log/cron
*참고 : atd에 의한 수행내역은 /var/log/messages에 기록됨.

사용자 삽입 이미지

2. cron의 실행주기 설정형식과 방법

ㅇ 시스템 cron설정의 예 (/etc/crontab파일의 일 부분)

[root@edu anacron]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@edu anacron]#

ㅇ 사용자 cron설정의 예 (root의 cron설정 예)

[root@edu anacron]# crontab -l
00 01 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/hwclock -w
00 03 * * * su - root '/root/backup.sh' >& /dev/null
00 08 * * * su - root '/root/check_of_system.sh' > /root/COS_result
[root@edu anacron]#

ㅇ 각 필드의 의미
사용자 삽입 이미지

ㅇ 참고1 : * 기호 : 각 필드자리에 * 기호가 오면 해당 필드의 모든 값을 의미함.
- 두번째 필드에 *가 오면 매시, 세번째 필드의 *는 매일, 네번째 필드의 *는 매월을 각각 의미함.
ㅇ 참고2 : - 기호 : 그 사이의 모든 값을 의미함.
- 예) 두번째 필드의 “5-9”는 5시,6시,7시,8시,9시를 의미함.
- 예) 세번째 필드에 “1-5”는 1일,2일,3일,4일,5일을 의미함.
ㅇ 참고3 : ,(콤마)기호 : 지정한 모든 값을 의미함.(불규칙적인 값 지정시 사용)
- 예) 두번째 필드에 “1,3,4,7,8”는 1시,3시,4시,7시,8시를 의미함.
- 예) 세번째 필드에 “1,5,20”는 1일, 5일, 20일을 의미함.

3. 시스템 cron의 이해와 활용

[root@edu /]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@edu /]#
[root@edu /]# ls -l /etc/cron.hourly/
total 0
[root@edu /]#
[root@edu /]# ls -l /etc/cron.daily/
lrwxrwxrwx 1 root root 28 Jan 23 01:30 00-logwatch -> ../log.d/scripts/logwatch.pl
-rwxr-xr-x 1 root root 135 Mar 4 2005 00webalizer
-rwxr-xr-x 1 root root 276 Mar 17 2005 0anacron
-rwxr-xr-x 1 root root 180 Apr 1 2005 logrotate
-rwxr-xr-x 1 root root 104 May 25 2005 rpm
-rwxr-xr-x 1 root root 246 Apr 17 2005 slocate.cron
-rwxr-xr-x 1 root root 158 May 26 2005 yum.cron
[root@edu /]#
[root@edu /]# ls -l /etc/cron.weekly/
-rwxr-xr-x 1 root root 277 Mar 17 2005 0anacron
-rwxr-xr-x 1 root root 414 Apr 8 2005 makewhatis.cron
-rwxr-xr-x 1 root root 90 May 26 2005 yum.cron
[root@edu /]#
[root@edu /]# ls -l /etc/cron.monthly/
-rwxr-xr-x 1 root root 278 Mar 17 2005 0anacron
[root@edu /]#

ㅇ 사용자 cron 의미
- 개별 사용자가 자신의 cron설정을 개별적으로 할 수 있음.
- 개별 사용자의 cron설정파일은 /var/spool/cron 디렉토리내에 자신의 ID와 동일한 파일로 생성됨
[root@edu /]# ls -l /var/spool/cron
total 16
-rw------- 1 root bible 60 Feb 15 13:07 bible
-rw------- 1 root root 195 Feb 15 12:44 root

ㅇ 사용자 cron 설정시 사용명령어(crontab)
- 개별사용자의 cron설정 방법 : crontab –e
- 개별사용자의 cron설정 확인 방법 : crontab –l
- 개별사용자의 cron설정 삭제 방법 : crontab –r
- root의 일반사용자 cron설정 방법 : crontab –u 사용자명 –e
- root의 일반사용자 cron설정 확인 방법 : crontab –u 사용자명 –l
- root의 일반사용자 cron설정 삭제 방법 : crontab –u 사용자 -r

ㅇ cron 사용허가(불허가) 설정파일
- /etc/cron.allow 파일 : 이 파일에 등록된 사용자는 crontab으로 cron설정가능함.
- /etc/cron.deny 파일 : 이 파일에 등록된 사용자는 crontab으로 cron설정 불가능함
- 설치초기 값으로는 이 두 파일은 존재하지 않음. 따라서 필요시 생성해야 함.
- 설정방법은 한 행에 하나의 ID씩 기재하면 됨.
- 두 파일이 모두 존재하지 않으면 root만 가능.
- 만약 /etc/cron.allow파일을 만들었다면 root라도 이 파일에 root를 등록해야 사용 가능함.

4. at 예약작업 스케줄링 활용

ㅇ 예약작업 스케줄링이란?

- 특정일, 지정된 시간에 정해진 작업을 1회 수행하도록 하는 것.
- 주기적, 반복적 수행을 하는 cron과는 그 성격이 다름.

ㅇ 예약작업 스케줄링에 사용되는 명령어
- 예약작업 수행 데몬 : atd
- 예약작업 설정 : at (또는 가끔씩 batch를 사용하기도 함.)
- 예약작업 확인 : at –l 또는 atq
- 예약작업 취소 : at –d 또는 atrm
- 예약작업 즉시 실행 : at –s 또는 atrun

ㅇ 예약작업 수행될 작업 목록 저장 위치 : /var/spool/at
ㅇ at로 예약작업을 수행할 수 있는 권한 설정파일 : /etc/at.allow, /etc/at.deny
- /etc/at.allow파일만 존재하면 이 파일에 설정된 사용자만 사용가능
- /etc/at.deny파일만 존재한다면 이 파일에 설정된 사용자외 모두 사용가능
- /etc/at.allow, /etc/at.deny 모두 존재하지 않는다면 root만 사용가능
- /etc/at.allow, /etc/at.deny 모두 존재하지만 내용이 모두 없다면 모든 사용자가 사용가능.
ㅇ atd데몬 시작/종료/재시작 : /etc/rc.d/init.d/atd start/stop/restart
ㅇ atd에 의해 수행된 로그기록 : /var/log/messages



위 내용은 ㈜수퍼유저코리아(www.superuser.co.kr)에 저작권이 있습니다.
원본 파일 : http://edu.phpschool.com/lecture/lec_linux_01/lec-data/10data.pdf
신고

'Programming > linux' 카테고리의 다른 글

linux 계정 lock 되는 현상.  (0) 2009.06.11
vsftpd ip 제한  (0) 2009.06.02
cron 시스템  (0) 2007.11.28
리눅스에서 svn설치  (0) 2007.11.28

리눅스에서 svn설치

Programming/linux 2007.11.28 10:46

1. 사용 할 각각의 파일들 구하기

위의 파일들을 /root에 받습니다.

 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260&expandFolder=74

다운로드. subversion-1.4.4.tar.gz

  http://www.openssl.org/source 여기서 lastest

자~ 설치해보자.

2. OpenSSL 컴파일과 설치

 # tar vxzf openssl-0.9.7c.tar.gz
 # cd openssl-0.97c
 openssl-0.97c# ./config
 openssl-0.97c# make
 openssl-0.97c# make install

3 .Berkeley DB 컴파일과 설치

  # tar vxzf db-4.3.29.tar.gz
  # cd db-4.3.29
  db-4.3.29# cd build_unix
  db-4.3.29/build_unix# ../dist/configure
  db-4.3.29/build_unix# make
  db-4.3.29/build_unix# make install
  db-4.3.29/build_unix# echo "/usr/local/BerkeleyDB.4.3/lib" >> /etc/ld.so.conf
  db-4.3.29/build_unix# ldconfig  
 

4. Apache 컴파일과 설치

# tar vxzf httpd-2.0.59.tar.gz
httpd-2.0.59# ./configure --prefix=/usr/local/apache2 --enable-suexec \
                          --enable-so --with-suexec-caller=bin \
                          --enable-ssl --with-ssl=/usr/local/ssl --enable-cache \
                          --enable-ext-filter --with-z=/usr/include --enable-dav \
                          --with-dbm=db4 --with-berkeley-db=/usr/local/BerkeleyDB.4.2
httpd-2.0.59# make
httpd-2.0.59# make install

5. Subversion 컴파일과 설치

데비안의 경우 zlib1g-dev, libxml2-dev, libexpat1-dev의 패키지가 필요합니다. 다른 배포판의 경우도 거의 같은 이름으로된 패키지가 있을 것입니다. 이 패키지들은 라이브러리와 헤더 파일을 포함하고 있는 것들입니다.


앞에서 Apache를 설치했을 경우
# tar vxzf subversion-1.4.2.tar.gz
# tar vxzf subversion-deps-1.4.2.tar.gz
# cd subversion-1.4.2
subversion-1.4.2# ./configure --with-zlib
                           --with-apxs=/usr/local/apache2/bin/apxs \
                           --with-berkeley-db=/usr/local/BerkeleyDB.4.3
subversion-1.4.2# make
subversion-1.4.2# make install

Apache를 설치하지 않았을 경우
# tar vxzf subversion-1.4.2.tar.gz
# cd subversion-1.4.2
subversion-1.4.2# ./configure --with-zlib \
                              --with-berkeley-db=/usr/local/BerkeleyDB.4.3
subversion-1.4.2# make
subversion-1.4.2# make install












이 글은 스프링노트에서 작성되었습니다.

신고

'Programming > linux' 카테고리의 다른 글

linux 계정 lock 되는 현상.  (0) 2009.06.11
vsftpd ip 제한  (0) 2009.06.02
cron 시스템  (0) 2007.11.28
리눅스에서 svn설치  (0) 2007.11.28

Apache2와 Tomcat5 연동하기

Programming/Apache 2007.11.26 15:15

다른 참고 페이지 : http://php.chol.com/~vision82/tt/38



Apache2와 Tomcat5 연동하기

/*','[-]'); } /*]]>*/

작성자 : 박상현(브루펜시럽)

2006년 7월 9일 일요일 오전 5시즘 작성을 시작하였습니다. 기후는.. 제주도로 태풍이 북상중이라고 합니다.

1 서론


저는 사정상 PHP와 JSP 를 모두 처리해줄 필요가 있었기 때문에 Apache2/Tomcat5 연동 모델을 선택했습니다.

각자 처한 환경에 따라서 이 모델이 최선이 아닐 수도 있습니다. Tomcat5 의 standalone 모드도 고려해주시기 바랍니다. ^^

연동시 사용되는 connector 에는 mod_jserv, JK, JK2, mod_webapp or mod_proxy 등이 있습니다.

자세한 내막은 알지는 못하지만 jserv 와 mod_webapp 는 오래전부터 외면받아온 것 같고

JK2 는 개발자들의 흥미 부족을 이유로 개발이 중단되었습니다.

따라서 JK 와 mod_proxy 가 남는 데.. Apache2.2 부터는 mod_proxy_ajp 모듈이 제공됩니다.

국내에서는 해당 모듈을 이용한 연동 사례를 찾을 수 없어서 도전해보았습니다.


연동시 테스트된 환경은 다음과 같습니다.

OS Fedora core 5
Apache2.2 httpd-2.2.2-1.0
Tomcat5.5 tomcat5-5.5.15-1jpp_6fc
Java jdk 1.5.0_07

리눅스에 입문한지 얼마 안되어서 FC5 외의 환경에 대해서는 잘 알지 못하기 때문에

테스트에 사용된 설치 방법이 제공되지 않거나 적절하지 않을 수 있으며 언급된 경로등이 다를 수 있습니다.

find / -name {대상} 혹은 which {대상} 등으로 적절한 경로를 확인하시기 바랍니다.

2 Apache 2.2


  • yum 을 이용해서 관련 rpm 패키지들을 설치합니다.
# yum -y install httpd\*

  • httpd.conf 파일을 열어서 다음에 언급된 구문들을 찾아서 수정해줍니다.

    각 문구들이 의미하는 바에 대해서는 별도의 문서를 참고하여 주시기 바랍니다.

    제가 수정한 부분에 대해서만 언급하였습니다.
# vim /etc/httpd/conf/httpd.conf
서버관리자의 email 주소를 입력해줍니다. 에러페이지에 표시됩니다.
ServerAdmin root@localhost
주석을 풀어줍니다. 브라우저에서 http://127.0.0.1/~계정 으로 접속하면 /home/계정/public_html/ 에서 웹문서을 찾게 됩니다.
<IfModule mod_userdir.c>
    UserDir public_html
</IfModule>
언어별 우선 순위라고 합니다. ko 를 맨 앞으로 옮겨줍니다.
LanguagePriority ko en ca cs da de el eo es et fr he hr it ja ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
UTF-8 을 사용하기엔 아직 환경이 충분히 조성되지 않은 것 같습니다. 인코딩 방식을 EUC-KR로 변경해줍니다.
AddDefaultCharset EUC-KR

  • 방화벽에서 80번 포트가 열렸는 지 확인합니다.
  • 아파치 데몬을 시작합니다.
# service httpd start

  • 브라우저에서 http://127.0.0.1/ 로 접속해봅니다. 참고로 페도라에서는 Fedora Core Test Page 가 떴습니다.
  • 아파치 데몬을 끝내려면 다음과 같이 입력합니다.
# service httpd stop

3 J2SE

Fedora core 5 에서는 JDK 5.0 을 rpm.bin 을 받아서 설치할 경우에 각종 경로 설정 문제가 발생하게 됩니다.

따라서 다음 싸이트에 나와있는 방법을 사용했습니다. http://www.fedorafaq.org/#java

그 외의 환경에서는 JavaInstallation 에 나와있는 설치 방법을 따르시기 바랍니다.


# yum -y install rpm-build

  • 다운 받은 JDK 파일을 빌드를 위해서 source 디렉토리로 이동 시킵니다.
# mv jdk-1_5_0_07-linux-i586-rpm.bin /usr/src/redhat/SOURCES/

# rpmbuild --rebuild java-1.5.0-sun-1.5.0.07-1jpp.nosrc.rpm
꽤 오래 작업합니다. 커피 드시면서 기다립니다.

  • 빌드된 rpm 을 설치합니다.
# yum -y localinstall /usr/src/redhat/RPMS/i586/java-1.5.0-sun-*
제 경우에는 nosigned 메시지와 함께 설치가 되지 않았습니다. 이 경우에는 rpm -Uvh 로 설치해주면 됩니다.

설치하는 패키지 중에 unixODBC-devel 패키지에 의존성이 있는 패키지가 있으니 먼저 설치해줍니다.
# yum -y install unixODBC-devel
# rpm -Uvh ~~ 

  • 설치가 정상적으로 되었는 지 확인해봅니다.
# java -version
java version "1.5.0_07" 과 같이 나오면 성공입니다.

만약 1.4.2 버전으로 나온다면 alternatives 에서 java 가 manual mode로 1.4.2 버전 디렉토리를 링크로 삼고 있을 수 있습니다.

다음과 같이 입력하시거나
# alternatives --auto java
다음과 같이 입력한 후에 1.5.0 버전 경로를 선택해주시면 됩니다.
# alternatives --confige java

4 Tomcat 5.5

  • yum 을 이용해서 관련 rpm 패키지들을 설치합니다.
# yum -y install tomcat5\*

  • 방화벽에서 8080포트를 열어줍니다.
  • 다음 파일을 수정합니다.
# vim /usr/share/tomcat5/bin/relink 
이 구문을 찾아서 -type d 옵션을 뒷편으로 옮겨준다.

find /var/lib/tomcat5/webapps -type d -mindepth 1 -maxdepth 2
find /var/lib/tomcat5/webapps -mindepth 1 -maxdepth 2 -type d

  • 다음 파일을 수정합니다.
# vim /usr/share/tomcat5/conf/workers.properties
#workers.tomcat_home=/var/tomcat
workers.tomcat_home=/usr/share/tomcat5

#workers.java_home=/opt/IBMJava2-13
workers.java_home=/usr/lib/jvm/java

  • tomcat5 admin툴에서 사용되는 계정 정보가 담겨 있습니다. 수정해줍니다. ( adminpassword 부분은 원하시는 패스워드를 입력하세요. )
# vim /usr/share/tomcat5/conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="admin" password="adminpassword" roles="admin,manager,tomcat"/>
</tomcat-users>

  • 사용자 계정을 지원하기 위하여 수정해줍니다.
# vim /usr/share/tomcat5/conf/server.xml
<Host name="localhost" ...>
  ...
  <Listener className="org.apache.catalina.startup.UserConfig"
            directoryName="public_html"
            userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
  ...
</Host>
적절한 호스트 아래에 다음의 Listener를 추가하게 되면 /etc/passwd 파일을 참고로 해서

http://127.0.0.1:8080/~user_account 로 들어온 접속을 /home/user_account/public_html 로 연결하여 준다고 합니다.


  • tomcat을 실행합니다.
# service tomcat5 start
브라우저에서 http://127.0.0.1:8080/로 접속해봅니다. 고양이가 나타나면 OK.

  • 이제 tomcat을 종료시킵니다.
# service tomcat5 stop

5 mod_proxy_ajp

mod_proxy_ajp.conf 에 기술된 mod_proxy_ajp 을 이용하는 방법은

다음과 같이 설정하여 줌으로서 특정 URL로 들어온 요청은 전부 톰캣이 처리하게 하는 것입니다.
ProxyPass /tomcat/ ajp://localhost:8009/
이 경우에는 jsp나 서블릿과 html 문서와 이미지등을 서로 경로를 구분해서 저장해야 본래의 목적을 달성할 수 있다는 문제점이 있습니다.

따라서 mod_rewirte 를 이용해서 .jsp 파일만 톰캣이 처리하는 방법을 사용하였습니다.

  • proxy_ajp.conf 파일을 열어서 다음과 같이 추가해줍니다.
# vim /etc/httpd/conf.d/proxy_ajp.conf
RewriteEngine On
#RewriteLog /root/mod_proxy_ajp.txt
#RewriteLogLevel 9
RewriteCond %{REQUEST_FILENAME} .jsp
RewriteRule (.*) ajp://localhost:8009$1 [P]

  • Tomcat5 의 홈디렉토리를 /var/www 로 변경해줍니다.
# cd /usr/share/tomcat5/webapps/ROOT
# mv ROOT ROOT.old
# ln -s /var/www/html /usr/share/tomcat5/webapps/ROOT
# cp -r /usr/share/tomcat5/webapps/ROOT.old/WEB-INF/ /usr/share/tomcat5/webapps/ROOT/WEB-INF

  • 아파치 데몬을 실행합니다.
# service httpd start

  • tomcat 을 실행합니다.
# service tomcat5 start

  • 테스트용으로 test.jsp 파일을 작성합니다.
# vim /var/www/html/test.jsp
<%@ page contentType="text/html; Charset=EUC-KR" %>
<%
out.println("Hello");
%>

6 기타 사항

페도라에서 service 명령어를 인식 못할 때는

일반 계정에서 root 계정으로 넘어갈 때 su 라고만 쳐줘서 /sbin 디렉토리가 PATH 에 추가되지 않은 경우일 수도 있습니다.
# . /etc/profile
하시면 PATH 가 적절하게 갱신되며 service 명령어가 제대로 인식될 것입니다. 다음부터는 su - 라고 입력하시는 게 바람직합니다.

뭐 제가 잘 몰라서 그랬습니다. 흐늘흐늘

7 참고 사이트

아래의 문서들 덕분에 무사히 항해를 마치고 라꾸라꾸 속으로 들어가봅니다. 감사합니다.

8 피드백

뭐라도 괜찮으니 한마디씩 써주고 가세요. ;ㅁ;

음 굿 ㅋ? -- ddakker

잘 읽고 갑니다. 수고에 감사드립니다. :-) -- allieus

이 글은 스프링노트에서 작성되었습니다.

신고

'Programming > Apache' 카테고리의 다른 글

Apache-Tomcat proxy ajp  (0) 2012.02.08
[scrap]compile mod_proxy to existing apache (cpanel can do)  (0) 2009.06.04
Apache Tomcat Context 설정  (0) 2007.12.21
Apache2와 Tomcat5 연동하기  (0) 2007.11.26

DWR에서 여러개의 Converter 설정하기

Programming/DWR 2007.11.26 14:47

진짜 이걸 설정하기 위해서 엄청나게 헤멧다.. 결국은 아무것도 아니었는데 말이다..;;


DWR에서는 converter 를 이용하여 사용자의 임의의 bean을 쓸수가 있다.

그런데. 지금껏 대부분의 예제에서는 딱 한개의 bean만을 사용한 예제를 보여준다.

하지만 bean이 어디 하나뿐이겠는가?


여러개의 빈들을 설정해서 사용하고 싶다. 그런데 어떻게 해야 여러개의 빈을 사용할 수 있을까?

한참을 고민하며 테스트도 죽어라 했다.

그 결과를 공개한다.



프로젝트 구성은 아래와 같다.

DwrAction을 통해서 DwrBeanDwrBeanTwo를 각각 호출하여 사용하고 싶다.

Capture1.gif 


  • DwrAction.java
 package daum.test;

public class DwrAction {
 public DwrAction(){
 }
 public DwrBean getBean(){
  DwrBean b = new DwrBean();
  b.setAddr("here");
  b.setName("kim");
  b.setNum(1);
  return b;
 
 }
 public DwrBeanTwo getBean2(){
  DwrBeanTwo t = new DwrBeanTwo();
  t.setAge(20);
  t.setLevel("B");
  t.setPost("Seoul");
  return t;
 }
}


  • index.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<script type='text/javascript' src='dwr/interface/DwrAction.js'></script>
<script type='text/javascript' src='dwr/interface/DwrAction2.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<script type="text/javascript">
function getBean(){
 DwrAction.getBean(returnBean);
}
function getBean2(){
 DwrAction2.getBean2(returnBeanTwo);
}
function returnBean(data){
 alert(data.name+' '+data.num+' '+data.addr);
}
function returnBeanTwo(data){
 alert(data.age+" "+data.post+" "+data.level);
}

</script>
</head>
<body>
<a href="javascript:getBean()">getBean</a><br>
<a href="javascript:getBean2()">getBean2</a>
</body>
</html>


  • dwr.xml  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
    <allow>
        <convert converter="bean" match="daum.test.DwrBean"/>
        <create creator="new" javascript="DwrAction" >
            <param name="class" value="daum.test.DwrAction"/>
            <include method="getBean"/>
        </create>
    </allow>
    <allow>
        <convert converter="bean" match="daum.test.DwrBeanTwo"/>
        <create creator="new" javascript="DwrAction2" >
            <param name="class" value="daum.test.DwrAction"/>
            <include method="getBean2"/>
        </create>
    </allow>
</dwr>

 괜히 삽질했다. 결론은 allow를 두번 쓰면 되는것이었던 것이다!!! 젠장할 DWR...-_-;;;


이 글은 스프링노트에서 작성되었습니다.

신고

'Programming > DWR' 카테고리의 다른 글

URL Validation  (0) 2008.01.02
DWR에서 여러개의 Converter 설정하기  (0) 2007.11.26
DWR  (0) 2007.11.26

DWR

Programming/DWR 2007.11.26 14:33

원본글 : http://wiki.javajigi.net/display/WEB20/dwr


Direct Web Remoting

Table of Contents

DWR이란?

DWR은 쉬운 방법으로 AJAX 와 XMLHttpRequest를 사용하길 원하는 개발자를 위한 오픈 소스 솔루션이다.
DWR 은 Direct Web Remoting 의 약자로 클라이언트 쪽의 AJAX 관련 자바스크립트 라이브러리 뿐만 아니라 서버쪽의 웹 어플리케이션 라이브러리 까지 포함하고 있다.

참고 : http://www.javapassion.com/ajaxcodecamp/#Direct_Web_Remoting_DWR

DWR은 크게 두 개의 파트로 구성되어 있다.

  • Javascript를 이용하여 AJAX의 구조를 이용하여 web-server기반의 서블릿으로 부터 data 검색이 가능하도록 하는 Code
  • 웹개발자들로 하여금 검색된 data를 이용하여 동적으로 웹 페이지를 update하는 것을 용이하게 하기 위한 JavaScript library
Useful Information

DWR웹 어플리케이션은 크게 모든 요청을 처리하는 컨트롤러 역할을 하는 DWRServlet 과 클라이언트의 요청을 처리할 빈들로 구성되어 있다.DWRServlet 은 웹 어플리케이션의 /WEB-INF/web.xml 에서 설정이 가능하고 요청들을 처리할 빈( bean) 객체들은 /WEB-INF/dwr.xml 에서 설정할 수 있다.

설정방법 및 샘플

아래 샘플파일은 참고자료에서 다운받은 것을 기준으로 작성되었다.

  1. dwr.jar 를 다운로드 받은 후 WEB-INF/lib 아래 둔다.
  2. web.xml에 DWRServlet 관련 설정을 한다.
  3. WEB-INF/dwr.xml 파일을 작성한다.
  4. 호출하는 클라이언트 프로그램을 작성한다.(여기선 jsp)

web.xml

<servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <display-name>DWR Servlet</display-name>
        <description>Direct Web Remoter Servlet</description>
        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
        <init-param>
             <param-name>debug</param-name>
             <param-value>true</param-value>
        </init-param>
</servlet>
        
<servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

보면 DWR 웹 어플리케이션에서는 모든 요청을 일단 DWRServlet 이 받아서 처리하게 되는데 그 요청을 처리할 객체나 데이터 타입의 맵핑, 보안등의 설정은 모두 dwr.xml 의 설정을 바탕으로 한다

dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
  <allow>
        <convert converter="bean" match="com.tmax.spring.domain.Apartment"/>
        <create creator="new" javascript="ApartmentDAO" >
          <param name="class" value="com.tmax.spring.ibatis.ApartmentDAO"/>
           <include method="findApartments"/>
            <include method="countApartments"/>
        </create>
  </allow>
</dwr>

DWR에서 요청을 처리할 빈(bean) 객체를 지정하는 부분이 <create />이다.
create 요소에는 creator,javascript,scope의 3가지 속성이 지정될 수 있다 creator 속성은 요청을 처리할 빈 객체가 생성되는 방식을 지정하는데 직접 클래스의 이름을 지정하여 생성할 수도 있고 빈 셸 스크립트를 이용하거나 Spring framework 에 객체 생성을 위임할 수도 있다. 기본적으로 가장 많이 사용되는 create 속성인 new 는 지정된 클래스의 인스턴스를 생성하여 클라이언트 쪽에서 오는 자바스크립트 요청과 지정된 인스턴스의 메소드를 맵핑해준다.
Scope 속성 은 creator 로 지정된 객체의 라이프싸이클 범위를 지정하는 것으로 J2EE 서블릿 스펙에서 정의된 scope 와 동일하게 application, page, request,session 중 하나의 값을 가질 수 있다.
creator 는 include 혹은 exclude 요소를 가질 수 있는데 DWR 서비스 빈 객체에서 호출할 수 있는 메소드를 제한하는데 사용할 수 있다.

ApartmentDAO : 쿼리를 가져오는 실제 메소드가 들어있는 클래스
Apartment : id,bedrooms,bathrooms,price,address,city,province를 가진 도메인 객체

search.jsp

 <script src='dwr/interface/ApartmentDAO.js'></script>
 <script src='dwr/engine.js'></script>
 <script src='dwr/util.js'></script>
.
.
.

 <script language="javascript">
 function updateTotal() {
    $("resultTable").style.display = 'none';
    var bedrooms = document.getElementById("bedrooms").value;
    var bathrooms = document.getElementById("bathrooms").value;
    var price = document.getElementById("price").value;
    ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
 }

 function loadTotal(data) {
    document.getElementById("totalRecords").innerHTML = data;
 }
</script>
.
.
.

DWR은 클라이언트가 서버단의 서비스 객체를 호출하기 위한 일종의 스텁 스크립트를 자동으로 생성해준다.
dwr/interface/*는 서버단의 서비스 객체를 호출하기 위한 자바스크립트를 만들어주는 URL이다. 그렇기 때문에 ApartmentDAO객체를 클라이언트 쪽에서 사용하기 위해서는 미리 ApartmentDAOrk 정의 되어 있는 자바스크립트를 소스에 포함시켜야 한다.
<script src='dwr/interface/ApartmentDAO.js'></script>
그러면 ApartmentDAO의 메소드를 스크립트 안에서 사용할 수 있다.

ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
parameter 중 맨 앞은 countApartment가 수행한 뒤 호출되야 하는 callback 메소드, 그 뒤는 countApartment 메소드의 parameter 이다.
callback 메소드 에서 처리를 할 수 있다.

document.getElementById("totalRecords").innerHTML = data
countApartments 메소드를 수행하고 나온 결과를 totalRecords 라는 태그에 innerHTML로 설정한다.

사용예제 참고사항

  • 사용한 샘플을 돌릴때 에러가 발생하였다.
    다운로드 받은 jw-0620-dwr.war안에 dwr.xml 이
    <dwr>
        <allow>
            <convert converter="bean" match="dwr.sample.Apartment"/>
            <create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO">
                <include method="findApartments"/>
                <include method="countApartments"/>
            </create>
      </allow>
    </dwr>
    

로 되어있다. 하지만 <create/>는 class 를 attribute 로 가지지 않는다. 그래서 에러 발생..

<create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO"> 를
<create creator="new" javascript="ApartmentDAO" >
<param name="class" value="com.tmax.spring.ibatis.ApartmentDAO"/>
</create>

으로 변경한 뒤 정상적으로 수행이 되었다.

수행한 결과

  • 사용예제는 렌트할 아파트를 구하는 예제이다.

원하는 방 갯수, 화장실 갯수, 가격 대를 선택하면 조건에 맞는 아파트의 수가 나오고 show results 라는 버튼을 클릭하면 주소,방갯수,화장 실갯수,가격등의 정보가 조회된다.


만일 예제와 같은 결과를 얻기 위해 DWR 를 이용하지 않았다면 XMLHttpRequest 객체를 얻는 과정부터 소스를 작성했어야 할 것이다.
하지만 DWR을 사용함으로써 이전의 과정은 모두 DWR 에 맡기고 실제 작동하는 서버 클래스 작성, dwr.xml 작성에만 신경을 쓸 수 있게 되었다.

DWR2.0

이전방식

예를 들어
com.tmax.tody.dwr.tody.ProductDwr 클래스가 dwr 에서 사용할 클래스 인 경우
dwr.xml , applicationContext.xml 에 모두 관련 내용을 작성해야 했다.

우선 applicationContext.xml 에 사용하는 클래스에 대한 bean 선언을 해야 한다.
application.xml

<bean
      id="productDwr"
      class="com.tmax.tody.dwr.tody.ProductDwr"
  >
    <property name="moduleService">
      <ref bean="moduleService"/>
    </property>
    <property name="versionService">
      <ref bean="versionService"/>
    </property>
  </bean>

dwr.xml 에 create 요소의 creator 속성 중 spring 을 이용하여 해당 bean 을 가져다 쓸 수 있도록 선언을 해야 한다.
dwr.xml

   <create creator="spring" javascript="ProductDwr"> 
                <param name="beanName" value="productDwr"/> 
   </create>

   <convert converter="bean" match="com.tmax.tody.domain.tody.*"/>

선언을 한 후 실제 사용하는 jsp 에서는

<script type='text/javascript' src='dwr/interface/ProductDwr.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>

<script type="text/javascript">
    function setSubVersion(mainVersionCode, systemCode, userId) {
      var productCode = $("productCode").value;
      ProductDwr.findSearchSubVersions(productCode, systemCode, userId, mainVersionCode,listMainVersionProcess);
    }
</script>

<select name="mainVersionCode" class="input" onchange="*setSubVersion*
(this.value, '${sessionScope.currentSystem}', '${sessionScope.user.id}');" style="width:48%;">
        <option value="">::: 선택 :::</option>
        <c:if test="${not empty mainVersions}">
                <c:forEach var="mv" items="${mainVersions}">
                        <option value="${mv.versionCode}" ${(param.mainVersionCode ==  mv.versionCode)? 'selected':''}>${mv.versionName}</option>
                </c:forEach>
        </c:if>
</select>
<c:choose>
        <c:when test="${not empty subVersions}">
                <select name="subVersionCode" class="input" style="width:50%;">
                        <option value="">::: 선택 :::</option>
                        <c:if test="${not empty subVersions}">
                                <c:forEach var="sv" items="${subVersions}">
                                        <option value="${sv.versionCode}" ${(param.subVersionCode == sv.versionCode)? 'selected':''}>${sv.versionName}</option>
                                </c:forEach>
                        </c:if>
                </select>
        </c:when>
        <c:otherwise>
                <select name="subVersionCode" class="input" style="width:50%; display:'none';">
                        <option value="">::: 선택 :::</option>
                </select>
        </c:otherwise>
</c:choose>

DWR2.0+Spring
DWR2.0과 Spring2.0이 나오면서 Spring의 context.xml에 XML Namespace 형식으로 DWR를 적용할 수 있게 되었다.

applicationContext.xml

<beans
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.directwebremoting.org/schema/spring-dwr
       http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd">
       

    <dwr:configuration>
        <dwr:convert match="com.tmax.tody.domain.tody.*" type="bean"/> 
    </dwr:configuration>
 
    <bean id="productDwr" class="com.tmax.tody.dwr.tody.ProductDwr">
        <dwr:remote javascript="ProductDwr" />
             <property name="moduleService">
                <ref bean="moduleService"/>
             </property>
             <property name="versionService">
                <ref bean="versionService"/>
             </property>
    </bean>

설정 면에서도 간편해져서 사용하기에 좀 더 편리하게 되었다.

이 외에도 DWR2.0 이 되면서 더욱더 많은 장점을 가지게 되었다.
그것은.. http://getahead.org/dwr/changelog/dwr20 을 보면 자세히 나와있다.

util.js, engine.js 에서도 다양한 함수들을 사용할 수 있다.
http://getahead.org/dwr/browser/util


참고할 링크

  1.  http://blog.empas.com/acher00/12704857
  2. http://wiki.javajigi.net/display/WEB20/Direct+Web+Remoting#DirectWebRemoting-DWR%EC%9D%80%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0%2C%EC%99%9CDWR%EC%9D%B8%EA%B0%80%3F
  3. http://getahead.org/dwr 


이 글은 스프링노트에서 작성되었습니다.

신고

'Programming > DWR' 카테고리의 다른 글

URL Validation  (0) 2008.01.02
DWR에서 여러개의 Converter 설정하기  (0) 2007.11.26
DWR  (0) 2007.11.26


티스토리 툴바