✨ new ✨
-
[Airflow] TriggerDagRunOperator 사용할 때 duplicate key value violates unique constraint "dag_run_dag_id_execution_date_key"
개요Airflow을 활용하여 크롤링을 진행하고 있었다.하나의 DAG가 특정 DAG를 한번에 여러번 trigger 하는 프로세스인데지금 계속 크롤링 사이트가 늘어나는 과정에 있었다. 크롤링 사이트가 300개 가까이 늘어나고, 하나의 DAG를 300개 가까이 호출하다가 오류가 발생했다. 에러는 trigger_internal_dag task가 Fail 확인해보자error message: run_id 중복 오류sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "dag_run_dag_id_execution_date_key" trigger_internal_dag은..
2025.09.14
-
PDF에 있는 text를 빠르게 가지고 오자 ! feat. 시간복잡도
회사 프로젝트 중 .. 크롤링을 하고 있었다뉴스 기사들을 가지고 오는 크롤링이었는데,기사 내에 pdf가 있으면 파일을 다운받아서 간단하게 text만 추출해서 DB에 넣어준다. 근데 pdf가 있는 기사와 없는 기사를 스크리핑하는데 시간 차이가 많이 난다고 느꼈다.그래서 함수를 찾아갔다. 기존에 있던 코드:def current_extract_pdf_text(pdf_url): start_time = perf_counter() response = requests.get(pdf_url, headers={'User-Agent': random.choice(user_agents)}) response.encoding = response.apparent_encoding response.rais..
2025.07.23
-
[MySQL] 뉴스 기사 NER 검색 구조 개선기 - 성능과 유지보수성의 균형 맞추기
최근에 새로운 프로젝트에 투입이 되었다.혼자 1,000여개의 사이트를 크롤링해야하는 시스템을 만들어야했다.프로젝트에 배정되었을 때 너무 너무 많은 범위를 혼자 진행해야해서 막막했지만내가 처음부터 주도적으로 할 수 있다는게 얼마나 큰 기회인가! 좋은 기회이니 애정을 가지고 잘 진행해보려한다.완전 새로운 프로젝트는 아니고, 예전에 진행했던 것과 비슷하지만 맨땅부터 시작해야했다.그럼 더 좋다. 개선하고 싶은 부분들이 있었다. 처음으로 바로 개선하고 싶은 부분은 데이터 베이스 쪽이었다. 문제 상황 : 느린 NER 검색크롤링한 뉴스 기사 데이터를 DB에 저장하고, 각 기사별로 NER(Named Entity Recognition) 결과를 리스트 형태로 TEXT 컬럼에 저장하고 있었다. → ner에 ["키워드1", ..
2025.07.23
-
[SSH] SSH 세션에 따라 환경 변수가 다른 이슈
개요같은 서버에서A PC → SSH 접속 → 앱 실행 시 cuDNN 에러 + core dumpB PC → SSH 접속 → 동일 앱 실행 시 정상 작동 확인B PC에서는 fastapi 앱이 정상적으로 실행되는데, A PC에서는 동일 앱 실행 시 아래와 같은 에러메세지가 출력된다.Unable to load any of {libcudnn_cnn.so.9.1.0, libcudnn_cnn.so.9.1, libcudnn_cnn.so.9, libcudnn_cnn.so}Invalid handle. Cannot load symbol cudnnCreateConvolutionDescriptorAborted (core dumped) → cnDNN 라이브러리를 찾지 못함→ 현재 세션에서 libcudnn_cnn.so.* 라이브러..
2025.06.27
-
[gradio] 애플리케이션에 path parameter 붙여서 특정 경로로 서빙하기
개요gradio로 올린 애플리케이션이 하나 있었는데~애플리케이션 하나더 추가해서 2개 올리고,{domain}/a{domain}/b이렇게 path parameter로 구분해서 올리고싶어서 도전~ 확인기존에 코드가 어떻게 되어있었냐면,def greet(name): return f"Hello, {name}!"gr_app = gr.Interface(fn=greet, inputs="text", outputs="text")gr_app.launch(server_name="0.0.0.0", server_port=8003) 이렇게 단순하게 8003 포트로 올라가는 애플리케이션이었다. 시작할때, 챗지피티한테 물어보니Gradio Blocks 기반 앱 생성 후 `path` 설정하고FastAPI 앱에 마운트하는 방법을 알..
2025.06.20
-
github으로 docker image 공유하기 (Docker packages > Containers)
개요Docker image를 github을 통해 고객에게 공유하려 함Docker packages > Containers 진행1. Access Token 발급https://github.com/settings/tokens → "Generate new token (classic)" 2. token name, expiration, scopes 입력 및 선택 3. 생성된 토큰 저장하기 (바로 hide됨) 4. Docker loginecho | docker login ghcr.io -u --password-stdinLogin Succeeded→ 확인되면 로그인 완료된 것 5. build imagedocker build -t ghcr.io//: . example:docker build -t ghcr.io/hyer..
2025.06.06
🔥 hot 🔥
-
정보처리기사 필기 핵심 요약 | 2과목 : 소프트웨어 개발
✨ 자료 구조- 선형 구조 : 배열, 선형 리스트(연속 리스트, 연결 리스트), 스택, 큐, 테크- 비선형 구조 : 트리, 그래프 ✨ 선형 리스트(1) 연속 리스트- 배열과 같이 연속되는 기억장소에 저장되는 자료 구조- 기억장소를 연속적으로 배정받기 때문에 기억장소 이용 효율은 밀도가 1로서 가장 좋다.- 중간에 데이터를 삽입하기 위해서는 연속된 빈 공간이 있어야 하며, 삽입/삭제 시 자료의 이동이 필요(2) 연결 리스트- 자료들을 반드시 연속적으로 배열시키지는 않고 임의의 기억공간에 기억시키되, 자료 항목의 순서에 따라 노드의 포인터 부분을 이용하여 서로 연결 시킨 자료 구조- 노드의 삽입/삭제 작업 용이- 기억 공간이 연속적으로 놓여 있지 않아도 저장할 수 있다.- 연결을 위한 링크(포인터) 부분이 ..
2025.01.13
-
nginx에 mTLS 인증서 발급하고 검증하기
mTLS 란?mTLS는 "Mutual Transport Layer Security"의 약자로, 클라이언트와 서버 간의 상호 인증을 위한 TLS(Transport Layer Security) 프로토콜의 확장이다. 일반적인 TLS는 서버만 인증하는 반면, mTLS는 클라이언트와 서버 모두가 서로를 인증하는 방식이다. 이를 통해 더 높은 수준의 보안이 제공된다. mTLS의 작동 방식은 서버 인증, 클라이언트 인증, 상호 인증 완료 로 진행되어야 한다. 1. 서버 인증 : 클라이언트 서버의 SSL/TLS 인증서를 확인하여 서버의 신원을 검증한다. 이는 일반적인 TLS 연결에서 이루어지는 단계이다.2. 클라이언트 인증 : 서버 또한 클라이언트로부터 인증서를 요청한다. 클라이언트는 자신의 인증서를 서버에 제출하여 ..
2024.08.16
-
[python] 네이버 카페 크롤링
네이버 카페 게시글을 크롤링 하려 한다. python requests를 이용해서 가지고 오려고 했으나 회원님의 안전한 서비스 이용을 위해 비밀번호를 확인해 주세요. IP가 자주 변경되는 네트워크 환경에서 로그인하는 경우 IP보안을 해제 후 이용하시기 바랍니다. 다시 한번 비밀번호 확인 하시면 이용중인 화면으로 돌아가며, 작성 중이던 내용을 정상적으로 전송 또는 등록하실 수 있습니다. 이렇게 접근할 수 없음을 알 수 있다. 이렇게 되면 selenium을 이용해서 동적으로 접근하기로 한다. 로그인 id 와 password를 입력해서 아래의 코드를 실행하면 로그인이 진행됨을 알 수 있다. import time from selenium import webdriver import csv import pandas ..
2024.01.30
-
[docker] docker.errors.APIError: 500 Server Error for http+docker://~/start: Internal Server Error ("write /home/~/tmpfile: no space left on device)
잘 운영되던 docker가 down 되면서 서비스가 중지되었다. docker가 떨어뜨린 에러 메세지는 다음과 같다 docker.errors.APIError: 500 Server Error for http+docker://localhost/v1.42/containers/11f76378c2673eed151a57ac10227a419decbbee234c52c9afe74c7643754ad8/start: Internal Server Error ("write /home/ubuntu/.local/share/docker/containers/11f76378c2673eed151a57ac10227a419decbbee234c52c9afe74c7643754ad8/.tmp-hostconfig.json1581200925: no sp..
2024.03.04
-
[python] TypeError: 'type' object is not subscriptable
✅ 개요 python3.8 환경에서 코드를 실행시키니 아래와 같은 에러와 함께 실행이 안되었다TypeError: 'type' object is not subscriptable 오류가 발생하는 지점을 보니def test_function1() -> list[str]: ... def test_function2() -> dict: 타입 힌트를 지정할 때 생기는 오류원인을 확인해보니, typing 힌트는 python3.9부터 지원하고 있다 ✅ 방법 1사용하는 python 을 3.9로 업데이트하는 방법이 있고 ✅ 방법2python typing 라이브러리를 사용하여 지정해주면 된다.python 버전 업은 큰 맘 먹고해야하니 이 방법을 강추한다.from typing import List, Dictdef test_..
2024.05.02
-
Celery를 이용한 크롤링 예제
개요Airflow와 Celery를 비교했다. 크롤링 관리 Airflow vs Celery개요기존 프로젝트의 크롤링 시스템을 Airflow로 관리했다.Airflow 운영 중이던 서버에 문제가 많았는 데, 그 중에서 제일 큰 문제는 cpu 점유율이 100으로 치솟을 때가 많았다는 것이다.Airflow로 운영bonory.tistory.com 크롤링 진행 시, Celery를 사용하는 게 더 적합하다는 판단과 함께 예제를 작성했다. FastAPI + Celery + requests + BeautifulSoup 를 활용한 크롤링 작업을 수행하는 기본적인 방법을 예제크롤링은 백그라운드에서 실행되도록 진행기본 구조FastAPI: 사용자가 API를 통해 크롤링 요청을 보냄Celery: 요청을 큐에 넣고, 백그라운드에서 ..
2025.02.05
-
[Docker] Dockerfile COPY와 Mount 비교
개요file과 directory를 image build할 때 Dockerfile에서 COPY하는 것과 Docker container를 생성할 때 Mount하는 것을 비교하고 구분해 보려고 한다.Dockerfile에서 COPYCOPY는 build 시점에 host file/directory를 container image 안으로 복사한다.container 실행 시, Mount와 달리 파일이 컨테이너 이미지의 일부가 된다.container가 독립적으로 실행되거나 배포되는 경우 유용하다container 실행 시 항상 동일한 파일이 필요할 때공유 directory 없이 container 단독으로 실행되도록 하고 싶을 때예시)COPY ./app /app MountMount는 host 시스템의 파일/디렉토리를 cont..
2024.11.20
-
[Safari] http 요청을 https로 강제 전환해버리는 문제 | fastapi, uvicorn
기존에 진행되어서 배포된 프로젝트에서 safari로 접속시 버그가 있다는 제보에 local에서 실행시키고 localhost로 접속을 시도했다. WARNING: Invalid HTTP request received. Traceback (most recent call last): File "/Users/{myname}/Desktop/project/{projectname}/venv/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 131, in data_received self.parser.feed_data(data) File "httptools/parser/parser.pyx", line 212, in httptools.p..
2024.03.27
-
[Airflow] The scheduler does not appear to be running. Last heartbeat was received 7 hours ago.The DAGs list may not update, and new tasks will not be scheduled.
잘 운영되던 Airflow가 갑자기 멈춘것 같다는 얘기를 듣고 봤더니 엥 ~ ?? 내 DAG 들 다 오디감 ?The scheduler does not appear to be running. Last heartbeat was received 7 hours ago.The DAGs list may not update, and new tasks will not be scheduled. >> 해석스케줄러가 실행 중이 아닌 것 같음. 마지막은 7시간 전에 수신되었음.DAG 목록이 업데이트되지 않을 수 있으며 새 작업이 예약되지 않음. Airflow 기능 중에 health 확인할 수 있는 방법이 있어서 한번 사용해보았당/health health 한지 unhealthy 한지 확인할 수 있다. 진짜 이유는 memory ..
2024.03.08
-
[노랑이] 오답 | 과목 2 | SQL 기본 및 활용 1-50
1. DML, DDL, DCL, TCL 구분 8. WHERE 절에는 집계 함수를 사용할 수 없다. (예: WHERE AVG(SAL) >= 1800 → X) 10. NULL 값을 조건절에서 사용하는 경우 IS NULL, IS NOT NULL이란 키워드를 사용해야 한다. 11. Oracle vs Sql 공백 처리 방법 query : INSERT INTO 테이블 VALUES ('', '', '') 위와 같은 query 실행시, Oracle에는 NULL로 입력되고 Sql에는 ''으로 입력된다. - Oracle: SELECT * FROM 테이블 WHERE 컬럼명 IS NULL; - Sql : SELECT * FROM 테이블 WHERE 컬럼명 = ''; 14. GROUP BY, HAVING - 집계 함수의 통꼐 정..
2024.02.18