게시물 임시저장에 대한 생각... 정보
게시물 임시저장에 대한 생각...
본문
보통 게시판들이 작성글에 대한 임시저장글을 저장할때 일정시간주기로 서버로 보낸뒤에 저장합니다.
회원이라면 회원 고유값등으로 인덱싱을 해서 저장을 하겠지요.
근데 이 방법은 서버에 데이터를 보낸다라는 행동이기 때문에 서버부하와 대역부하등을 고려하여 임시저장타임을 좀 길게 잡게 될것이구요.
서버엔 언제 다시 사용될지 모르는 임시저장된 글을 위해 서버공간을 잡아먹고 있어야하죠.
그러다가 문득 떠오른생각인데 최신 html규격에 따라 IE8부터 그리고 현존하는 모든 브라우져(물론 모바일브라우져도 포함)가 지원하는 브라우져의 로컬 스토리지나, 로컬 데이터베이스를 활용하는 방법은 어떨까 생각을 해보았습니다.
어차피 임시저장의 목적은 글을 작성하다가 실수든, 시스템문제든 글을 저장하지 못하고 브라우져가 꺼졌을 때에 대한 대비책으로 활용되는 경우가 많은데
그 사용자의 브라우져에 임시로 작성글을 저장하게 되면, 거의 실시간으로 변경사항을 저장할 수 있습니다. (서버로 데이터를 보내는게 아니라 사용자 브라우져에 저장하는거니까요)
기존에 쿠키 개념과 비슷한데, 쿠키를 이용하지 않았던건 최대저장용량이 4KB로 작기 때문이죠. 게시판당 또는 게시물당 저장을 하기엔 턱없이 부족한 용량입니다.
그런데 로컬스토리지는 표준권고사항을 5MB까지, IE의 경우엔 10MB까지 저장할 수 있으며, 로컬 데이터베이스는 용량제한이 명시적으로 없습니다. 기가단위까지도 저장할 수 있죠.
로컬스토리지와 로컬 데이터베이스를 활용하는 첨부한 파일까지 HTML5의 FileAPI를 이용하여, BLOB 형태로 브라우져에다가 저장해둘 수 있고
사용자가 다시 글쓰기 창을 열었을 때 로컬스토리지 데이터를 이용해 간단하게 복원이 됩니다.
서버는 임시저장용 데이터베이스를 관리하지 않아도 되고, 로컬스토리지는 "영구"저장이기 때문에 명시적으로 해당 데이터를 지워라 신호를 보내기까지 지워지지 않죠. (물론 브라우져에서 제공하는 개인정보삭제 등의 기능을 활용하면 지워지지만, 글 쓰다가 브라우져가 다운되어 다시 들어왔을때 작성하던 데이터가 보이길원하는 사용자가 그 기능을 지울거라곤 생각하지 않습니다.)
<form data-use-autosave="true"> 같은 data attribute하나 정의해두고
$("form[data-use-autosave=true] input, textarea").on("keyup",function() {
// data-use-autosave=true 로 지정된 폼 안의 input과 textarea요소에서 키보드 입력 이벤트가 발생한다면
var form = $(this).parents("form"); // 해당 입력폼이 포함된 폼
window.localStorage[form.name] = form.serialize(); // 폼 이름을 키값으로 폼 전체 데이터 저장
});
이렇게 해두면 입력창에서 키보드를 칠때마다, 입력창이 포함된 폼의 전체 데이터를 실시간으로 브라우져 로컬 스토리지에 저장할 수 있습니다. (파일저장은 좀더 고민해보세요! ^^)
그리고 사용자가 다시 돌아왔을 때
$(document).ready(function() {
$("form[data-use-autosave=true]").each(function() { ; // 저장기능을 사용중인 폼을 찾습니다.
if (window.localStorage[$(this).attr("name")]) { // 해당 폼 이름을 가진 임시저장글이 있는지 검사
var data = JSON.parse(window.localStorage[$(this).attr("name")]); // 해당 데이터를 해석
for (name in data) {
$(this).find("input[name="+name+"], textarea[name="+name+"]").val(data[name]);
// 입력폼에 데이터를 다시 복원
}
}
})
});
예제 코드들은 생각만으로 코딩한거라 실제로 동작할지는 잘 모르겠습니다. 제 머리속에서는 동작할 것 같은데 말이죠. ^^
어쨋든 로컬스토리지를 활용하는 방법도 은근 괜찮을 것 같습니다. IE6, IE7은 과감히 버려버리구요.
0
댓글 19개

$("form[data-use-autosave=true]").on("submit",function() { window.localStorage[$(this).attr("name")] = null; });
카톡에다 줄줄줄 이야기 했더니 뭔가 길게 쓰고자하는 욕구가 사라졌어 ㅋㅋ
ㅋㅋㅋㅋ 일단 나는 좀더 멀리보고니, 좋은 활용법이다 생각해서 찬성.
G메일도, 애플도 페북도 이미 쓰고있으니
저두 만들어 보고픈 의욕이 나네요 ^^

신고가 접수된 글입니다.
신고 횟수가 1회 이상이면 글을 확인하지 못합니다.




차라리 임시저장 없으면 신경 안 쓸텐데, "임시저장되었을텐데, 왜 없지?" 라는 사용자경험의 혼선을 야기하는 빌미를 제공할 여지가 큽니다.
현실적인 측면에서 보면, 임시저장에 대한 스토리지 사용량에 대한 우려가 존재한다면 사실 사용자에 의한 기록 또는 포스팅 기반의 서비스 런칭 자체가 무리라는 생각입니다.
리비전 히스토리, 스냅샷, 아카이브 등 각종 사본생성 방식이 존재하는데 전혀 도입하지 못하거나 고려하지 않는다는 건 서비스 기획 단계에서 과실이라는 생각을 해봅니다.

이 팁?이나 생각은 자유게시판 같이 심혈을 기울여 적지 않는... 굳이 기기까지 변경해가며 적어야할 필요성이 없는 경우에 쓰는것이 맞다고 봅니다.
블로그 글 같이 작성하는데 시간이 걸리는 건 회원고유값을 기반으로 서버에 저장해서 클라우딩 하는 것이 맞고
비회원까지 글을 끄적거리는 자유게시판같은곳엔 굳이 필요가 없죠.
비회원들이 기기를 바꿔서 글을 적을때, 고유한 값은 무엇이 될까? 라는것도 고민을 해봐야하구요. 아이피같은 것도 결국엔 고유값이 되지 못하니까요. 예를 들어 컴퓨터에서 적다가 스마트폰 LTE하에서 적는다면 아이피가 달라지니까요.


과연 자유게시판같은에 글을 적는데 여러기기를 번갈아가며 쓸려고 하는 사람은 거의 없다고 봅니다.
물론 블로그 글이나 이런경우엔 심혈을 기울여 글을 적기때문에 그런 기능이 필요하겠지만요.

글의 전반적인 내용은 사이트관리자 관점에서 임시저장글이 쌓이는것에 대해 해결책을 쓴것이지 사용자가 글을 작성하는 방법론에 대해 제시한 것이 아닙니다.
ps.알쯔랑 친해서 두둔하는거 아닙니다. 깔려면 제가 가장먼저 까거든요 ... 하지만 조금만 읽어보면 금방 글의 관점과 대상이 누구인지 파악되는 글입니다.


이 팁의 대상이 명확하게 명시 되어있지 않다고 반론을 하신것이라 하셨는데
글 곳곳에 서버관리자 관점에서 쓰여지고 있다는 것이 눈에 띄고(혹시 읽을때 놓치셔서 어디어디 인지 표시해 달라하시면 하나하나 표시해드리겠습니다만), 그런 글 아래에 작성하셨던 '답변'을 보고 저도 댓글을 달게 된것입니다.
레이딘님의 댓글을 보면 굳이 '이런 경우'라고 표현하셨고, 본글의 내용을 간추려 요약하면 '이런경우'라는 것은 '서버관리자 관점'이 됩니다. 그렇게 되면 댓글이 이상항 방향으로 흘러버리죠. 왜냐면 서버관리효율을 위한 방법론에 사용자가 여기저기 글 쓰면 문제가 될수도 있다라고 적혀있으니까요.
그러니 반론이 아닌 이견이 되어버리죠.
온갖 골치아픈일을 이야기 하기전에 글 내용을 전반적으로 정확히 살펴볼 필요성도 있지요. 저는 제가 글을 쓸때, 남들이 어떻게 하면 내가 전하고자 하는 말을 쉽게 이해해줄까에 공을 들여 글을 쓰는 것도 좋아하지만,
상대방이 쓴 글을 이해가 될때까지 여러번 반복해서 읽고 생각해보는 것도 좋아합니다. 물론 레이딘님의 댓글도요.
그런데 아무리 읽어봐도 저는 레이딘님의 답글을 이렇게 이해했습니다.
서버 부하율을 줄이기 위한 클라이언트 스토리지 이용 방법론에 대하여,
엔드유저가 여러가지 디바이스를 사용하여 글을 이어 쓰는 경우에는 '서버 부하율을 줄이기 위한 클라이언트 스토리지 이용 방법'이 무용지물이다. 라고요.
당황하셨다고 하셨는데, 단순히 저를 두둔한다고 생각하시는 모습이 당황스럽습니다.
제 댓글에 두둔한다는 표현은 글이 무겁게 보일까봐 조금은 장난스럽게 표기한 것이였지만, 실제로도 주장글에 논리적 모순이 있거나, 토론의 소지가 있어보이면 진지하게 모든 관계를 떠나 최대한 아낌없이 반론하거나 주장을 펼입니다.
오해하지 않으셨으면 좋겠네요. : )
신고가 접수된 글입니다.
신고 횟수가 1회 이상이면 글을 확인하지 못합니다.

http://gura.so/devtalk/html/view/7