Entries Tagged as Open BlueDragon

제목만 놓고 보면 사실 대단한거 같지만 모든 훌륭한 소프트웨어가 단순한 아이디어와 몇줄의 코드로 시작한다고 볼때 어쩌면 도움이 되는 팁이 아닐까 싶어 몇자 적습니다. 사실은 제가 이번 지방자치단체 홈페이지 접속불가 사태에 대응하는 훌륭한 도구가 되어서 소개할까 합니다.

몇년전에도 제 이전 블로그에서도 비슷한 글을 남기것 같지만 사실 같은 코드로 다양하게 응용할 수 있습니다. ColdFusion의 3인방 Adobe ColdFusion, Railo, Open Bluedragon(.net의 BlueDragon포함)에는 훌륭한 Scheduled Task 툴이 내장되어 있습니다.

ASP나 PHP등에서는 외부의 도움없이는 아예 구현이 힘들고 JSP쪽은 Java로 별도로 구현하거나 또는 내장된 WAS를 써야하지만 어쨌든 HTTP기반으로 서비스되는 스크립트문서의 특성상 일정주기를 가지고 자동으로 실행되게 하는 것은 말과는 다르게 은근 구현과 운영이 힘듭니다.

ColdFusion의 내장 Scheduled Task(이하 스케줄러)는 자기자신이 설치된 서버상의 ColdFusion파일들 즉, cfm이나 cfc와 같은 파일들을 실행하기도 하지만 외부의 서버의 다른언어 ASP나 PHP, JSP와 같은 외부의 URL을 주기적으로 실행할 수 도 있습니다. 

특정포트도 지정할 수 있으며, 외부의 그 URL에 해당되는 페이지의 보안을 위하여 Apache인증과 같은 웹서버인증이 걸린 페이지라 하더라도 미리 아이디와 패스워드를 지정해 놓으면 알아서 로그인?하여 페이지를 실행해 줍니다.

스케줄링은 크게, Task의 이름, 실행할 URL, 포트, 프록시(해당되는 경우만)설정, 웹서버인증(해당되는 경우만), 실행주기, 로깅유무 등을 지정하고 저장만 해 놓으면 알아서 해당 주기별로 URL을 실행해 줍니다. 물론 이 기능 자체만으로 외부서버의 상태에 대해 알 수는 없죠. 해당 페이지가 있던 없던 주기별로 실행해 버리고 마니까요.

현재 기획단계이기는 하지만 위에서 설명드린 비슷한 기능을 하는 프로젝트를 구상중입니다. 가볍게 만들고 요긴하게 쓰이는 웹기반 어플리케이션을 만들자가 저의 기본 철학이므로 "워드프레스"급 성능과 기능을 요구하시면 안됩니다.

어쨋든 이제 슬슬 본론으로 들어가서, 우선 각 ColdFusion 엔진별로 Scheduled Task의 기능을 살펴봅시다. 대부분의 Java기반 WAS가 그렇듯 웹기반의 관리자모드를 지원합니다. 코드량이 극히 적고 초보자의 이해와 습득에 최정상급임을 자타가 공인하는 언어이지만,  대부분 실제 코드를 더 줄여주는 설정을 미리 하기 위한 것이 각 ColdFusion엔진의 Administrator의 역할입니다.

간단하게 소개하자면, SMTP나 LDAP, Session관리, DBMS와의 연동을 위한 Data Source Name 설정, WebService의 설정, 기타 보안관련 설정 등을 하기 위한 관리자모드입니다. 오픈소스 Java서블릿엔진들이 대부분 conf파일로 지정하게 한 것을 웹에서 관리하도록 만든거라 생각하시면 되겠네요. 마치 PHP의 단순 php.ini와 ZendServer와 같은 개념으로.

각, ColdFusion엔진의 Administrator모드로 접속을 하여 Scheduled Task를 접속하면, 아래와 같은 화면을 보실 수 있을 겁니다.

ColdFusion엔진별 Scheduled Task 비교

adobecf_scheduledtask_s.png

<Adobe ColdFusion 10 - 클릭하면 크게 볼 수 있습니다>

adobecf_scheduledtask_s.png

<Railo 4.0 - 클릭하면 크게 볼 수 있습니다>

adobecf_scheduledtask_s.png

<Open Bluedragon 3.0 - 클릭하면 크게 볼 수 있습니다>

각 엔진별로 기능은 대동소이 합니다만, 최근 Adobe ColdFusion 10의 경우엔 이전 버전과 달리 Scheduled Task 부분에 많이 기능이 더 추가되었습니다. (최근 Adobe 내부에서 가장 Hot한 부서중 하나가 ColdFusion개발부서가 아닐까 생각합니다.) 스케줄러에 대한 자세한 설명은 여기서 다 할 수 없으니 차후로 약속을 드리면서, 각 엔진 중 Adobe ColdFusion의 경우 개발자버전에 한해 기간제한 무료로 쓸 수 있습니다.(커넥션이 10개로 제한됩니다만 스케줄링에서는 제한이 없습니다.) 나머지 Railo나 OpenBD의 경우 오픈소스이기 때문에 프로덕션 환경에서도 사용할 수 있습니다.

여기서는 가장 간단한?하지만 가장 핵심적인 기능을 제공하는 OpenBD를 기준으로 설명드리겠습니다. 정작 중요한 것은 각 엔진의 스케줄러가 아니라, 스케줄러 실행할 오늘 만들 ColdFusion 코드이니까요. (Adobe ColdFusion이나 Railo를 이용해서 동일하게 Scheduled Task를 설정하면 됩니다.)

OpenBD Scheduled Task를 이용하기

먼저, 테스트를 위해 OpenBD를 다운로드합니다. 테스트용으로 사용할 것이지만 본인이 운영하는 J2EE기반의 서블릿엔진(Tomcat 등)이 있다면, 즉시 Deploy해서 사용할 수 도 있겠죠?

OpenBD 다운로드 http://openbd.org/downloads/

위 다운로드 페이지에서 압축만 풀고 바로 사용할 수 있도록 OpenBD Desktop 버전을 다운로드 합니다. Windows/Linux/Mac 모두 지원합니다만, 시스템에 미리 JDK가 설치되어 있어야 합니다. 단순히 압축을 풀고 내부의 명령어를 각 운영체제에 맞게 실행하면 됩니다. Windows의 경우 OpenBlueDragonDesktop.exe를 실행하면 됩니다. 이후 아래와 같은 패널이 실행되면 홈디렉토리와 포트, 그리고 관리자모드 생성하도록 체크하고 시작하시면 됩니다. 80포트로 지정했다면 브라우저에서 http://127.0.0.1:80으로 접속하면 되겠죠?

OpenBlueDragonDesktopServerPanel.png 

Web App Folder : 사용자의 홈디렉토리를 지정합니다. 여기에 .cfm(ColdFusion 문서) 파일을 만들것입니다.
Web Port : 사용할 포트를 지정합니다. 이미 IIS 등 웹서버가 구동중이라면 다른 포트를 지정하세요. 
Options : Enable Admin Console /bluedragon 옵션을 체크하세요.
RunTime Engine : Standard Engine

자, 이제 Start Web App 버튼을 눌러 OpenBD는 시작합니다. 브라우저에서 http://127.0.0.1:지정한포트/bluedragon/administrator 로 접속해 봅니다. 관리자모드로 접속이 되면 admin(초기비밀번호)을 입력하고 로그인합니다. 그런 다음 Scheduled Task 메뉴에서 적절히 샘플 작업하나를 등록해 봅시다.

openbd_sampletask.png

Task Name : sampletask 라고 입력합니다.
Duration - Start Date : 오늘 날짜로 지정합니다. (오늘 이전날짜 임의지정 가능)
Duration - End Date : 스케줄링이 끝날 날짜를 지정합니다. 항시 실행하려면 공란.
Interval : Daily Every 180 seconds from 00:00  매일 자정부터 매 180초마다 실행. to 항목 공란.
Full URL : 실행할 URL의 경로지정. 여기서는 이따 만들 servercheck.cfm 파일을 실행할 것이므로 지정함.
Full URL - Port : OpenBD패널에서 지정한 포트를 입력해야 로컬페이지를 실행할 수 있겠죠?
Request Timeout : 스케줄링이 실행될 시간. 50초이내에 "한번의" 스케줄링을 끝내도록 지정합니다.

나머지 항목은 기본값으로 둡니다. 자 submit 버튼을 눌러 등록한 후 맨 위의 Scheduled task 목록의 연필모양의 아이콘 왼쪽의 실행버튼을 눌러 스케줄링을 시작합니다. 

하지만 아직, servercheck.cfm 파일을 만들지 않았기 때문에 스케줄링은 되지만 어떠한 일도 발생하지 않습니다. 즉, 스케줄러가 실행할 servercheck.cfm파일을 만들어 해당경로에 두고 실행하면 매 180초마다 servercheck.cfm파일을 실행할 것 입니다.

그렇다면 이제 servercheck.cfm 파일은 무슨 기능을 하도록 프로그래밍해야 할까요? 우선 내가 체크하고자 하는 외부서버의 경로를 점검하여 정상적인 웹서버의 응답코드 "200 OK"가 아닌 경우 메일과 문자로 알려주는 기능을 만들어 봅시다.

HTTP 응답코드는 다양한 코드를 웹서버가 응답해 주는데, 가령 페이지를 찾을 수 없는 경우엔 404 Not Found 등이 바로 그것입니다. 자세한 응답코드에 대한 설명은 http://ko.wikipedia.org/wiki/HTTP 에서 확인해 볼 수 있습니다. 중요한 것은 "200 OK"만이 정상적인 웹서버의 응답이라는 것 입니다. 예를 들어 404나 500과 같은 응답코드가 수신되었다면 아마도 브라우저로 해당 경로에 접속했을때 정상적인 화면을 볼 수 없을 것 입니다.

코드작성

자, 이제 간단한 ColdFusion코드를 살펴봅시다. 메일도 보내고, 문자도 보낸다고 코드가 길고 복잡할 것 같지만 ColdFusion은 태그기반의 간결하고 매우 짧은 코드를 작성하도록 고안된 언어이기 때문에 누구나 쉽게 처음 배워도 대강의 코드만 보고 이것이 무슨 역할을 하는지 맞춰볼 수 있을 정도입니다.

servercheck.cfm

<cfprocessingdirective pageencoding="utf-8" />
<cfcontent type="text/html; charset=utf-8">

<!---
<cfset AuthIps="이 페이지가 실행되고 있는 서버 자신의 IP주소">
<cfif ListFind(AuthIps, #CGI.REMOTE_ADDR#) EQ 0>
	<cfabort>
</cfif>
--->

<cfset checkDomain = "http://www.someremoteserver.com/test.jsp">

<cftry>
	<cfhttp url="#checkDomain#" method="post" resolveurl="yes" throwOnError="yes" port="80" timeout="60" />
<cfcatch>
	<cfset cfhttp.statuscode="unavailable" />
</cfcatch>
</cftry>

<cfif cfhttp.statuscode NEQ "200 OK">

	<!--- Email 알림 --->
	<cfmail from="서버체크 <check@mydomain.com>"
			to="alert@mydomain.com"
			bcc=""
			cc=""
			subject="홈페이지 접속오류 발생"
			charset="utf-8"
			timeout="60"
			server="SMTP Server"
			port="SMTP Port"
			username = "SMTP user ID" 
			password="SMTP user password"
		    useSSL = "yes or no" 
		    useTLS = "yes or no" 
			>
	도메인 : #checkDomain#
	점검시각 : #DateFormat(Now(), "yyyy년 mm월 dd일")# #TimeFormat(Now(), "HH시 MM분 SS초")#
	상태 : #cfhttp.statuscode#
	</cfmail>

	<!--- SMS 알림 : Cafe24 SMS의 경우 --->
	<cfhttp method="post" url="https://sslsms.cafe24.com/sms_sender.php" charset="utf-8">
		<cfhttpparam type="formfield" name="user_id" value="">
		<cfhttpparam type="formfield" name="secure" value="">
		<cfhttpparam type="formfield" name="sphone1" value="012">
		<cfhttpparam type="formfield" name="sphone2" value="345">
		<cfhttpparam type="formfield" name="sphone3" value="6789">
		<cfhttpparam type="formfield" name="rphone" value="000-111-2222">
		<cfhttpparam type="formfield" name="msg" value="홈페이지 접속오류 발생 #cfhttp.statuscode#">
	</cfhttp>

</cfif>

간결한 코드로 보이시나요? 별거 없습니다. 우선 맨 위 두줄은 ColdFusion에서 문서의 인코딩과 코드를 유니코드로 처리하도록 지정하는 코드입니다. 여기서는 큰 의미는 없습니다. Railo와 OpenBD는 문서를 저장할 때 utf-8방식으로 저장하거나 서버상에서 항상 utf-8로 처리하도록 지정할 수 있기에 이 두줄은 Adobe ColdFusion에서만 해당됩니다.

<cfif ListFind(AuthIps, #CGI.REMOTE_ADDR#) EQ 0> 부분은 보안을 위한 코드로 servercheck.cfm 도 하나의 문서이기때문에 외부에서 브라우저접속으로 실행이 가능합니다. 따라서 스케줄러 즉, ColdFusion엔진이 구동중인 서버 자신만 이 페이지를 실행하도록 서버자신의 아이피를 지정하여 해당 아이피가 아닌 경우 실행을 중지 <cfabort>합니다. 단, 127.0.0.1과 같은 로컬주소를 지정하면 안됩니다.

<!--- --->와 같은 HTML의 주석과 비슷하지만 대시(-)가 하나 더 있는 것이 ColdFusion의 주석입니다. 주석처리되어 있는 부분은 실행이 안됩니다.

<cfset checkDomain="">으로 지정된 주소가 실행시 점검할 대상이 되는 URL입니다. 스케줄러가 이 페이지(servercheck.cfm)를 실행하면 이 페이지는 <cfset checkDomain="">에서 지정한 페이지를 실행합니다.

실제로 외부URL에 접속하여 해당 웹서버의 헤더를 받아오는 일을 처리하는 태그는 <CFHTTP>태그입니다. <CFTRY>태그로 래핑되어 있는 코드구간 중에 CFHTTP태그는 원격서버에서 웹서버의 헤더를 수신하는 일을 처리하고, 만약 알 수 없는 오류가 난다면 <CFTRY>와<CFCATCH>로 예외처리를 해줍니다. CFHHTP에서 원격서버의 웹서버 헤더정보는 cfhttp.statuscode로 리턴되기 때문에 알 수 없는 오류가 나오거나 원격서버의 웹서버가 아예 죽어버려 응답조차 못할 경우를 예외처리하기 위함 입니다.

매우 간단하게 단 한줄로 원격 웹서버의 상태를 확인할 수 있겠죠? 자, 이제 그 서버에서 200 OK 를 보내오지 않는 다면 문제가 있는 것이므로 관리자에게 확인해 보라는 메일과 SMS를 보낼 차례입니다. 

<cfif cfhttp.statuscode NEQ "200 OK"> 코드 블럭안이 바로 그것입니다. <CFMAIL>태그는 메일을 송신하는 역할을 하는 태그입니다. <CFHTTP>태그가 또 한번 쓰였네요. <CFHTTP>태그는 원격 웹서버의 정보를 받아오기도 하지만 HTML의 FORM처럼 GET/POST로 데이터를 전송하는 역할도 같이 하는 기특한 태그입니다. <CFHTTPPARAM>태그로 전송할 변수명(name)과 데이터(value)를 지정하여 전송합니다.

여기서는 제가 이용중인 Cafe24의 SMS를 이용하여 전송하는 예제입니다만, 여러분이 이용하시는 SMS의 전송경로에 맞춰 수정하시면 됩니다. 각 SMS제공사에서 URL로 POST로 전송되어야 하는 변수와 값의 쌍을 알려주므로 <CFHTTPPARAM>부분의 name과 value값을 변경하시면 되겠죠?

결과

자, 이제 servercheck.cfm 파일을 로컬에서 실행중인 OpenBD의 홈디렉토리에 저장하고, 180초를 기다려 봅시다. 정상적으로 스케줄링을 등록하고, 코드에 이상이 없다면 아래와 같이 문자와 메일이 수신되어 확인하라는 메시지를 알려줄 것 입니다.

check_mail_list.png

check_sms_list.png

ColdFusion은 웹언어이기 때문에 ColdFusion자체로 Windows용 응용프로그램을 개발할 수 는 없지만 Webserver와 Embeded Database을 패키징하여 제공한다면 불가능한 일도 아닙니다. 가령, 파일공유를 위한 어플리케이션이나 메신저와 같은 어플리케이션의 경우 자체적으로 웹서버 또는 통신서버를 내장하고 UI부분을 HTML/Javascript 등으로 만든 다음 이를 설치패키지(InstallShield와 같은)한 어플리케이션도 많이 있습니다.

Open BD logoOpen Bluedragon에서 재밌는 패키지를 제공하고 있는데요. 작은 Open Bluedragon기반의 웹서버를 같이 패키징해서 어플리케이션이 실행되면 백그라운드로 웹서버가 구동되며, 브라우저기반의 어플리케이션을 구현할 수 있도록 만든것입니다. 뭐 이와 비슷한 개념의 배포 어플리케이션의 APMSetup과 같은 거니까 신기할건 없지만 ColdFusion의 강력함을 더할 수 있다는 점은 매우 흥미롭습니다.

가령 ColdFusion이 자체적으로 내장해서 가지고 있는 몇몇 기능중에는 Apache POI, Solr, iText, PDFBox 등등이 있는데 이를 이용하면 문서변환 로컬어플리케이션이나, 데스크톱 검색엔진등도 만들 수 있지요. 로컬 이미지뷰어나 FLV재생기 등등 웹에서 할 수 있는 것을 데크스톱 로컬로 옮긴다고 생각하시면 될것 같습니다.

Open BD-Local Directory

Open BD-Local 패키지를 받아서 압축을 풀면, 왼쪽 그림과 같이 openbd.exe파일은 실행파일이고 webapp 디렉토리가 기본적으로 웹루트가 됩니다. openbd.exe 실행하면 순간적으로 내장 웹서버와 ColdFusion 해석기가 실행되므로 로컬에 Open BD 데스크톱버전이 깔린 경우와 같게 됩니다. 하지만 MySQL등의 별도의 DB는 사용이 불가능할 수 있으므로 내장 H2 DatabaseApache Derby 등의 Embeded Database를 쓰면 됩니다. webapp 안에 Open Bluedragon의 웹아카이브 파일을 압축을 풀어주고 openbd.exe를 시작하면 cfm파일과 같은 ColdFusion문서를 해석할 수 있는 것이죠.

기본적으로 32124포트를 이용하므로 다른 웹서버와 충돌이 날 확률은 없습니다만, 이 역시도 변경이 가능합니다. webapp 안에 직접 만든 ColdFusion Document 등을 저장하고 브라우저로 접속하여 테스트 한후 Open BD-Local 디렉토리 자체를 Nullsoft의 NSIS를 이용해서 패키징하여 제공하게 됩니다.

간단하게 웹기반 ColdFusion 어플리케이션을 Windows용으로 배포할때 매우 유용할 것 같습니다. ColdFusion Scheduler를 이용한 로컬 URL로더(원격 웹서버의 상태를 주기적으로 모니터링하는 어플리케이션)를 개발하고 있는데 다되면 부끄럽지만 공개해 볼까 합니다.  

Powered by

© 2010-2018 NOOREE.COM