목록2025/04 (13)
엔지니어 블로그

이전에 진행했던 프로젝트를 리펙토링 하려고 합니다. 4년 전에 프로젝트를 진행했는데, 구동되는 것에만 너무 매몰되어 작업하여 코드 구조나 확장성에는 큰 신경을 쓰지 않았습니다. 그래서 오늘부터 리팩토링 작업에 들어갑니다. 이번 포스트에서는 디렉토리 구조 정리와 DB 연결 코드 개선에 집중했습니다.1. 디렉토리 구조 개편디렉토리 구조 변경db 연결 손보기크롤러 코드 손보기(제일 문제)Django -> fastAPI로 변경먼저 프로젝트 구조입니다.왼쪽은 당시의 디렉토리, 오른쪽은 리팩토링 이후의 구조입니다:처음엔 나름 분리했다고 생각했지만...디렉토리 안에 그냥 파일만 덩그러니 있고, 역할 구분도 전혀 안 돼 있던 상황이었습니다.✅ 포인트기능별로 명확히 디렉토리 분리크롤링, 처리, 웹 기능이 어디에 있는지 ..
LinkedList 문제를 풀다가 코드를 개선하는 과정이 있어 글로 남깁니다.문제Q. 다음과 같은 두 링크드 리스트를 입력받았을 때, 합산한 값을 반환하시오. 예를 들어 아래와 같은 링크드 리스트를 입력받았다면,각각 678, 354 이므로 두개의 총합678 + 354 = 1032 를 반환해야 한다.단, 각 노드의 데이터는 한자리 수 숫자만 들어갈 수 있다.풀이그냥 단순히 순회하면서 값을 list에 담고, 자리수에 맞춰서 수를 만들고 더한다는 아이디어로 시작했습니다. 그래서 코드가 이모양입니다... 너무 생각없이 한 것 같았습니다. 중복되는 것은 왜이리 많으며 그냥 의식의 흐름대로 했던 것 같습니다. 바로 반성하며 코드를 재구성해보기로 했습니다.def get_sum_list(): list_1 = [..
ETL에서는 데이터 수집 및 처리 주기(빈도)가 매우 중요합니다. 수집 주기에 따라 어떤 처리 방식을 선택할지 달라지며, 대표적으로는 다음과 같은 세 가지 방식이 있습니다.BatchStreamingMicroBatch이번 글에서는 각 방식의 개념과 적절한 사용 사례를 정리해보려 합니다.1. Batch란?Batch는 데이터를 일정 시간 동안 모아서 한 번에 처리하는 방식입니다. 예를 들어, 매일 자정에 하루치 로그를 처리하거나, 데이터 양이 일정 기준을 넘었을 때 작업이 실행됩니다.특징데이터를 모아두었다가 일정 주기 또는 임계 데이터량을 기준으로 처리처리 시점에 시스템에 부하가 집중될 수 있음후속 작업이 처리 완료를 기다려야 하는 병목 가능성 존재사용 예시유저 행동 로그 기반 일간, 주간, 월간 보고서주기적..

GCP에 Kafka 3노드 클러스터 구축하기 (Terraform + Manual 설치)이번 프로젝트에서는 GCP 인스턴스를 활용해 Kafka 클러스터를 직접 구축해보았습니다. Terraform을 이용해 인프라를 구성하고, 각 인스턴스에 Kafka를 수동으로 설치하여 3개의 브로커로 구성된 Kafka 클러스터 환경을 만들었습니다.1. 인프라 사양 및 구성인프라는 다음과 같은 사양으로 구성했습니다. 무료 크레딧을 활용할 수 있었기 때문에 쾌적한 개발 환경을 위해 다소 여유 있는 스펙을 선택했습니다. Terraform을 이용해 GCP에 VM 인스턴스를 생성했습니다.Type: e2-standard-4vCPU: 4Memory: 16GBNode 수: 32. Kafka 설치 및 설정 (각 노드에서 진행)Java 설치..
Spark의 대표적인 장애인 Spill을 알아보고 어떤 설정을 통해 성능 튜닝이 가능한지 알아보려고 합니다. Spill을 알아보기 전에 Shuffle,Partition의 개념을 먼저 알아보겠습니다.PartitionPartition은 RDD를 구성하는 최소 단위 객체입니다. Spark의 성능,리소스 사용을 좌우하는 중요한 개념입니다. Partition은 여러 물리 노드에서 나누어 작업합니다. Spark의 최소 작업 단위를 Task라고 하고, 1개의 Task는 1개의 Partition에서 처리합니다. 또 1개의 Task는 1Core가 처리합니다. 즉, 1Task = 1Core = 1Partition입니다.Partition의 수는 Spark 성능을 크게 좌우합니다. Partition의 수가 Core수를 결정하..

Lazy Evaluation 이란?Spark에는 Lazy Evaluation이라는 기능이 있습니다. Transformation 작업을 실행하더라도 실제 변환은 Action 작업이 진행될 때 까지 미루는 기능입니다. 예를 들어 df.filter() 작업을 수행하더라도 실제 데이터 변환 작업은 진행되지 않고, df.show()를 수행할 때 변환이 진행됩니다.Lazy Evaluation을 사용하는 이유Lazy Evaluation을 사용하는 이유는 효율적인 자원 활용을 위함입니다. 데이터 변환을 미루는 행위를 통해 전체 DataFrame을 메모리에 올리는 작업을 피할 수 있습니다. 조금 더 자세히는 매 변환 작업마다 DataFrame을 메모리로 가져오는 것을 피하여 자원 활용의 효율성을 높이기 위함입니다.또 다..

Kafka를 통한 데이터 스트리밍 프로젝트를 진행하려고합니다.이번 프로젝트에서는 원유 및 금의 시세 변화가 S&P 500 지수 내 종목들의 섹터별 주식 가격에 미치는 영향을 분석합니다. 프로젝트 배경금융 시장에서는 원유와 금 가격의 변화가 경제 전반에 영향을 미치며, 특히 섹터별로 그 영향의 정도가 다를 수 있습니다. 본 프로젝트의 목적은 원유와 금 시세가 특정 섹터에 속한 기업 주가에 얼마나 영향을 주는지 분석하는 것입니다.아키텍처Postgresql의 데이터를 Python에서 Producer를 개발하여 수집합니다. raw 데이터를 CloudStorage에 저장 후 Spark Streaming으로 데이터를 처리, 완료 된 데이터를 BigQuery와 CloudStorage에 저장합니다. 마지막으로 Look..
에러 내용psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password suppliedpython에서 .env를 사용하여 postgresql에 연결하는 과정에서 위와같은 에러가 나왔다.from dotenv import load_dotenvclass Database(): def __init__(self): load_dotenv() print(os.getenv("DB_HOST")) 이런 식으로 print를 해봤을때 None이 프린트 되는 것으로 봐서 .env를 찾지 못하고 있는 것 같았다.해결 방법간단하게 해결했다. .env의 경로를 잡아주..