# 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` ## 설치 ```bash pip install -r requirements.txt ``` ## 환경변수(.env) 프로젝트 루트에 `.env` 파일을 만들고 아래 값을 설정하세요. (`.env`는 git에 커밋되지 않습니다) ```dotenv DB_HOST=... DB_PORT=5432 DB_NAME=... DB_USER=... DB_PASSWORD=... TABLE=news_link ``` 옵션(선택): ```dotenv PORT=8021 DB_SCHEMA=public DEFAULT_AUTHOR_ID=1 DEFAULT_PAGE_SIZE=30 MAX_PAGE_SIZE=60 CACHE_TTL_SECONDS=3600 FAILED_TTL_SECONDS=300 ``` ## DB 스키마 `TABLE`(기본 `news_link`) 테이블에 아래 컬럼이 필요합니다. - `id` - `url` - `created_at` 예시(참고): ```sql CREATE TABLE IF NOT EXISTS news_link ( id SERIAL PRIMARY KEY, url TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` ## 실행 ```bash 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 각각 적용). ## ncue.net 연동 (ref 전달) `ncue.net`의 `/go`에서 아래와 같이 전달되는 값을 받아 `author_id(text)`에 저장합니다. - 로그인 사용자: `ref_type=email&ref=` - 비로그인 사용자: `ref_type=ip&ref=` 이 값은 최초 진입 시 쿼리스트링으로 들어오며, 이후 요청에서도 유지되도록 서버가 쿠키로 저장합니다.