728x90
이번 포스팅에서는 MongoDB 다중 업데이트 로직을 구현하면서 마주한 성능 개선의 필요성과 이를 풀어나간 방법들을 공유하고자 한다. 사용 환경은 다음과 같다.Spring 2.3.2MongoDB 5.0JDK 1.8.0Kotlin# 최초 기능 개발 - saveAll()해당 업무에서는 상태를 기반으로 Entity를 관리하며 비즈니스 로직을 태우는 프로세스를 구축하는 것이 필요했다.신규로 생성된 데이터들을 PENDING으로, 처리를 진행할 때는 PROGRESS, 처리 다 되면 SUCCESS & FAILED 등으로 관리한다. 그중 처리를 진행할 때 대상들을 일괄적으로 PENDING -> PROGRESS로 변경하는 작업이 필요했는데, 해당 과정에서 여러개의 데이터에 대한 업데이트를 진행했다. 최초 로직은 가장 ..
# 서론최근 개발한 데이터 파이프라인을 운영 환경에 적용하기 전 요구사항을 반영하는 과정에서, Airflow 스케줄링을 걸 때 catchup 값을 잘못 설정해서, 과거부터 현재 시점 사이에서 실행되지 않았던 DAG가 모두 실행되는 상황이 발생했다.catchup 설정 자체는 알고 있었지만, 버전업이 되면서 바뀐 설정 방법을 사용하지 않아 DAG Backfill이 발생해 특정 파티션 데이터를 Hive 테이블에 중복으로 인입시켰다.해당 Hive 테이블을 복원하면서 사용한 방법과 Airflow의 Backfiil 발생 원인을 정리하여 앞으로 이런 일을 반복하지 않도록 반성의 시간을 갖고 혹시 비슷한 이슈를 겪으신 분들에게 도움이 되고자 이를 공유한다.# 상황최근 구축했던 Data Pipeline를 최종 운영하기 ..
# 목적Python을 사용한 업무를 진행할 때, 대부분의 메소드에 @staticmethod와 @classmethod를 사용하고 있는데, 두 어노테이션이 갖는 의미와 차이점, 사용 방법 등을 정확하게 정리하는 것이 이번 포스팅의 목적이다. 추가로, 업무하면서 두 어노테이션을 쓰다 인스턴스 변수와 클래스 변수를 생각 안하고 짯던 경험이 있어서, 이슈 상황과 차이점 또한 간단히 정리하고자 한다.@staticmethodhttps://docs.python.org/3/library/functions.html#staticmethod Built-in FunctionsThe Python interpreter has a number of functions and types built into it that are alwa..
# 목적업무를 하면서 Dataclass를 컨벤션 중 하나로 사용하고 있었는데, 기존 개발자 분들께서 Dataclass를 왜 사용하셨는지를 이해하는 과정이 필요했다. 이번 포스팅에서 Dataclass의 개념과 장점에 대해서 공부한 내용을 정리하고 공유하고자 한다. 현재 Python 3.7 환경을 사용하고 있어, 3.7 버전을 기준으로 정리했다.# Dataclasses 패키지 Dataclass는 Dataclasses 모듈에서 제공하는 기능이다. Dataclasses 모듈은 3.7 버전에서 공식적으로 추가되고 3.12 버전에서도 관리되는 패키지이다. Dataclasses 모듈은 Dataclass 데코레이터 및 함수를 제공하여, 클래스 선언 시 __init__, __repr__, __eq__ 등의 메소드를 클..
# 목적파이썬의 Packing & Unpacking 의 의미와 사용법 대해 정리를 하려고 한다. 산술 연산자로써의 *가 아닌 Packing & Unpacking을 위한 사용법을 살펴본다.우선 * 을 하나 사용하는 Packing과 Unpacking을 살펴보고, 두개 사용하는 경우를 살펴볼 예정이다.# Packing - *Packing은 함수에 전달할 인자의 개수를 유연하게 하기 위한 방법이다.sum_all(1, 2, 3, 4, 5)sum_all(1, 2, 3, 4, 5, 6, 7)Packing을 사용하지 않고 위 코드를 정상적으로 동작하기 위한 함수는 아래와 같다.def sum_all(a1=None, a2=None, a3=None, a4=None, a5=None, a6=None, a7=None): r..
# 목적RDB 테이블에 담긴 데이터 중 특정 칼럼의 중복 제거 후 전체 칼럼을 조회하는 방법을 공유하고자 한다. 엑셀로는 간단하게 "중복된 항목 제거"라는 기능을 사용할 수 있는데, 데이터가 너무 많아 엑셀에서 편집이 불가능한 경우에는 SQL에서 중복 제거를 수행해야한다.SQL 이를 수행하려고 하니 DISTINCT로는 할 수 없었고, 조금 복잡한 로직을 타야했다. DISTINCT로 해결하는 방법은 이번 포스팅에 작성되어있지 않다. 해당 방식에 대해서 아래의 포스팅을 참고했다. [ SQL ] 중복 제거하고 조회하기중복을 제거하고 조회(SELETE)하는 방법은 다양하다. 그 중에서 알고 있는 3가지 방법에 대해서 적어볼려고 한다. 사용한 DBMS : ORACLE SQL 클라이언트 : DBeaver 빠른 이해..
# 목적 CSS Selector와 XPath의 개념과 사용법을 확인하고, 예시 HTML 문서를 통해 몇가지 요소들을 CSS Selector와 XPath 방식으로 셀렉하는 방법을 정리하고자 한다. # CSS Selector & XPath 개념 # CSS Selector CSS는 HTML과 함께 웹 개발을 시작할 때 접하게 되는데, 웹 페이지를 구성하는 뼈대인 HTML 문서에 스타일을 입히는 언어이다. CSS Selector는 CSS 스타일을 적용하기 위해 특정 HTML 요소를 선택하는 패턴이다. This is an example. This is another example. 위 HTML 문서에서 style 태그 안의 ".example" 부분이 CSS Selector이다. # XPath XPath는 XML ..
한달 전에 초안을 작성했는데, 블로그에 신경을 잘 못쓰느라 이제서야 마무리하고자 한다. # 진행된 요소 일회성으로 제목, 링크, 가격, 배송비, 등록일, 카테고리, 광고유무, 판매자 정보를 한 페이지 크롤링 후 엑셀 파일로 저장 네이버 쇼핑 확장성 있게 크롤링하기 with Selenuim & Excel - 1 # 목적 네이버 쇼핑 사이트의 제품명, 가격 등에 대한 데이터들을 확장성을 갖고 정기적으로 수집이 가능한 Python 실행 프로그램을 구현하기 위함이다. 직접 requests을 사용해 파싱할 HTML 문서를 alive-wong.tistory.com # 진행할 요소 N개의 쿼리명이 저장된 엑셀 파일을 읽어 해당 쿼리에 대한 크롤링 결과물을 반환 충돌이 일어나지 않도록 결과 파일을 저장 쿼리와 함께 크..
# 목적네이버 쇼핑 사이트의 제품명, 가격 등에 대한 데이터들을 확장성을 갖고 정기적으로 수집이 가능한 Python 실행 프로그램을 구현하기 위함이다. 직접 requests을 사용해 파싱할 HTML 문서를 수집하는 방식이 아닌 Selenuim을 사용한다. Selenuim을 선택한 이유는 반응형 & 동적 웹페이지의 데이터를 원할하게 수집하기 위함이다. 추후 로그인을 필요로 하는 수집 사이트도 확장하기 위함이다. 네이버 쇼핑, 다나와의 SRP를 확인하였을 때 URL Query를 통해 페이지 접근이 가능하지만, 페이지 렌더링 시간이 불규칙적인 점과 추후 크롤링의 안정성과 확장성을 위해서 Selenuim을 사용한 크롤링을 진행했다. 최종 목적 아래와 같다.쿼리 명이 담겨 있는 엑셀 파일 명과 함께 프로그램을 동..
코딩 테스트를 공부하면서 이진 탐색를 알고리즘을 학습했다. 먼저 해당 유형을 접해보면서 익숙해지는 과정을 진행했다. 백준 문제를 풀면서 파라메트릭 서치 방법을 접할 수 있었고, 어떤 방식으로 이진 탐색과 파라메트릭 서치의 차이점과 예제를 통해 파라메트릭 서치를 문제에 적용해보며 파라메트릭 서치가 무엇인지를 정리하고 공유하고자 한다. # 이진 탐색 - Binary Search 임의의 배열에서 특정 원소를 탐색하기 위해선 배열의 모든 원소를 하나씩 들여다보면 된다. 반복문을 통해 배열의 모든 원소를 하나씩 확인하는 방법을 완전 탐색(BruteForce Search)라고 부른다. 완전 탐색은 O(N)의 시간 복잡도를 갖는다. 단순하게 배열의 길이만큼 연산 횟수가 선형적으로 늘어난다. 10,000,000개의 원..