Docs |   A-  |  A+   | -/-

MIT Technology Review Korea 아카이브 작업 로그

작업 목적

https://www.technologyreview.kr/feed/ RSS를 읽어 SQLite3 데이터베이스 ~/docs/mit-reviws.dbmit_tech_reviews 테이블에 저장하는 Node.js 스크립트 archive-mit-tech-review-kr.js를 작성했다.

실행 방식은 다음과 같다.

node archive-mit-tech-review-kr.js

cron으로 주기 실행할 예정이므로 중복 저장 방지가 필요했고, 동일 기사 판별 기준은 url로 잡았다.

초기 구현 계획

초기 계획은 아래 기준으로 세웠다.

코드베이스 확인 내용

기존 프로젝트를 확인한 결과:

1차 구현

archive-mit-tech-review-kr.js를 새로 작성했다.

주요 동작:

첫 번째 문제: node:sqlite API 오해

처음 구현에서 db.transaction()을 사용했는데 실행 시 아래 오류가 발생했다.

오류: db.transaction is not a function

수정 내용:

수정 후 스크립트는 정상 실행되었다.

1차 실행 검증

실행 결과:

RSS 항목 10개 확인
신규 저장 10개
건너뜀 0개

DB 파일 생성 확인:

재실행 결과:

RSS 항목 10개 확인
신규 저장 0개
건너뜀 10개

이 시점까지는 중복 방지는 정상 동작했다.

두 번째 문제: descriptioncontent가 동일하게 저장됨

사용자 확인 요청으로 DB 값과 RSS 파싱 결과를 점검했다.

확인 결과:

실측 예시:

원인:

content 저장 로직 수정

수정 내용:

재동기화 후 확인 결과:

세 번째 변경: id 스키마 수정

이후 요구사항 변경에 따라 id를 자동 증가 정수가 아니라 RSS guid에서 추출하도록 변경했다.

예시:


위 경우 id = 47801

수정 내용:

테이블 재생성 및 재적재

사용자 요청에 따라 기존 mit_tech_reviews 테이블을 삭제하고 다시 생성한 후 RSS를 다시 채워 넣었다.

실행한 작업:

최종 스키마:

CREATE TABLE mit_tech_reviews (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  url TEXT NOT NULL UNIQUE,
  description TEXT,
  content TEXT,
  pub_date TEXT
)

재적재 결과:

RSS 항목 10개 확인
신규 저장 10개
기존 갱신 0개
건너뜀 0개

샘플 검증:

재실행 검증:

RSS 항목 10개 확인
신규 저장 0개
기존 갱신 0개
건너뜀 10개

최종 상태

최종적으로 archive-mit-tech-review-kr.js는 아래 요구사항을 만족한다.

비고

Ocilab 이력 수집 작업

이후 추가 요청으로 RSS 피드에 없는 기존 MIT 테크놀로지 리뷰 기사들도 보관 DB에 넣기 위해 Ocilab 보관 페이지를 크롤링하는 별도 스크립트를 작성했다.

대상 목록 페이지:

https://ocilab.mywire.org/articles/rss_list.php?page=1&sort=published_date&order=DESC&search=&items=100

수집 범위:

요구사항 변경 사항

작업 도중 요구사항이 다음과 같이 조정됐다.

이에 맞춰 기존 방향을 수정했다.

구현한 스크립트

새 파일:

주요 동작:

사용한 필드 매핑:

DB 경로 정리

작업 중 기존 RSS 스크립트 archive-mit-tech-review-kr.js의 DB 경로가 한때 ~/docs로 바뀌어 있었는데, 이후 사용자 요청에 따라 다시 ~/data/mit-reviws.db로 되돌렸다.

즉 최종적으로 두 스크립트 모두 같은 DB를 사용한다.

쓰기 권한 문제와 해결

처음 Ocilab 스크립트를 실행했을 때 아래 오류가 발생했다.

오류: attempt to write a readonly database

확인 결과:

디렉터리 권한을 바꾸지 않고 우회하기 위해 두 스크립트에서 DB 연결 직후 아래 pragma를 적용했다.

PRAGMA journal_mode=MEMORY;
PRAGMA temp_store=MEMORY;

이후 쓰기 테스트와 실제 적재가 정상 동작했다.

초기 적재와 보정

처음 실행에서는 일부 기존 RSS 적재 데이터와 Ocilab 데이터가 섞여 있어 결과가 중간 단계로 나타났다.

중간 실행 예시:

목록 항목 434개 확인
신규 저장 96개
기존 갱신 10개
건너뜀 328개

이후 url 기준 기존 행의 id도 Ocilab ID로 갱신하도록 업데이트 로직을 보강했다.

예를 들어 같은 URL의 기사라도 초기 RSS 적재 당시에는 워드프레스 p 값이 id였지만, 최종적으로는 아래처럼 Ocilab 목록 ID로 통일했다.

최종 검증 결과

최종 재실행 결과:

목록 항목 434개 확인
신규 저장 0개
기존 갱신 0개
건너뜀 434개

DB 최종 상태:

즉 Ocilab 1~5페이지의 기사들이 모두 mit_tech_reviews 테이블에 들어갔고, 재실행 시 중복 없이 안정적으로 동작한다.

Ocilab 작업 최종 상태

최종적으로 Ocilab 이력 수집 스크립트는 아래 요구사항을 만족한다.