바뀜

둘러보기로 가기 검색하러 가기
잔글
https://i.creativecommons.org/l/by-sa/4.0/80x15.png
[[사용자:Westporch|Westporch]]에 의해 작성된 [https://wiki.debianusers.or.kr/index.php?title=Drupal의_새로운_게시물_표시_기간_분석 Drupal의 새로운 게시물 표시 기간 분석]은 [https://creativecommons.org/licenses/by-sa/4.0/ 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스]에 따라 이용할 수 있습니다.
== 서론 ==
=== Drupal이란 ===
Drupal(드루팔)은 php로 작성된 CMS(Content Management Software) 이며 오픈소스 소프트웨어입니다. <ref>https://www.drupal.org/about</ref> 드루팔을 이용하면 웹사이트를 쉽게 만들 수 있습니다.
=== 테스트 환경 ===
가상머신에 가상머신(192.168.0.7)에 드루팔(v8.2.7)을 설치하여 테스트를 진행했습니다.
{| class="wikitable" style="text-align: center"
|+ 드루팔 계정 정보
! ID
! uid(user id)
! 구분
|-
</syntaxhighlight>
일반 사용자(계정명: seo, uid: 2)도 있지만 history 테이블에는 uid가 2인 투플은 존재하지 않습니다. 왜냐하면 해당 사용자가 해당 게시물(nid: 1)을 아직 읽지 않았기 때문입니다. http://192.168.0.7 에서 seo 계정으로 로그인한 후 해당 게시물을 읽으면 포럼 목록을 확인하면 아래 화면처럼 '1 new post' 메시지가 보입니다. [[File:1-1_one_new_post.png]] 'General discussion'을 클릭하면 아래처럼 관리자(westporch)가 작성한 글을 확인할 수 있습니다. 새로운 글이라고 말풍선 위에 별이 붙어있습니다. [[File:1-2_new_forum_topic_icon.png]] 글 제목 Test-01을 클릭해서 게시물의 내용을 확인했습니다. [[File:1-3_post_read.png]]  아래처럼 history 테이블에 timestamp가 기록됩니다.
<syntaxhighlight lang="sql" highlight="6">
</syntaxhighlight>
게시물을 다시 읽었는데도 여전히 아래 화면처럼 새로운 게시물로 표시됩니다.  [[File:1-1_one_new_post.png]] 하지만 history 테이블에서는 timestamp가 갱신되었습니다.
<syntaxhighlight lang="sql" highlight="6">
</syntaxhighlight>
일반 사용자 계정이 아닌 관리자 계정에서는 위와 같은 상황이 발생하지 않습니다. 즉 새로운 게시물을 읽으면 더 이상 새로운 게시물로 표시되지 않습니다. 일반 사용자 계정에서는 왜 이러한 일이 발생하는지 다음 항목에서 살펴보도록 하겠습니다.
== 분석 과정 ==
==== history_write 함수 ====
드루팔의 포럼에 대한 동작을 고려하면 history_write 함수는 사용자가 게시물에 대한 변경 작업을 수행했을 때 호출되는 것으로 보입니다.
 
<syntaxhighlight lang="php" line>
/**
</syntaxhighlight>
=== node.module node_mark 함수 ===
core/modules/node/node.module의 node_mark 함수에서 16~28번째 줄이 핵심입니다.
==== 16~18번째 줄 ====
사용자가 로그인하지 않았거나 history 모듈이 존재하지 않을 설치<ref>https://drupal.stackexchange.com/q/188322</ref>되지 않았을 경우에는 게시물을 읽음(MARK_READ)로 표시합니다. * 로그인한 사용자에 한해 게시물을 읽은 시각을 history 테이블에 timestamp로 저장하므로 로그인을 하지 않은 사용자에게는 게시물이 MARK_READ로 표시합니다.* 만약 현재 사용 중인 드루팔에서 history 모듈이 설치되지 않았다면<ref>https://drupal.stackexchange.com/questions/188322/how-can-i-check-if-a-module-is-enabled</ref> 게시물을 MARK_READ로 표시합니다.
==== 19~21번째 줄 ====
$cache[$nid]에 값이 설정되지 않은 경우에 가장 최근에 게시물을 읽었던 타임스탬프를 반환합니다. 드루팔 캐시에서 해당 게시물의 타임스탬프를 가져올 수 없다면 history_read($nid)의 리턴값은 0이 됩니다. 초기에 사용자가 게시물에 대한 직접적인 갱신 작업을 수행하지 않으면 기본적으로 $cache[$nid] == 0을 설정합니다.(일반 사용자일 경우에만 이 값으로 설정하는 것 같습니다. 관리자는 이 설정의 영향을 받지 않는 것 같습니다.) 또한 사용자가 해당 게시물 자체를 아예 읽지 않았다면 데이터베이스의 history 테이블에 관련 기록이 저장되지 않았으므로 history_read($nid)의 리턴값은 0입니다. 하지만 사용자가 게시물을 읽었음에도 불구하고 여전히 새로운 게시물로 표시되는 이유는 드루팔이 static cache를 사용하기 때문입니다.
로그인한 사용자가 게시물을 읽으면 데이터베이스의 history 테이블에는 timestamp가 갱신됩니다. 하지만 드루팔 캐시에는 사용자가 게시물을 읽은 timestamp 값이 곧바로 반영되지 않습니다. 앞서 설명한 것처럼 드루팔은 static cache를 사용하기 때문에 동일한 페이지를 요청하면 데이터베이스에 새로운 쿼리를 전송하지 않고 드루팔 캐시에 저장된 timestamp를 가져옵니다.
==== 22~24번째 줄 ====
19~24번째 줄에서 드루팔의 철학이 특성이 느껴집니다. static cache를 사용함으로써 로그인한 사용자가 단순히 게시물을 읽을 때는 DB에 쿼리를 전송하지 않고 캐시에 저장된 값을 가져다가 사용합니다. 이렇게 함으로써 성능을 향상시킬 수 있습니다. 앞서 설명한 것 처럼 초기에 사용자가 게시물에 대한 직접적인 갱신 작업을 수행하지 않으면 기본적으로 $cache[$nid] == 0을 설정합니다. 따라서 초기에 작성한 글을 보기만 하고 30일이 지나지 않은 글들은 기본적으로 새로운 게시물로 보여준다는 것을 알 수 있습니다.
$timestamp는 게시물을 읽은 마지막 시각입니다. 만약 $cache[$nid] == 0인 상황에서 $timestamp > HISTORY_READ_LIMIT 조건이 성립한다면 30일 이전의 타임스탬프 값(HISTORY_READ_LIMIT) 보다 큰 $timestamp의 값을 가진 게시물은 'new' 상태로 표시합니다. 따라서 30일 이후에는 $timestamp > HISTORY_READ_LIMIT 조건이 성립하지 않으므로 게시물의 상태를 더 이상 'new'로 표시하지 않습니다. 참고로 앞에서 설명한 history_cron 함수는 데이터베이스의 history 테이블에서 timestamp < HISTORY_READ_LIMIT인 투플을 삭제합니다
일반 사용자 계정으로 로그인한 상태에서 게시물을 읽었음에도 불구하고 새로운 게시물로 표시되는 것은 해당 게시물에 대한 직접적인 갱신이 발생하기 않았기 때문입니다. 드루팔은 static cache를 사용합니다. 따라서 단순히 새로운 게시물을 보는 것만으로는 데이터베이스에 쿼리를 전송하지 않습니다. 새로운 게시물로 표시된 글(포럼 토픽)을 이미 읽었어도 데이터베이스에 있는 데이터를 가져오는 것이 아니라 캐시에 있는 예전의 데이터를 읽어옵니다. 그러므로 여전히 새로운 게시물로 보이는 것 입니다.
만약 사용자가 게시물에 댓글을 작성하면 데이터베이스 데이터베이스에 쿼리를 전송하기 때문에 새로운 페이지 정보를 가져옵니다. 따라서 새로운 게시물이란 표시는 더 이상 나타나지 않습니다. 또한 30일이 지난 게시물은 더 이상 새로운 게시물로 표시되지 않습니다.
캐시를 사용하는 게 오히려 단점이라고 생각할 수 있지만 캐시를 사용함으로써 보조기억장치의 접근 횟수를 줄일 수 있고 결과적으로 오버헤드를 줄일 수 있습니다. 캐시는 드루팔에서만 사용하는 개념이 아닙니다. 캐시 서버를 구축하기 위해 Squid, Nginx등을 사용할 수도 있으며 우리가 사용하는 CPU 내부에도 캐시 메모리가 존재합니다.
드루팔이 static cache를 사용하는 것은 드루팔의 특성입니다. 게시물 자체를 이미 읽었는데도 여전히 새로운 게시물이라고 표시되는 것은 일반적인 다른 게시판과는 다르기 때문에 이상하다고 생각할 수도 있습니다. 하지만 이상한 것이 아닙니다. 드루팔의 게시판(포럼)은 일반적인 게시판과는 특성이 다릅니다. 예를 들어 드루팔로 운영 중인 게시판 목록에서 페이지의 맨 끝에 있는 글에 댓글을 작성하면 게시물이 첫 페이지의 상단으로 이동합니다. 즉 토론에 최적화된 게시판입니다. 새로 작성된 글을 갱신하지 않고 읽기만 하는 것은 할 경우 30일 동안 새로운 게시물로 보여주겠다는 것이 드루팔의 정책입니다. 얼핏 생각하면 history.module 파일에서 HISTORY_READ_LIMIT 상수의 값을 변경하면 새로운 게시물이란 알림 기간을 변경할 수 있어보입니다. 하지만 자바스크립트 파일 js_5NueHwEFU0msGYNoi3a_HJKlzseL7ZuA35_3UWhiNNI.js에서는 변수 이름으로 thirtyDaysAgo를 사용하고 있습니다. HISTORY_READ_LIMIT 상수의 값 변경 만으로는 알림 기간을 변경하는 것은 힘들지 않을까 싶습니다. 예를 들어 새로운 게시물 알림 기간을 일주일로 설정하여 이 기능이 동작한다고 해도 프로그램의 전체 구조가 파괴되어 나중에는 유지보수가 어려워질 것이라고 생각합니다.
얼핏 생각하면 history== 마치며 ==나름대로 분석한다고 했는데 잘못된 내용이 있을 수도 있습니다.module 파일에서 HISTORY_READ_LIMIT 상수의 값을 변경하면 새로운 게시물이란 알림 기간을 변경할 수 있어보입니다만약 정확하지 않은 부분이 있다면 [mailto:westporch@debianusers. 하지만 자바스크립트 파일 js_5NueHwEFU0msGYNoi3a_HJKlzseL7ZuA35_3UWhiNNIor.js에서는 변수 이름으로 thirtyDaysAgo를 사용하고 있습니다kr westporch@debianusers.or.kr]으로 메일을 보내주시거나 [https://debianusers.or. HISTORY_READ_LIMIT 상수의 값 변경 만으로는 알림 기간을 변경하는 것은 힘들지 않을까 싶습니다kr/node/273 게시판]에 글을 남겨주시면 감사하겠습니다. 예를 들어 알림 기간을 일주일로 설정하여 아울러 기능이 동작한다고 해도 프로그램의 전체 구조가 파괴되어 나중에는 유지보수가 어려워질 것이라고 생각합니다글이 도움이 되었다면 따뜻한 격려의 말 한마디 부탁드립니다.
== 참고 각주 ==

둘러보기 메뉴