Entries Tagged as Adobe ColdFusion

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)와 같이 간단한 소스로 볼 수 있습니다. 

 

좀 지난 내용이기는 하지만 소식 전해드립니다. Russ Michaels가 만든 CF LIVE(http://cflive.net)라는 웹사이트에서 간단하게 ColdFusion 코드(CFML)를 입력하고 테스트해 볼 수 있는 기능을 선보였습니다. Railo로 구축되어 운영중이며, Adobe ColdFusion 9와 Railo 4에서의 실행결과를 바로 테스트해 볼 수 있습니다.

물론 몇몇 보안상 중요한 CFML 태그와 함수는 사용할 수 없지만 간단하게 ColdFusion 서버의 설치 없이 코드를 테스트해보기엔 좋은 서비스인거 같습니다. 다만, Database 연결 등 일부 기능은 사용할 수 없는 것 같습니다. 정말로 두 ColdFusion간의 태그와 함수적 특성을 파악하는 정도로 보면 적당할 것 같습니다.

Powered by

© 2010-2018 NOOREE.COM