1

주제: RSS Reader 문제점

얼마전 리더기능 개선하다가 확인한 것입니다. 이미 패치가 된 것인지 어떤지는 잘 모르겠네요..
피드 업데이트시, 가져온 글의 퍼머링크가 {prefix}FeedItems 에 이미 존재하는 경우 업데이트된 것으로 보고 insert 하지 않게 되어있더군요.
문제는 같은 URL 이라 하더라도 {prefix}Feeds 와 더불어 {prefix}FeedItems 에 저장된 글이 사용자에게 보여질때는 해당 owner 를 체크합니다.

예를들어, owner 1 이 domain.com/rss 를 피드 등록해서 {prefix}Feeds 의 id 1 로 저장되었다고 가정합니다.
owner 2 역시 domain.com/rss 를 등록하게 되면 이것은 {prefix}Feeds 의 id 2 인 피드로 저장이 됩니다.
owner 1 이 먼저 피드 업데이트를 하는 경우, 이 글들은 {prefix}FeedItems 에 feed 1 로 등록이 되지만 이 글들을 owner 2 에서는 가져오지 못합니다.
그러나 owner 2 가 업데이트 과정을 진행하면 가져온 글들은 이미 등록되어 있는것으로 인식되어 insert 가 일어나지 않습니다.

blog/owner/reader/update/index.php 의 316번째 줄에서,

if($id=fetchQueryCell("SELECT id FROM {$database['prefix']}FeedItems WHERE permalink='{$item['permalink']}'")){

구문을

if($id=fetchQueryCell("SELECT id FROM {$database['prefix']}FeedItems WHERE feed='{$feedId}' and permalink='{$item['permalink']}'")){

로 바꾸어주어야 합니다.

다만 이 방법은 db 자원을 낭비할 수 있기 때문에 썩 좋은 방법은 아닙니다. 그러나 permalink 를 기준으로 삼아 자료를 공유하도록 하려면 {prefix}Feeds 를 비롯한 피드 정보 처리 방법을 모두 바꾸어 주어야 하기 때문에 일단 이 정도로도 특별한 문제없이 사용할 수 있습니다.

2

답글: RSS Reader 문제점

어렵네요...
위와 같은 식으로 사용자마다 겹치는 피드를 따로 업데이트 하게 되면, 예를 들어 사용자가 백여명정도 되는 태터에서 모든 사람이 한 블로그를 등록된 경우 그 블로그로부터는 백여개의 피드 데이터를 따로 읽어 저장하게 됩니다. 그 경우는 db자원의 문제뿐만 아니라 서버에 걸리는 로드 때문에 본질적으로 다중사용자를 위한 리더 구현이 어렵게 될 겁니다.

현재 model 코드의 reader부분을 들여다보고 있는데,  같은 주소를 다중등록할 수 있게 되어 있고, 각 주소마다 소유자가 한 명씩 저장되게 되어 있군요. 단순히 하나의 주소는 한 번만 등록되게 하고 소유자 필드를 일차원 배열로 바꾼다고 해도, 사용자마다 피드 이름등을 다 다르게 지정할 수 있기 때문에 결국 rss링크를 제외한 모든 부분에 다중 사용자에 대한 모든 처리를 해야 할 것 같습니다. laziel님의 말씀대로 이걸 개선하려면 상당히 힘들겠네요.

가장 효과적인 방법은 피드 등록정보가 저장되는 부분과 피드를 읽어와 저장하는 부분이 분리되고, 그 사이의 커뮤니케이션을 제어하는 것이 좋을 것 같기는 한데, 사실 구조를 거진 뜯어고치는 법이라 엄두가 안나서 쳐다보고 있는 중입니다.  sad

...결국 귀찮으면 저 방법이 제일 빠르긴 하겠습니다 ㅠ_ㅠ

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

3

답글: RSS Reader 문제점

DB 필드에 손을 전혀 대지 않고 수정하는 방법이 하나 있다면, 피드를 추가할 때 마다 기본적으로 reader라는 사용자로 필드셋이 만들어진 후, 추가한 사용자 이름으로 하나의 필드셋을 더 추가하고, 여기의 피드 데이터에는 조금 전에 생성된 reader라는 사용자의 피드로의 레퍼런스를 대신 저장하는 방법이 있을 것 같습니다. 이 경우, 피드 갱신은 reader라는 사용자에 한해서만 실행되게 하고 다른 사용자의 필드는 reader를 참조하게 하는 방법이 있을 수 있겠네요.

이 방법이 가장 DB 구조에 손을 안 대고 구현할 수 있는 방법일 것 같습니다. (하지만 역시 참조하는 사용자가 없어질 경우 그 피드데이터를 리더에서도 삭제할 때의 속도 문제점을 해결해야 하고, 또한 백업(지금 리더도 백업되나요?) 시 어떻게 처리할 것인지에 대한 수정도 동시에 들어가야 할 것입니다.)

일단 아이디어는 이정도까지 입니다. smile

...역시 젤 속 편한 것은 사용자별로 같은 피드를 다중으로 받게하는 것일까요 =_=;
(하지만 비슷한 성향의 사람들이 서로 같은 서버를 쓸 경향이 많다고 생각해보면 이 경우 정말 비효율적일텐데요...)

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

4

답글: RSS Reader 문제점

말씀하신 그대로입니다 neutral
백업은 차치하더라도 일단 프로그램상으로 처리하게 되면 번거로운건 둘째치더라도 속도가 썩 만족스럽지 못할거예요.
그렇다고 같은 피드가 수북수북 쌓이는것도 썩 바람직하지 않으니..

피드 이름의 임의 지정을 포기하고, 해당 피드쪽에서 지정된 타이틀과 작성자명을 반영하도록 해보면 어떨까요.
새로운 피드를 등록하려 하는 경우 xmlURL 을 기준으로 기존 피드로부터 검색한 뒤 동일한것이 있으면 확인후 같은 피드 정보를 얻도록 말이지요.
{prefix}Feeds 쪽에 대한 제어와 리더에서 {prefix}FeedItems 를 읽는 부분만 손을 본다면 그나마 무난하지 않을까 하는 생각도 하고 있습니다.

다중사용자를 위한 rss 리더라는게, 생각보다 참 어려운 문제로군요..