전체 글 47

PyMuPDF 버전 업데이트로 인한 PDF 스트림 파싱 오류 해결하기

PDF 문서 파싱 작업 중 갑자기 발생한 에러를 해결하면서 배운 내용을 공유한다. 같은 코드인데 배포 환경에서만 에러가 발생하는 상황이었는데, 원인을 찾아보니 라이브러리 버전 차이로 인한 문제였다.문제 상황Azure Blob Storage에서 PDF 파일을 다운로드해서 PyMuPDF로 파싱하는 작업을 진행하던 중 다음과 같은 에러가 발생했다:doc = pymupdf.open(stream=file_path, filetype="pdf")이 코드 실행 시 Document('None', )처럼 None이 반환되면서, 후속 처리에서 다음과 같은 에러가 발생:TypeError: expected str, bytes or os.PathLike object, not NoneType특이한 점은 로컬 환경에서는 정상 동작하..

트러블슈팅 2025.06.20

curl_cffi 도입기: 웹 스크래핑 문제 해결하기

웹 검색 AI 에이전트 개발하면서 검색 데이터 수집할 때 자주 마주치는 문제가 있다. 사이트들이 점점 더 스크래핑을 막는 기술을 도입하면서 requests, aiohttp 같은 기본 HTTP 클라이언트로는 자꾸 403, 429 에러가 뜨는 상황.문제 상황기존에 써오던 HTTP 클라이언트들로는 이런 문제가 생겼다:403 Forbidden, 429 Too Many Requests 같은 오류 계속 발생Cloudflare 같은 보안 솔루션이 적용된 사이트에서 CAPTCHA가 뜸User-Agent 설정해도 스크래핑 방지 우회 안 됨자바스크립트로 동적 생성되는 콘텐츠는 아예 접근 불가이런 문제는 AI 에이전트가 정확한 정보를 제공하는 능력에 직접적인 영향을 줬다.브라우저 지문(Browser Fingerprintin..

Python 2025.05.11

Python asyncio와 anyio 비교

Python asyncio와 anyio 비교asyncio란?asyncio는 Python 3.4부터 표준 라이브러리에 포함된 비동기 프로그래밍을 위한 라이브러리. async/await 구문을 사용하여 I/O 작업이 많은 코드를 효율적으로 실행할 수 있게 해줌.간단히 말해, asyncio는 한 작업이 I/O(네트워크 요청, 파일 읽기/쓰기 등)를 기다리는 동안 다른 작업을 수행할 수 있게 해주는 도구.anyio란?anyio는 asyncio나 trio 위에서 동작하는 호환성 라이브러리. 이는 동일한 코드가 어떤 비동기 백엔드(asyncio 또는 trio)를 사용하든 작동할 수 있게 해줌. anyio는 trio에서 영감을 받은 사용하기 쉬운 API를 제공하면서도 asyncio와의 호환성을 유지.쉽게 말해, an..

Python/etc 2025.04.26

Python - 이벤트 루프

Python Asyncio의 이벤트 루프 이해하기Python에서 비동기 프로그래밍을 구현할 때 핵심이 되는 이벤트 루프(Event Loop)에 대하여 설명한다. 이벤트 루프는 모든 asyncio 응용 프로그램의 중심 메커니즘으로, 비동기 태스크들을 효율적으로 관리하고 실행하는 역할을 한다.개요: 이벤트 루프가 필요한 이유파이썬으로 개발 시 웹 페이지 여러 개를 다운로드하거나, API 요청을 동시에 보내야 하는 경우가 발생한다. 이러한 I/O 작업은 대기 시간이 길어서 순차적으로 처리하면 시간이 과도하게 소요된다. 이벤트 루프는 이런 작업들을 효율적으로, 마치 동시에 처리하는 것처럼 관리해준다.1. 이벤트 루프의 개념과 동작 원리개념이벤트 루프는 간단히 말해 실행할 작업들을 관리하는 관리자라고 볼 수 있다..

Python 2025.04.20

Python thread

Python의 Threading과 ThreadPoolExecutor 비교Python에서 동시성 구현할 때 필요한 두 가지 중요한 도구인 threading 모듈과 concurrent.futures 모듈의 ThreadPoolExecutor 클래스에 대하여 설명한다. 이 두 도구는 각각 다른 특징과 사용 목적을 가지고 있으며, 적절한 상황에서 활용할 때 최적의 성능을 얻을 수 있다.개요: 스레드가 필요한 이유파이썬으로 개발 시 웹 페이지 여러 개 다운로드하거나, 여러 파일 동시 처리하거나, API 요청 동시에 보내야 하는 경우가 발생한다. 이러한 I/O 작업은 대기 시간이 길어서 순차적으로 처리하면 시간이 과도하게 소요된다. 이러한 경우 동시성(Concurrency) 구현이 필요하며, 본 문서에서는 그 방법 ..

Python 2025.04.20

MCP server 예

MCP ToolAI 모델이 Python 함수를 직접 호출하여 계산, 데이터 처리 등 다양한 작업을 수행할 수 있게 해주는 기능.MCP 서버는 AI 모델과 Python 코드 사이의 중간 인터페이스 역할을 하며, AI 모델이 필요에 따라 적절한 함수를 호출할 수 있도록 함.주요 구성 요소Server: MCP 서버 인스턴스Tool: AI가 호출할 수 있는 도구 정의Prompt: 사용자와 AI 간의 상호작용을 위한 프롬프트 정의비즈니스 로직: 실제 작업을 수행하는 함수들간단한 MCP 서버 구현 예덧셈과 뺄셈 기능을 제공하는 간단한 MCP 서버 예시:import asyncioimport sysimport tracebackfrom typing import Annotated, Optionalfrom mcp.serve..

AI Agent/MCP 2025.04.09

MCP 란

MCP (Multimodal Compositional Prompting)MCP (Multimodal Compositional Prompting) 란 Anthropic의 Claude AI 모델이 텍스트와 이미지를 함께 처리하고 이해할 수 있게 해주는 기술MCP의 주요 특징은 텍스트와 이미지를 동시에 처리하고 두 모달리티 간의 관계를 이해하여 복잡한 작업을 수행할 수 있다는 점에 있다.주요 기능다중 모달 입력: 텍스트와 이미지를 동시에 처리컨텍스트 이해: 이미지와 텍스트 간의 관계를 이해하고 해석복잡한 질의 응답: 이미지 내용에 기반한 상세한 질문에 답변 가능분석 및 설명: 이미지 내용을 분석하고 텍스트로 설명 제공활용 사례문서 분석: 스캔된 문서, 차트, 그래프 분석코드 리뷰: 코드 스크린샷과 함께 프로그..

AI Agent/MCP 2025.04.08

백엔드 경력 면접 질문

실제 3~4년차 백엔드 개발자 면접에서 받은 질문들기억나는 부분들만 간략히 작성Redis Pub Sub 설명Redis 캐싱 어떻게 사용하면 좋을까?Redis - 싱글스레드 → 멀티스레드 차이 → 언제 사용하면 좋을지멀티스레드, 멀티프로세스 차이 → 장단점MySQL 테이블당 몇개 row 저장하면 좋은가?DB replica 언제 사용하나DB 인덱싱, 샤딩 설명인덱싱이 무조건 좋은가?api 가 많이 느리다 → 어떤 순서로 해결할건가어떤 api 가 좋은 api 인가?http request header cache 종류redis, sqs 메세지 큐 차이로드밸런서 이용하여 여러 서버 띄운경우 중복 요청 들어오는 부분 처리 방법멀티 스레드 프로그램 만들 때 어떤 자료구조 사용

잡다한것 2025.03.03

문제 발생/해결 - 생각해야 할 것

개선이 필요한 것사이드 이펙트 고려 미흡레거시 코드 미확인내가 파악한, 기억하고 있는 내용이 맞는지 관련 매니저님들에게 확인을 받지 않음문제에 대한 원인 및 해결책비슷한 원인들이 많았음원인:레거시 코드가 잘 동작한다고 생각함사이드 이펙트를 고려했다고 생각했지만 놓친 부분들이 있었음서비스를 처음부터 만들었기에 많이 파악하고 있다고 생각하여 다른 개발자에게 다시 묻지 않고 진행해결책주기적으로 바쁘지 않을 때 레거시 코드 리팩토링 진행테스트 코드가 없는 부분 작성 - 단순 조회의 경우에도 api 테스트 추가서비스 화면상 테스트도 같이 진행 및 요청다른 팀원들에게도 리뷰 요청 또는 작업내용 공유하여 놓친 사이드 이펙트 확인간단한 수정도 다시 한 번 로직을 풀어써보기어드민(백오피스)기능 변경이 발생할 때 놓치는 ..

트러블슈팅 2025.03.03

저장이 필수인 데이터 누락

문제내용필수 질문에 대한 답변 없이 저장된 케이스가 발생원인백엔드에서 질문 목록을 쿼리할 때 질문의 부모 테이블에서 쿼리하는 것이 아닌 질문 테이블만 클라이언트에서 받아 쿼리하고 있었음부모 테이블에서 질문 삭제/변경이 발생하는 경우 따로 처리가 없었음엣지 케이스를 고려하지 않은 함수 설계레거시 코드 관리의 문제해결방법정기적인 레거시 코드의 리팩토링 작업을 가지도록초기에 작성한 코드 로직 재확인하는 과정 필요

트러블슈팅 2025.03.03