반응형

Programming/python 21

pyupbit를 사용한 업비트 매매 활용 - 직접 API 호출과의 비교

개요업비트(Upbit)는 REST API와 WebSocket API를 통해 시세 조회 및 주문 실행 기능을 제공한다. 직접 requests 모듈로 API를 호출하는 방식은 자유도가 높지만, 네트워크 단절·타임아웃·커넥션 재사용 문제 등 실무 환경에서 반복적으로 마주치는 이슈가 많다. pyupbit는 업비트 공식 API를 래핑한 파이썬 라이브러리로, JWT 인증·응답 파싱·Rate limit 대응·WebSocket 관리 등 자동매매 구현에 필요한 보일러플레이트를 상당 부분 흡수한다. 본 포스트는 직접 호출 방식에서 발생하는 문제를 정리하고, pyupbit로 전환했을 때의 개선점을 실제 테스트 코드와 함께 비교한다.설명직접 API 호출 방식의 구조적 문제파이썬 requests 라이브러리를 이용해 업비트 AP..

Programming/python 2026.04.16

synology-api로 Python에서 Synology NAS 파일 업로드 자동화하기

개요Synology NAS는 가정용·기업용 네트워크 스토리지 솔루션으로 널리 사용된다. Synology는 DSM(DiskStation Manager)의 기능을 외부에서 제어할 수 있도록 공식 REST API를 제공하며, Python 생태계에는 이를 래핑 한 synology-api 라이브러리가 존재한다.본 글에서는 synology-api의 FileStation 모듈을 활용하여 로컬 파일을 NAS의 지정 경로에 자동으로 업로드하는 스크립트를 분석하고, 실제 적용 방법과 주요 고려사항을 정리한다.설명라이브러리 구성synology-api는 DSM의 주요 API 엔드포인트를 Python 클래스로 추상화한 비공식 라이브러리다. FileStation 클래스는 /webapi/entry.cgi를 통해 파일 탐색, 업로드..

Programming/python 2026.04.08

Python asyncio.as_completed를 활용한 Markdown 문서 병렬 청킹

개요여러 파일을 순차적으로 처리하면 처리 시간이 파일 수에 비례해 증가한다. asyncio를 활용하면 I/O 대기 구간을 겹쳐 실행함으로써 전체 처리 시간을 단축할 수 있다. 본 글에서는 async def와 asyncio.as_completed를 사용해 여러 Markdown 규정 문서를 병렬로 읽고 헤더 기반으로 청킹 하는 패턴을 분석한다. 핵심 라이브러리는 LangChain의 MarkdownHeaderTextSplitter이며, 비동기 흐름의 설계 방식과 각 구성 요소의 역할을 중심으로 설명한다.설명전체 구조코드는 크게 세 가지 역할로 구분된다.1. 청킹 로직 (_split, chunk_markdown)_split은 순수한 동기 함수로, MarkdownHeaderTextSplitter를 초기화하고 텍스..

Programming/python 2026.03.13

python raise, yield, return의 차이

개요Python에서 함수의 흐름을 제어하는 키워드는 크게 세 가지로 나뉜다. return은 함수의 실행을 종료하고 값을 반환하며, yield는 함수를 제너레이터로 변환하여 값을 순차적으로 생성하고, raise는 예외를 명시적으로 발생시킨다. 이 세 키워드는 각각 다른 목적과 동작 방식을 가지며, Python 프로그래밍의 핵심 제어 흐름을 구성한다.설명returnreturn은 함수 실행을 즉시 종료하고 호출자에게 값을 반환한다. return 이후의 코드는 실행되지 않으며, 반환값이 없을 경우 None을 반환한다. 함수는 return 실행 후 완전히 종료되어 내부 상태가 소멸된다.yieldyield는 함수를 제너레이터(Generator) 함수로 변환한다. yield를 포함한 함수는 호출 시 제너레이터 객체를..

Programming/python 2026.02.20

SQLAlchemy로 데이터베이스 메타데이터 탐색하기: 스키마와 테이블 정보 활용법

개요SQLAlchemy는 파이썬 기반의 ORM(Object Relational Mapping) 라이브러리로, 데이터베이스와의 상호작용을 객체지향적으로 처리할 수 있게 한다. 그러나 단순히 ORM 기능만 제공하는 것이 아니라, 데이터베이스 메타데이터를 직접 탐색하고 활용할 수 있는 강력한 기능을 포함하고 있다. 이러한 기능을 통해 테이블 목록, 컬럼 정보, 스키마 이름 등을 조회할 수 있으며, 이는 SQLDatabase와 유사한 동작을 직접 구현하는 데 활용될 수 있다.설명SQLAlchemy의 inspect 모듈은 데이터베이스 메타데이터를 탐색하기 위한 핵심 도구이다. 이를 통해 특정 스키마의 테이블 목록을 가져오거나, 테이블의 컬럼 정보와 제약조건을 확인할 수 있다. 또한 MetaData 객체를 활용하면..

Programming/python 2026.01.21

Oracle DB와 SQLAlchemy: 세미콜론 문제와 ORA-00933 에러

개요Python에서 SQLAlchemy를 통해 Oracle Database를 사용하는 개발자들은 종종 ORA-00933: SQL command not properly ended 에러를 마주하게 된다. 이 에러의 주요 원인 중 하나는 SQL 문 끝에 붙은 세미콜론이다. 대부분의 데이터베이스 시스템에서는 세미콜론이 문제를 일으키지 않지만, Oracle의 프로그래밍 인터페이스는 이를 받아들이지 않는다. 본 글에서는 이러한 문제가 발생하는 근본 원인과 SQLAlchemy를 사용할 때 주의해야 할 점들을 살펴본다.설명세미콜론의 역할SQL에서 세미콜론은 전통적으로 문장 종결자(statement terminator)로 사용되어 왔다. SQL*Plus나 SQL Developer 같은 명령줄 도구에서는 세미콜론이 현재 ..

Programming/python 2025.12.04

Python JSON 문자열 파싱 가이드

개요JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량 형식으로, 현대 웹 개발과 API 통신에서 가장 널리 사용되는 데이터 형식이다. Python에서는 문자열 형태로 전달되는 JSON 데이터를 파싱 하여 사용 가능한 객체로 변환하는 작업이 빈번하게 발생한다. 본 글에서는 Python의 json 모듈을 활용하여 문자열 형식의 JSON 데이터를 효과적으로 처리하는 방법을 다룬다.설명Python의 내장 모듈인 json은 JSON 데이터를 Python 객체로 변환하거나 그 반대의 작업을 수행하는 기능을 제공한다. JSON 문자열을 Python 객체로 변환하는 과정을 역직렬화(Deserialization)라고 하며, 이는 json.loads() 함수를 통해 이루어진다.주요 함수..

Programming/python 2025.10.14

FastAPI에서 ThreadPoolExecutor를 활용한 동기 코드의 비동기 실행

개요FastAPI는 Python의 대표적인 비동기 웹 프레임워크로, async/await 패턴을 기반으로 높은 성능을 제공한다. 그러나 실제 개발 환경에서는 기존에 작성된 동기(synchronous) 라이브러리나 레거시 코드를 사용해야 하는 경우가 빈번하다. 특히 데이터베이스 드라이버, 파일 시스템 작업, 외부 API 호출 등 블로킹(blocking) I/O 작업을 수행하는 동기 코드를 비동기 환경에서 직접 호출하면 전체 애플리케이션의 성능이 저하되는 문제가 발생한다.ThreadPoolExecutor는 Python의 concurrent.futures 모듈에서 제공하는 스레드 풀 관리 클래스로, 동기 코드를 별도의 스레드에서 실행함으로써 비동기 환경과의 통합을 가능하게 한다. 본 글에서는 FastAPI 환..

Programming/python 2025.10.13

__del__과 weakref.finalize

개요Python에서 객체의 리소스 정리를 위한 두 가지 주요 메커니즘인 __del__ 메서드와 weakref.finalize는 각각 다른 접근 방식으로 메모리 관리와 종료자 구현을 제공한다. __del__은 Python 초기부터 존재했던 전통적인 종료자 메서드로, 객체가 가비지 컬렉션될 때 자동으로 호출되지만 순환 참조와 실행 순서 문제로 인한 제약이 있다. 반면 weakref.finalize는 Python 3.4에서 PEP 442와 함께 도입된 현대적 접근법으로, 약한 참조를 기반으로 하여 더 안전하고 예측 가능한 리소스 정리를 제공한다. 두 메커니즘은 서로 다른 실행 시점과 특성을 가지며, 특정 상황에서 각각의 장단점이 존재한다. 현대 Python 개발에서는 weakref.finalize가 더 권장되..

Programming/python 2025.07.17

Python GIL

개요Python GIL(Global Interpreter Lock)은 CPython 인터프리터에서 사용되는 뮤텍스로, 한 번에 하나의 스레드만이 Python 바이트코드를 실행할 수 있도록 제한하는 메커니즘이다. 1991년 Python이 처음 개발될 당시 메모리 관리와 스레드 안전성을 보장하기 위해 도입된 GIL은 단일 스레드 프로그램의 성능을 향상시키고 C 확장 모듈의 안전한 사용을 가능하게 했다. 그러나 멀티코어 프로세서가 보편화된 현재, GIL은 CPU 집약적 작업에서 병렬 처리의 이점을 제한하는 주요 병목점으로 작용하고 있다. 2024년 현재 Python 커뮤니티는 PEP 703을 통해 GIL을 선택적으로 비활성화할 수 있는 방안을 검토하고 있으며, CPython 3.13부터 --disable-gi..

Programming/python 2025.07.16
728x90
반응형