PYTHON
자바 백엔드 개발자가 Python 기반 ML 서비스를 분석하며 정리한 학습 기록. 문법부터 ML 서비스 성능 분석 워크플로까지 시리즈로 묶었다.
AutoCloseable·Iterator 비교FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
Python ML 서비스를 분석하면서 가장 빨리 익숙해진 것이 FastAPI 였다. Spring Boot 를 써 본 사람이라면 손에 익기까지 한두 시간이면 충분하다. "어노테이션으로 라우팅 매핑하고, 클래스로 DTO 정의하고, 의존성 주입 받는다" 라는 큰 틀이 거의 그대로 옮겨온다. 다만 세부에서 사고방식이 다르다. Pydantic 이 자바 Bean Va...
GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
자바로 백엔드만 짤 때는 컴퓨팅 자원이 단순했다. CPU 코어 수, JVM heap (-Xmx), 시스템 RAM. 워크로드가 커지면 인스턴스를 늘리거나 스레드를 늘리는 게 답이었다. ML 서비스를 다루기 시작하면 그림이 한 층 더 생긴다. GPU 라는 별도 컴퓨팅 장치, 그 안의 VRAM 이라는 별도 메모리, 그리고 그것들을 다루는 CUDA·cuDNN·MP...
Java 개발자를 위한 Python 문법 핵심
자바 백엔드만 다뤄오다가 Python 기반 ML 서비스를 분석해야 할 일이 생겼다. 코드를 읽기 시작하자마자 한 줄짜리 함수가 데코레이터로 둘러싸여 있고, 타입은 어디 갔는지 모르겠고, self 가 왜 첫 인자에 박혀 있는지 헷갈렸다. 이 글은 그때 내가 정리한 노트다. Python 을 처음부터 끝까지 훑는 게 아니라, 자바 개발자가 Python 코드를 빨...
Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
Post 1 (Python 문법 핵심) 에서 클래스·데코레이터·with·yield 는 다음 글로 미뤘다. 이 글에서 마저 정리한다. 코드를 "쓰는" 단계로 넘어가려면 이 다섯을 알아야 한다. 자바 record·Lombok·annotation·AutoCloseable·Iterator 와 1:1 로 비교해 가며 차이만 짚는다. Post 1 에서 양 옆에 언더스...
ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
이 시리즈의 마무리 글이다. 앞선 글들에서 다음 주제를 자바 백엔드 비교 관점으로 정리했다. - Python 문법 - 의존성 관리 - FastAPI - async/await - GPU·CUDA·MPS - PyTorch - multi-process worker pool - OCR 파이프라인 마지막은 이 모든 개념을 적용해 실제 ML 서비스의 성능을 분석하는...
Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
자바 백엔드에서 ThreadPoolExecutor 는 거의 만능이었다. CPU bound 든 I/O bound 든 스레드 풀 크기만 잘 잡으면 동시성을 챙길 수 있었다. JVM 안에서 메모리를 공유하니 작업 간 데이터 전달도 가볍다. Python ML 서비스는 그림이 다르다. ThreadPoolExecutor 가 있지만 CPU/GPU 작업에서는 거의 안 쓰...
OCR 동작 원리 — Layout · Text · Post-process 3단계
자바 백엔드만 다뤄오다가 OCR (Optical Character Recognition) 서비스를 분석할 일이 생겼다. "이미지에서 글자를 뽑는다" 라는 한 줄 요약은 알았지만, 실제 코드를 열어보면 모델이 둘이상이고, 여러 단계가 직렬·병렬로 엮여 있고, "왜 이 단계가 따로 있지" 같은 의문이 계속 생긴다. 이 글은 OCR 파이프라인의 표준 구조를 정리...
Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
자바에서 비동기를 다루는 방법은 시대마다 달랐다. Future.get() 의 블로킹 시절, CompletableFuture 의 콜백 체인, Reactor·RxJava 의 스트림. 모두 별도 스레드에서 작업을 돌리고 결과를 받아오는 모델이다. Python 의 async/await 는 다르다. 단일 스레드 안에서 이벤트 루프가 코루틴을 번갈아 실행한다. 처음...
Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
Python 으로 long-running 서버 (FastAPI / Flask / Celery / uWSGI 등) 를 운영하다 보면 한 번쯤 마주치는 증상이 있다. - 워커 프로세스의 RSS 가 시간이 지날수록 단조 증가한다 - 큰 객체를 del 하고 gc.collect() 를 불러도 RSS 가 줄지 않는다 - 결국 max-requests / workerma...
Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
자바 백엔드만 다뤄오다가 Python 프로젝트를 처음 받았을 때 가장 황당했던 게 의존성 관리였다. Maven 이면 pom.xml 한 파일, Gradle 이면 build.gradle 한 파일에서 의존성·빌드·플러그인이 다 처리된다. Python 프로젝트는 다음 파일이 섞여 있어 어디서부터 봐야 할지도 모르겠다. - requirements.txt - pypr...
PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
자바 백엔드에서 Spring Boot 가 부팅하는 시간이 5-30초 걸리는 게 일반적이다. 클래스 로딩, 컴포넌트 스캔, 의존성 주입, EntityManagerFactory 초기화 등이 누적된다. 한 번 부팅하면 그 뒤로는 요청 처리에 거의 영향이 없다. PyTorch 기반 ML 서비스는 비슷하지만 한 단계 더 무겁다. 우리 프로젝트의 KR Worker 가...