dsyoon 7df7c35434 fix: 링크 저장 및 에러 메시지 개선
- created_at 기본값이 없어도 저장되도록 NOW()로 기록
- API 오류 발생 시 detail을 함께 표시

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 11:43:03 +09:00
2026-02-07 16:37:37 +09:00

News Link

뉴스/아티클 URL을 저장하고, 제목/요약/대표 이미지를 추출해 카드 형태로 보여주는 Flask 웹앱입니다.

구성

  • app.py: Flask 서버, DB 연결, 메타데이터 추출, API
  • templates/index.html: 초기 화면(SSR) + 모달 UI
  • static/app.js: 무한 스크롤(30개 단위), URL 붙여넣기 파싱, 추가/갱신
  • static/styles.css: 스타일
  • static/placeholder.svg: 이미지 없을 때 표시용

요구사항

  • Python 3.x
  • PostgreSQL
  • (권장) 미니콘다 환경: ncue

설치

pip install -r requirements.txt

환경변수(.env)

프로젝트 루트에 .env 파일을 만들고 아래 값을 설정하세요. (.env는 git에 커밋되지 않습니다)

DB_HOST=...
DB_PORT=5432
DB_NAME=...
DB_USER=...
DB_PASSWORD=...
TABLE=news_link

옵션(선택):

PORT=8021
DEFAULT_PAGE_SIZE=30
MAX_PAGE_SIZE=60
CACHE_TTL_SECONDS=3600
FAILED_TTL_SECONDS=300

DB 스키마

TABLE(기본 news_link) 테이블에 아래 컬럼이 필요합니다.

  • id
  • url
  • created_at

예시(참고):

CREATE TABLE IF NOT EXISTS news_link (
  id SERIAL PRIMARY KEY,
  url TEXT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

실행

python app.py

기본 접속 주소:

  • http://localhost:8021

API

  • GET /links?limit=30&offset=0
    • 30개 단위로 링크를 가져옵니다(프론트 무한 스크롤).
    • 응답:
      • items: 링크 배열
      • next_offset: 다음 요청 offset
      • has_more: 다음 페이지 존재 여부
  • POST /links
    • body: { "url": "https://..." }
    • URL을 DB에 저장하고 메타데이터를 추출해 반환합니다.

동작 메모

  • 초기 화면은 DB에서 첫 페이지(기본 30개) 만 가져와 SSR로 즉시 렌더링합니다.
  • 메타데이터 추출은 캐시를 사용합니다(성공/실패 TTL 각각 적용).
Description
No description provided
Readme 120 KiB
Languages
Python 58.1%
JavaScript 24%
HTML 15.6%
Shell 1.2%
CSS 1.1%