이전 포스팅
2023.11.19 - [프로젝트/GeekNews 대시보드 구성하기] - 2. Typescript로 GeekNews의 RSS 읽어오기
2023.11.22 - [프로젝트/GeekNews 대시보드 구성하기] - 3. Typescript 로 html 데이터 파싱하기
2023.11.28 - [프로젝트/GeekNews 대시보드 구성하기] - 4. Typescript + PostgresDB - DB 연결 및 데이터 읽어오기
필요 배경 지식
- PostgresDB 기본 쿼리문 사용하는 방법
- 이전 포스팅의 지식들
GeekNews 데이터를 DB에 Update하는 코드 추가
해당 코드는 GPT에게 물어보면 쉽게 추가가 된다.
SQL 문법 및 이전에 생성한 Table의 형태에 맞추어 INSERT query 문을 만들어서
pg 라이브러리의 pool.query()의 parameter에 아래와 같이 넣어주면 된다.
// rssFeedParser.ts
import RSSParser from 'rss-parser';
import JSDOM from 'jsdom';
import { Pool} from "pg";
const parser = new RSSParser();
// Create a new pool
const pool = new Pool({
user: 'admin',
host: '192.168.185.163',
database: 'newsdb',
password: 'admin',
port: 5432,
});
export async function parseRSSFeed(url: string) {
try {
const feed = await parser.parseURL(url);
console.log(feed.title);
for (const entry of feed.items) {
console.log(entry.title + ':' + entry.link);
console.log("content : \n" + entry.content);
const domParser = new JSDOM.JSDOM(entry.content);
const docli = Array.from(domParser.window.document.querySelectorAll('li')).map((li: { textContent: any; }) => li.textContent);
const docp = Array.from(domParser.window.document.querySelectorAll('p')).map((p: { textContent: any; }) => p.textContent);
console.log(docli)
console.log(docp)
// 여기 아래 부분 코드를 추가함을 통해서 DB에 데이터를 insert 하는 기능을 추가했다.
const insertQuery = {
text: 'INSERT INTO news(title, contents, link) VALUES($1, $2, $3)',
values: [entry.title, docli, entry.link], //`{${docp.join(',')}}`
}
try {
const res = await pool.query(insertQuery);
console.log(res);
} catch (err) {
console.error(err);
}
}
} catch (error) {
console.error(error);
} finally {
await pool.end();
}
}
이대로 실행하면 정상적으로 DB에 데이터가 저장될 것을 기대할 수 있다.
주의 사항
아무 생각없이 아래와 같이 짰다가 async 함수의 특성을 정확히 이해 못해서 두개의 함수가 둘다 실행되지 않음을 알게되었다.
import { parseRSSFeed } from './rssFeedParser';
import { queryDatabase} from "./database";
const feedUrl = 'https://news.hada.io/rss/news'; // 실제 RSS 피드 URL로 대체
parseRSSFeed(feedUrl).then(() => {
console.log('RSS 피드 읽기 완료');
});
queryDatabase().then(() => {
console.log('DB 쿼리 완료');
});
이렇게 index.ts를 (정확히는 node dist/index.js 커맨드) 실행하게 되면
parseRSSFeed() 함수만 실행되는것을 알 수 있다.
그 원인은 Asynchronous한 처리 방식에 있는데,
Async A()와 B() 함수가 있을때
main 함수에서 A(), B() 별도의 처리 없이 둘 다 호출 하게 되면 A(), B() 중
함수의 실행 순서가 보장 되지 않으며, 거의 동시에 실행된다.
결국 Async/Await 패턴을 사용하지 않으면 먼저끝나는 함수가 끝날때 프로그램이 종료 되어버리는 문제가 있다.
따라서, 위의 코드에서 Async/Await 패턴을 추가해서 이를 방지해야 한다.
import { parseRSSFeed } from './rssFeedParser';
import { queryDatabase} from "./database";
const feedUrl = 'https://news.hada.io/rss/news'; // 실제 RSS 피드 URL로 대체
(async () => {
try {
await parseRSSFeed(feedUrl)
.then(() => {
console.log('RSS 피드 읽기 완료');
}).catch(error => {
console.error('An error occurred:', error);
}
);
await queryDatabase().then(() => {
console.log('DB 쿼리 완료');
}).catch(error => {
console.error('An error occurred:', error);
});
} catch (error) {
console.error('An error occurred:', error);
}
})();
위와 같이 Async/Await으로 감싸주어 해결하면 정상적으로 처리가 가능하다.
처리 이후에 실제 DB에 데이터가 들어갔음을 아래와 같이 확인할 수 있다.
Reference
- Copilot 및 GPT 활용한 코드 결과
'프로젝트 > GeekNews 대시보드 구성하기' 카테고리의 다른 글
6. PostgreSQL 데이터를 Grafana에 띄우기 (마지막) (0) | 2023.11.30 |
---|---|
4. Typescript + PostgreSQL - DB 연결 및 데이터 읽어오기 (1) | 2023.11.28 |
3. Typescript 로 html 데이터 파싱하기 (2) | 2023.11.22 |
2. Typescript로 GeekNews의 RSS 읽어오기 (0) | 2023.11.19 |
1. Typescript 개발 환경 설정하기 (0) | 2023.11.18 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.