액티브스퀘어가 적용된 게시판에서 입력된 데이터의 처리 방법은 일반 게시판의 처리 방법과 유사합니다. 다만 액티브스퀘어에서 작성된 내용만 다르게 처리됩니다.
서버에서의 데이터 처리
액티브스퀘어에서 처리되는 파일의 형태는 다음과 같습니다.
1 |
데이터를 직접 DB(또는 파일)에 저장하는 방법 |
2 |
MIME 디코더를 통해 데이터를 파일과 본문으로 분리하여 저장하는 방법 |
게시판의 경우 작성된 분문은 텍스트이므로 단순히 HTML 태그를 분리하거나 특수 기호 등을 처리하여 DB에 저장합니다. 만약 첨부 파일이 있을 경우 이를 DB에 넣을 수도 있고, 별도의 업로드(Upload) 디렉토리에 마련된 규칙에 따라 저장하는 방법이 있습니다.
액티브스퀘어에서 만든 데이터는 텍스트, HTML, MIME 형태로 나눌 수 있으며, 그 중 MIME 형태가 액티브스퀘어의 모든 기능을 포함하고 있는 경우라 할 수 있습니다. MIME 형태는 데이터에서 여러 가지 형태의 파일, 개체, 플래시 파일과 본문 HTML을 같이 전송받을 수 있습니다. 하지만 이와 같이 MIME 형태의 데이터를 받아올 경우 액티브스퀘어가 적용되지 않은 게시판에서는 처리할 수 없습니다.
액티브스퀘어가 적용되지 않은 게시판
만약 MIME 형태의 데이터를 DB에 저장한다면, Internet Explorer의 경우 MHT 파일을 지원하지만, 모든 데이터의 내용을 Internet Explorer에 전송할 때 HTTP Header에 MIME Message 타입으로 줄 경우 디코딩(Decoding)하여 표시할 수 있습니다. 하지만 특정한 포맷(Format)의 형태로 게시물을 표현하기는 어렵습니다. 또한 DB에서 본문에 대하여 검색할 수 있는 방법도 없습니다. 만약 DB를 MY-SQL을 사용하는 경우라면 Full Text Search를 실행하거나, Where절의 like 구문으로 검색하기가 어렵기 때문입니다. 따라서 MIME 데이터를 직접 DB에 저장하거나, 파일 형태로 보관하는 방법은 시스템의 효율을 좋지 않게 하는 방법입니다.
액티브스퀘어가 적용되는 게시판
MIME 데이터를 HTML 본문과 포함된 파일을 분리하여 저장하는 방식이 가장 일반적이며, 효율적입니다. HTML의 경우도 DB에 저장한 후 포함된 파일은 별도의 디렉토리에 저장하는 방법을 권장합니다. (만약 포함된 파일을 DB에 넣을 경우 몇가지 DB의 형태에 따라 여러 가지 작업을 수행해야 합니다.)
액티브스퀘어에서 MIME Encoded Data를 Internet Explorer로 전달받아서 이를 Form Data로 웹 서버에 전달하면, 웹 서버는 서버사이드 스크립트(Server-Side Script)에서 분리하는 작업을 통해서 HTML과 포함된 파일로 분리합니다. HTML은 DB에 저장되고, 포함된 파일은 File System에 저장됩니다.
|
소스에서의 처리
다음은 게시판 글쓰기 소스의 일부분입니다.
// 업로드할 위치와 MIME에서 대치할 LINK를 만듭니다. uploadPath = BBS_DATA_PATH + "/" + msgno + "/"; uploadUrl = BBS_DATA_URL + "/" + msgno + "/";
makeDir = new File(uploadPath); // 업로드할 디렉토리 생성 makeDir.mkdir(); makeDir = null;
// 파일 업로드 하기 for(i = 0; i < myUpload.getFiles().getCount(); i++) { if(!myUpload.getFiles().getFile(i).isMissing()) // 업로드 할 파일이 있으면 { outFile = new FileOutputStream(uploadPath + myUpload.getFiles().getFile(i).getFileName()); for(j = 0; j < myUpload.getFiles().getFile(i).getSize(); j++) outFile.write((int)myUpload.getFiles().getFile(i).getBinaryData(j)); outFile = null; sql = "insert into filelist ( msgno, filename ) values ( "; sql += msgno + ", "; sql += "" + myUpload.getFiles().getFile(i).getFileName() + ") "; stmt.executeQuery(sql); } }
// 사용자가 입력한 게시물 내용 가져오기 String author = myUpload.getRequest().getParameter("author"); String email = myUpload.getRequest().getParameter("email"); String homepage = myUpload.getRequest().getParameter("homepage"); String subject = myUpload.getRequest().getParameter("subject"); String msgbody = myUpload.getRequest().getParameter("contents"); String passwd = myUpload.getRequest().getParameter("pass"); String mode = request.getParameter("mode");
// MIME 디코딩 하기 NamoMime mime = new NamoMime(); mime.setSaveURL(uploadUrl); mime.setSavePath(uploadPath); mime.decode(msgbody); // MIME 디코딩 mime.saveFile(); // 포함한 파일 저장하기 msgbody = replace(mime.getBodyContent(), "", ""); |
msgNo은 현재 저장할 게시물의 일련 번호입니다. 게시판에서는 이 일련 번호로 구분하여 게시물이 저장될 디렉토리를 특정 디렉토리 아래에 만들 게 됩니다. 그리고 텍스트에 포함된 파일을 이 디렉토리에 저장하고, HTML 본문에 표시된 파일의 링크를 저장한 링크로 변환합니다. 그러므로 HTML 파일을 사용자에게 전송하여도 별도의 처리가 필요없이 포함된 파일을 볼 수 있습니다.
JSP에서의 MIME 디코딩을 위해 나모에서 배포하는 com.namo.NamoMime 패키지를 이용합니다. 이 패키지는 액티브스퀘어에서 생성한 MIME 데이터를 디코딩 해 주는 자바 클래스이며, JSP, Servelet, Java에서 사용할 수 있습니다.
NamoMime 패키지를 JSP나 Servlet에서 사용하려면 톰켓의 경우, 해당 컨텍스트 디렉토리 아래에 있는 WEB-INF/classes 에 com.namo.NamoMime 클래스를 복사해야 합니다. 다시 말해 WEB-INF/classes/com/namo/ 에 JSP와 같이 배포한 클래스를 복사해야 합니다.
또한 NamoMime 패키지는 MIME을 디코딩하기 위해서 Java Mail 1.2 이상의 패키지를 사용합니다. 보다 자세한 사항은 http://java.sun.com 에서 Java Mail에 부분을 참고하십시오.
NamoMime은 다섯개의 메소드를 지원하는데 각각의 사용방법과 역할은 다음과 같습니다.
public NamoMime()
기본 생성자입니다.
public void mime.setSaveURL(String uploadUrl)
본문에 포함된 파일의 기본 URL, 즉 파일명을 제외한 URL을 만듭니다.
public void mime.setSavePath(String uploadPath)
MIME 인코딩된 파일을 uploadPath에 저장합니다. 이 때 uploadPath는 절대 주소를 가지고 있는 것이 좋습니다.
public bool mime.decode(String msgbody)
주어진 MIME 인코딩 데이터를 디코딩합니다.
여기서 msgbody는 MIME 인코딩된 문자열입니다. 이 msgbody는 내부에서 ISO-8859-1로 변환해서 처리하므로 매개변수를 따로 인코딩해서는 안됩니다. 이 함수의 리턴값은 true/false로 각각 디코딩 성공/실패를 의미합니다.
public void mime.saveFile()
MIME 에 포함된 파일을 (본문 제외) 주어진 uploadPath 에 저장합니다.
public String getBodyContent()
본문을 반환합니다. 만약 본문 중에 CID가 있는 경우 CID를 setSaveURL에서 지정한 uploadUrl로 바꿉니다. 이때 파일 명은 MIME에 지정된 파일명을 사용합니다.
NamoMime을 이용한 디코딩 순서는 다음과 같습니다.
1. 클래스 생성합니다.
2. CID를 대체할 기본 URL을 지정합니다.
3. 파일을 저장할 폴더를 지정합니다.
4. MIME 인코딩 데이터를 디코딩합니다.
5. 디코딩한 파일을 저장하고 본문을 가져옵니다.