목록개인 프로젝트 (15)
엔지니어 블로그
아키텍처가 나왔으니 개발을 진행합니다.1. 크롤러 설계 방향수집 대상: 보배드림, K카 등 주요 중고차 거래 사이트설계 목표비동기 기반의 효율적인 수집관심사 분리(fetch / parse / load)사이트 추가 시 최소 변경만으로 확장 가능2. 디렉토리 구조scraper/├── core/ # 공통 fetch, parse, load 인터페이스 정의│ ├── fetcher.py│ ├── parser.py│ ├── loader.py│ └── __init__.py├── fetcher/ # 실제 페이지 요청 구현 (Playwright 등)│ └── playwright_fetcher.py├── parser/ # 사이트별 파서..

이전 글에서 DB 연결 코드를 손 봤었는데, 암만 생각해도 이전과 동일한 구조를 벗어나 좀 더 확장된 아키텍처를 가져가고 싶은 욕심에 아키텍처를 전면 수정하여 진행하기로 했습니다.각 단계에 대한 설명은 아래와 같습니다.1. 데이터 수집 - Python기존의 데이터 수집은 Python의 Requests,BeautifulSoup을 통해 진행됐습니다. 완전 동기 방식으로 수집 되고 있어 수집 속도가 매우 느렸습니다. 속도 향상을 위해 async 방식과 Playwright 라이브러리를 선택했습니다. Playwright는 headless browser 기반이며, 비동기 병렬 처리에 특화된 도구입니다. 병렬 수집을 도입하여 더욱 빠른 속도의 수집을 기대하고있습니다.2. Buffer를 통한 디커플링 - Redis병렬..

이전에 진행했던 프로젝트를 리펙토링 하려고 합니다. 4년 전에 프로젝트를 진행했는데, 구동되는 것에만 너무 매몰되어 작업하여 코드 구조나 확장성에는 큰 신경을 쓰지 않았습니다. 그래서 오늘부터 리팩토링 작업에 들어갑니다. 이번 포스트에서는 디렉토리 구조 정리와 DB 연결 코드 개선에 집중했습니다.1. 디렉토리 구조 개편디렉토리 구조 변경db 연결 손보기크롤러 코드 손보기(제일 문제)Django -> fastAPI로 변경먼저 프로젝트 구조입니다.왼쪽은 당시의 디렉토리, 오른쪽은 리팩토링 이후의 구조입니다:처음엔 나름 분리했다고 생각했지만...디렉토리 안에 그냥 파일만 덩그러니 있고, 역할 구분도 전혀 안 돼 있던 상황이었습니다.✅ 포인트기능별로 명확히 디렉토리 분리크롤링, 처리, 웹 기능이 어디에 있는지 ..

GCP에 Kafka 3노드 클러스터 구축하기 (Terraform + Manual 설치)이번 프로젝트에서는 GCP 인스턴스를 활용해 Kafka 클러스터를 직접 구축해보았습니다. Terraform을 이용해 인프라를 구성하고, 각 인스턴스에 Kafka를 수동으로 설치하여 3개의 브로커로 구성된 Kafka 클러스터 환경을 만들었습니다.1. 인프라 사양 및 구성인프라는 다음과 같은 사양으로 구성했습니다. 무료 크레딧을 활용할 수 있었기 때문에 쾌적한 개발 환경을 위해 다소 여유 있는 스펙을 선택했습니다. Terraform을 이용해 GCP에 VM 인스턴스를 생성했습니다.Type: e2-standard-4vCPU: 4Memory: 16GBNode 수: 32. Kafka 설치 및 설정 (각 노드에서 진행)Java 설치..

Kafka를 통한 데이터 스트리밍 프로젝트를 진행하려고합니다.이번 프로젝트에서는 원유 및 금의 시세 변화가 S&P 500 지수 내 종목들의 섹터별 주식 가격에 미치는 영향을 분석합니다. 프로젝트 배경금융 시장에서는 원유와 금 가격의 변화가 경제 전반에 영향을 미치며, 특히 섹터별로 그 영향의 정도가 다를 수 있습니다. 본 프로젝트의 목적은 원유와 금 시세가 특정 섹터에 속한 기업 주가에 얼마나 영향을 주는지 분석하는 것입니다.아키텍처Postgresql의 데이터를 Python에서 Producer를 개발하여 수집합니다. raw 데이터를 CloudStorage에 저장 후 Spark Streaming으로 데이터를 처리, 완료 된 데이터를 BigQuery와 CloudStorage에 저장합니다. 마지막으로 Look..

이전에 생성해둔 api 서버를 호출해서 데이터를 PubSub에 Publish 하는 작업을 할 차례다. 필요 작업은 다음과 같다.1.Airflow Connection 등록-> Airflwo가 PubSub에 접근할 수 있도록 Connection을 등록2.Publish Task 작성-> DAG에 데이터를 Publish 할 수 있도록 task 작성 1.Airflow Connection 등록먼저 connection 등록이다. Airflow 상단 메뉴에 Admin-Connection을 클릭하면 Connection 등록이 가능하다. + 버튼을 눌러 등록해보자 + 버튼을 눌러보면 다음과 같은 화면이 나온다. 여기서 필수로 작성해야 하는 것은 * 처리 되어있다. 추가로 Keyfile 내용을 작성하면 된다. Keyfile..

프로젝트를 하던 중 지금 토이 프로젝트를 하고있지만, 현업에서 진행하는 프로젝트라면 지속적으로 쌓이는 데이터의 양이 엄청날 것 같았다. 그래서 현재 Spark에서 Bigquery로 데이터를 전송하는 부분을 손보게 되었다. 이전 아키텍처와 거의 동일하고, 중간에 Cloud Storage가 들어갔다. 하단의 Base Data Load 부분은 정적 데이터의 적재를 뜻한다. 실시간으로 생성되는 데이터가 아닌, 현업이라면 DB에 이미 존재했어야 할 유저 정보, 지리정보 등의 데이터가 포함된다. 이 데이터를 업로드 하는 부분에서 고민이 생겼다. 현업에서 처리한다면 어떻게 했어야할까??Static한 데이터기 때문에 변화가 자주 없는 탓에 GCP 콘솔에서 직접 업로드 할까 생각했지만, 현업이라는 상황을 가정해봤을 때..

인프라 구성을 마친 후 데이터 Source가 되는 API 서버를 구축하기로 했다. 원래 DB에 저장 후 가져오는 방법을 사용하려고 했으나 그 방법은 자주 접해본 방법이기 때문에 API 서버를 직접 구축하고 데이터를 수집하는 방식으로 결정했다. FastAPI를 사용하고 Postgresql과 연동하여 API를 구축했다. GET 메서드만 사용하는 간단한 서버이기 때문에 크게 어려움은 없었다. 고민한 지점은 한가지가 있었다.준비 된 데이터를 수집하는 주기는 어느정도로 잡아야 하는가?주기를 잡은 후에 어떤 기준으로 데이터를 가져 올 것인가?기존에 구상했던 것은 실제 웹 서버가 있고 사용자 행동 로그가 발생하는 것과 같은 방식이었다. 하지만 기준으로 발생 기준으로 잡을 컬럼이 애매했다. 그래서 ID 값을 따로 만..