Entries Tagged as Open BlueDragon

정말로 오랜만에 글을 써 봅니다. 2014년 이후로는 거의 ColdFusion 관련 프로젝트를 하지 않는데다, 기술사나 감리사 공부를 한답시고 개발을 아예 손을 놓은지라 포스팅할 시간도 여력도 없었네요. 

그런사이 가상서버호스팅은 만료되고, 비용도 부담되는데다보니 여러 관리하는 서버에 기생?하다시피 이리 옮기고 저리 옮기도 하여 겨우겨우 블로그만 운영중입니다. 

한국에서 ColdFusion을 주 어플리케이션서버로서 개발 또는 운영하는 곳이 거의 없거니와 과거에 몇몇 기업이나 개발자분들이 있었지만 요새는 다들 활동을 특히 ColdFusion으로는 하지 않기에 과감이 이 블로그도 문을 닫을까 생각했습니다. (아카이브 블로그 포함)

그러나 가끔 제가 만든 시스템들의 유지보수와 그간의 노고?가 녹아있기도 하고, 볼품없는 블로그지만 몇몇 분들이 방문해 주시니 운영할 수 있는 여력이 있을때까지는 어찌어찌 문을 열어 둘려고 합니다. 

Railo Logo
<Goodbye Railo !! - 출처 : Railo>

그동안 다른 공부로 손을 놓고 있는 사이 ColdFusion분야에서도 몇가지 변화가 있었던거 같습니다. 가장 큰 이슈?는 오픈소스 ColdFusion 서버인 Railo가 Fork인 Lucee만 남겨둔채 영원히 사라진듯 하고, 오픈소스 서버들이 근근히 버텨내는 사이 여전히 막강한? 자금력과 개발진을 보유한 Adobe 는 ColdFusion 2016 Release와 ColdFusion Builder 2016을 내놓았습니다.

사실 너무 늦은 뉴스?라 새소식도 아니지만 이 블로그도 Railo에서 시작해서 Adobe ColdFusion 9, 10을 거쳐 다시 Lucee로 이전되는 고단한? 여정을 거친지라 그간의 소식들이 낯설지는 않네요. 그래도 여전히 인기?있는 웹개발언어로서 명맥을 유지하는 것이 신기하기도 합니다. 


<Lucee Opensorce ColdFusion Server - 출처 : Viviotech>

일본이나, 유럽, 미국에서는 여전히 인기있고, 또 왕성히 사용중인 웹언어이고 HTML5의 여러 기능들(WebSocket, Media 등)을 보강해 가면서 기능을 추가하고 있습니다만, 그래픽SW회사의 Adobe의 식구라는 것도 그렇고 새로운 기술이나 언어들이 쏟아지는 탓에 점점 역사의 뒤안길로 가는 게 아닌가 걱정되기도 합니다.

근 5~8년사이 서점을 가보면, 최근엔 거의 출간되는 개발서 대부분 모바일개발서나,  jQuery 등 프론트분야 Javascript, 또는 서버측 언어로는 Node.JS, Go, 빅데이터 등등 이제는 순수 웹개발에 대한 신간은 거의 없는거 같더라고요.. 물론 몇몇 번역서로서 PHP개발서는  약간씩 나오는거 같지만 찾는 사람은 글쎄요..

자바야 워낙 한국인이 애용하는 언어라 뭐 꾸준히 나오는터라 부럽기도 하고.. 사실 자바관련서는 순수 웹개발서라기보다는 응용에 가까우니.. 이제는 순수한 웹개발에 대한 관심과 애정은 많이 없어진듯 합니다. 여전히 쓰이는 기술이지만.. 뭐랄까.. 세탁소와 같은 사양산업에 가까워졌지 않았나.. 


<여전히 살아있는 ColdFusion - 출처 : whatpixel.com>

여쨌든 저희 회사에서도 이제는 웹개발은 순수한 홈페이지개발에만 치중하는데다 개인적인 인생관심사?가 기술사나 정보시스템감리사 취득으로 인생2막을 준비해야 하는 입장이라 앞으로 ColdFusion에 더 많은 애정을 가질지 모르겠습니다만 그래도 여전히 마음 한구석에 이 언어를 배운것 그리고 나름대로 회사의 업무에 적용해 본 것, 그리고 여전히 JSP 등으로 어렵게 개발하고 있는? 이 땅의 개발자들보다는 편한 개발을 하고 있다는 약간의 우월감(참 다들 답답하고 깝깝하게들 개고생 개발들 한다는 애처로움ㅋ)으로 앞으로도 기회가 되는데로 코드도 올려보고 하렵니다. 

몇분이나 보실지 몰라도 올해의 마지막 글이 아니길 바라면서. 

 

CFFTP태그는 손쉽게 ColdFusion 문서에서 외부의 FTP서버에 연결해서 해당 내용을 가져오거나 파일을 업로드하거나, 다운로드할 수 있는 아주 유용한 태그입니다. 마치 ColdFusion웹문서가 FTP클라이언트처럼 작동하게 해주는 강력한 기능을 제공합니다. 사용방법도 너무 쉬워서 몇줄의 코드로 간단하게 구현할 수 있습니다.

그런데 ASP와 같은 Windows계열의 웹개발언어에서는 CP949와 같은 운영체제의 인코딩과 EUC-KR과 같은 웹페이지 인코딩으로 기본적으로 한글을 사용하기에 매우 편리합니다만, 웹개발시 한글과 영문외의 문자 가령, 일본어 등과 같은 경우엔 별도의 조치를 취해주어야 합니다.

반면 대부분의 Linux환경에서는 UTF-8을 기본 지원하고 있어서 특별히 문자열에 대한 고민을 할 필요는 없습니다만, JVM에 기반한 웹언어를 사용시에는 유니코드를 사용할때 추가적인 조치를 해줘야 합니다.

사실 Windows나, Linux나 ASP나 PHP나 또는 JSP, ColdFusion과 같은 대부분의 것들이 영어권국가(미국)에서 만들어지고 개발되어진 탓에 그들의 언어에 태생적으로 얽여있다는 이유 등으로 그들은 특별한 조치없이 기본적으로 지원되는 ISO-8859-1과 같은 인코딩을 이용하여 편리하게 이용하는 반면, 한글과 같은 2Byte 문자권에서는 늘 무언가의 조치를 해줘야 하는 불편함이 있기는 매 한가지 입니다.

최근에 Ubuntu Linux에 구축된 외부의 VSFTP서버에서 디렉토리와 파일목록을 가져와야 하는 작업을해야 할 상황이 생겼습니다. 기본적으로 Ubuntu는 UTF-8환경이고, FTP의 디렉토리 및 파일명 역시 UTF-8 형식으로 만들어지고 저장된 파일이여서 큰 걱정을 안했는데 역시 불길한 예감은 틀린적이 없었습니다.

한글로 된 모든 디렉토리명 및 파일명이 깨져서 반환되는 것이었습니다. 실행되는 ColdFusion문서를 UTF-8로 처리하도록 해보았지만 역시나 동일한 결과. 그리하여 생각해낸게 Java로 아예 파일 및 디렉토리명의 문자열이 무슨 인코딩인지 알아보기로 했습니다. 

간단하게, 구글링을 통하여 Detecting Character Encoding In Coldfusion 글을 참고하여 테스트한 결과 Latin1 즉, ISO-8859-1인코딩으로 디렉토리명과 파일명이 반환됨을 알게되었죠. 아래 그림을 참고하시면 이해가 빠르실 겁니다.

Fixing broken character encoding for CFFTP

그림에서와 같이 어떤 FTP서버내에는 vod라는 디렉토리가 있는데 그 하위에 "스페셜"이란 한글로 명명된 디렉토리가 있습니다. 그리고 그 안에는 2개의 mp4파일이 존재하는데 각각 한자와 한글로 된 파일명을 가지고 있습니다.

일반적으로 CFFTP태그로 덤프(위 그림의 보라색 표 부분)를 해보거나 단순히 path와 같은 속성값을 출력해 보면 위 그림의 윗 부분처럼 한글(한자)로 된 부분이 깨져버립니다. 실행되는 ColdFusion문서자체가 UTF-8로 저장되고, 실행되고, 원격지의 FTP서버가 UTF-8로 운영되어도 말이죠. 아마도 추측컨데 JVM의 문제일듯합니다. 문자셋 문제는 대부분.

자, 그럼 위 그림의 UTF-8부분처럼 정상적으로 디렉토리명과 파일명을 가져오려면 어떻게 해야 할까요? 바로 파일을 가져올 디렉토리명의 한글을 ISO-8859-1로 그리고 반환되는 파일명을 UTF-8로 동적으로 변환해서 처리하면 됩니다. 

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

<!--- ISO-8859-1(Latin1)을 UTF-8로 --->
<cffunction name="convertToUTF8" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("ISO-8859-1").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('ISO-8859-1'),'UTF-8').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!--- UTF-8을 ISO-8859-1(Latin1)로 --->
<cffunction name="convertToLatin1" access="private" returntype="string" output="false">
    <cfargument name="txtString" type="string" required="true" />
	<cfset encoder = createObject("java", "java.nio.charset.Charset").forName("UTF-8").newEncoder() />
	<cfif encoder.canEncode(txtString)>
        <cfset convertedTxt = createobject("java", "java.lang.String").init(txtString.getbytes('UTF-8'),'ISO-8859-1').tostring()>
	</cfif>	
	<cfreturn #convertedTxt# />
</cffunction>

<!---FTP연결 시작--->
<cfftp action="open" connection="ftpQuery" username="demouser" password="demopasswd" server="someserver" stopOnError="yes"> 

<!--- 
FTP디렉토리에 한글이 있는 경우 해당 디렉토리를 불러오려면 convertToLatin1 함수를
해당 디렉토리 및 파일명이 한글인 경우 깨지는 것을 막기위해 convertToUTF8 함수를
--->

<!--- 디렉토리 및 파일리스팅 --->
<cfftp action="listdir" stopOnError="yes" name="getDirFiles" directory="#convertToLatin1('/vod/스페셜/')#" connection="ftpQuery">

<cfoutput query="getDirFiles">
	#convertToUTF8(path)# <br />
</cfoutput>

<hr />
<cfdump var="#getDirFiles#">

<!--- FTP연결 삭제 --->
<cfftp action="close" connection="ftpQuery" stopOnError="Yes"> 

위의 코드를 보죠. 위의 코드는 어떤 FTP에 연결과 "/vod/스페셜"이라는 디렉토리에서 파일들의 목록을 가져오는 코드입니다. 먼저 "/vod/스페셜"이라는 한글이 포함된 디렉토리명은 ISO-8859-1로 변환해서 ColdFusion서버에게 전달하고, ColdFusion서버에서 해당 FTP의 파일목록을 반환할때는 UTF-8로 반환되도록 함수를 2개 만들었습니다. 각각, convertToUTF8과 convertToLatin1라는 사용자정의함수(UDF : User Defined Function)입니다.

중간의 코드중에 directory="#convertToLatin1('/vod/스페셜/')#" 부분과 #convertToUTF8(path)# 부분에 각각 해당 함수가 쓰여 자동으로 문자열의 인코딩을 변경합니다. 

대부분 CdolFusion에서 로컬서버 및 원격서버와의 파일송수신, 파일목록의 반환, 압축(CFZIP) 등의 작업을 처리할때 한글파일명과 디렉토리명이 늘 깨져 말썽인데요. 이 함수를 적당히 응용하면 대부분의 문제는 해결되리라 봅니다. 

중요한 것은 ColdFusion서버가 Windows에서 구동되는 경우에는 이러한 문제가 거의 없다는 겁니다.(Windows가 좋다기보다 워낙 Windows는 모든 시스템의 문자셋을 해당 현지언어로 셋팅해버리기 때문에) 이 경우는 대부분 Linux에서 설치된 ColdFusion서버에서 발생하는 상황입니다. 혹시나  Linux나 Mac, Solaris와 같은 운영체제에서 ColdFusion을 구동하는 경우 한글처리에 도움되시길 바라는 마음에서 몇자 남깁니다. (물론, 중국어나 일본어도 동일하게 사용할 수 있겠죠?) 

 

ColdFusion 웹어플리케이션서버들은 JSP등과 마찬가지로 대부분 Java기반 WAS의 JVM메모리의 관리를 받습니다. 문제는 가비지콜렉션을 따로 할 필요까지는 없지만 한정된 자원(메모리)를 사용하는 특성상 메모리 회수가 빠르게 안될 경우 다중사용자가 접속하여 사용하는 웹사이트 등 메모리활용도가 높은 경우엔 서비스에 문제가 발생할 수 있죠. 그렇다면 어떻게 ColdFusion페이지에서 가비지콜렉션을 실행할 수 있을까요? 결론은 JSP 등과 동일하게 실행하면 됩니다.  

<!--- Java Obj 생성--->
<cfset javaSys = createobject("java", "java.lang.System")>
<!--- 가비지콜렉션실행 --->
<cfset javaSys.gc()>
<cfset javaSys.runFinalization()>

하지만 일반적으로 가비지콜렉션이나 파이널라이저를 쓰지말도록 권장하더군요. 실행중인 어플리케이션에 문제가 발생할 수 있으니까요. 다만 메모리의 사용량 등을 모니터링해서 적절히 어플리케이션에 필요한 메모리확보 및 시스템 점검을 위한 사전예방은 아무리 강조해도 지나치지 않습니다. 간단하게 ColdFusion에서 사용중인 메모리를 살펴보려면 다음과 같이 Pete Freitag의 포스트(http://www.petefreitag.com/item/115.cfm)와 같이 간단한 소스로 볼 수 있습니다. 

 

Powered by

© 2010-2018 NOOREE.COM