FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법
·
Language/Python
FastAPI에서 의존성 주입을 사용하다 보면 Ruff 또는 flake8-bugbear에서 B008 경고가 발생할 수 있습니다.예를 들어 다음과 같이 Depends()를 기본 인자로 사용하는 코드는 FastAPI에서 매우 일반적인 패턴입니다.from fastapi import Dependsasync def get_user(db=Depends(get_db)): ...하지만 Ruff는 이 코드를 보고 다음과 같은 경고를 표시할 수 있습니다.B008 Do not perform function call `Depends` in argument defaults처음에는 코드가 잘못 작성된 것처럼 보였지만, 확인해보니 FastAPI의 Depends() 사용 방식에서는 일반적인 버그가 아니라 Ruff의 오탐(fal..
Kubernetes 로컬 환경에 Private Registry 배포하고 이미지 Push/Pull 설정하기
·
Devops/Kubernetes
이번 글에서는 Kubernetes 클러스터 내부에 Private Registry를 배포하고, 로컬 Docker 환경과 Kubernetes 노드에서 해당 Registry를 사용할 수 있도록 설정하는 과정을 정리합니다. 구성은 다음과 같습니다.Registry 데이터를 저장할 PersistentVolume / PersistentVolumeClaimRegistry Pod를 실행할 Deployment외부에서 Registry에 접근하기 위한 NodePort ServiceDocker에서 HTTP Registry로 이미지를 push하기 위한 insecure registry 설정Kubernetes 노드의 containerd에서 HTTP Registry 이미지를 pull할 수 있도록 하는 설정이 예제에서는 NFS 볼륨을 ..
로컬 Kubernetes에서 MetalLB로 LoadBalancer IP 할당하기
·
Devops/Kubernetes
로컬 Kubernetes 클러스터에서는 클라우드 환경처럼 LoadBalancer 타입 Service에 외부 IP가 자동으로 할당되지 않습니다.예를 들어 클라우드 Kubernetes 환경에서는 type: LoadBalancer Service를 생성하면 클라우드 로드밸런서가 생성되고 외부 IP가 할당됩니다.하지만 로컬 Kubernetes 환경에서는 별도의 로드밸런서 구현체가 없기 때문에 Service의 EXTERNAL-IP가 상태로 남는 경우가 많습니다.이 문제를 해결하기 위해 사용할 수 있는 도구가 MetalLB입니다.MetalLB는 로컬 또는 온프레미스 Kubernetes 환경에서 LoadBalancer 타입 Service에 외부 IP를 할당해주는 로드밸런서 구현체입니다.이번 글에서는 MetalLB를 ..
Gateway API와 Envoy Gateway로 로컬 Kubernetes 서비스 노출하기
·
Devops/Kubernetes
Kubernetes에서 서비스를 외부로 노출할 때는 보통 Ingress를 많이 사용합니다.하지만 최근에는 Ingress보다 더 확장성 있고 명확한 라우팅 모델을 제공하는 Gateway API를 사용할 수 있습니다.이번 글에서는 로컬 Kubernetes 환경에서 port-forward 없이 서비스에 접근하기 위해 Gateway API와 Envoy Gateway를 구성한 과정을 정리합니다.구성에 사용한 주요 요소는 다음과 같습니다.Gateway APIKubernetes에서 외부 트래픽을 서비스로 라우팅하기 위한 표준 API입니다.GatewayClass, Gateway, HTTPRoute 같은 리소스를 사용해 라우팅 구성을 정의합니다.Envoy GatewayGateway API를 구현하는 컨트롤러입니다.Gat..
Cloudflare Tunnel과 Access로 로컬 서비스를 외부에 안전하게 공개하기
·
클라우드/CloudFlare
Cloudflare Tunnel과 Zero Trust Access 설정하기(2026-05-20 기준) 로컬 환경이나 내부 네트워크에서 실행 중인 서비스를 외부에서 접근해야 하는 경우가 있습니다.일반적으로는 공유기에서 포트포워딩을 설정하거나, 서버의 방화벽과 네트워크 설정을 직접 수정해야 합니다.하지만 Cloudflare Tunnel을 사용하면 포트포워딩 없이 내부 서비스를 외부 도메인에 연결할 수 있습니다.또한 Cloudflare Access를 함께 사용하면 특정 사용자만 접근할 수 있도록 인증 정책을 적용할 수 있습니다.이번 글에서는 Cloudflare Tunnel을 생성하고, 로컬 애플리케이션을 연결한 뒤, Zero Trust Access 정책을 적용하는 과정을 정리합니다.1. Cloudflare T..
Kubernetes에서 NFS 스토리지 구성하기
·
Devops/Kubernetes
Kubernetes에서 여러 Pod가 하나의 볼륨을 함께 사용해야 하는 경우가 있습니다.대표적으로 ReadWriteMany 접근 모드가 필요한 상황인데, 이때 NFS를 이용하면 비교적 간단하게 공유 스토리지를 구성할 수 있습니다.이번 글에서는 다음 두 가지 방식을 정리합니다.NFS 서버를 직접 구성한 뒤 PV/PVC를 수동으로 생성하는 방식NFS Provisioner를 설치해 PVC 생성 시 PV가 자동으로 생성되도록 하는 방식1. NFS 서버 설정먼저 Control Plane 노드에 NFS 서버를 설치하고, 공유할 디렉터리를 생성합니다.sudo apt install nfs-kernel-server -ysudo mkdir /nfsvolumeecho " Hello NFS Volume " | sudo tee..
VS Code launch.json 으로 FastAPI 디버깅 환경 구성하기
·
환경구성
FastAPI 프로젝트를 개발할 때 VS Code의 디버그 기능을 사용하면 편리하게 서버를 실행하고 디버깅할 수 있습니다.이번에는 .vscode/launch.json을 설정해 FastAPI 앱을 실행하고, 실행할 때마다 포트를 직접 입력받도록 구성한 내용을 정리합니다.개요FastAPI는 보통 uvicorn을 사용해 실행합니다.예를 들어 터미널에서는 다음과 같이 실행할 수 있습니다.uvicorn app.main:app --reload --port 8000하지만 개발 중에는 VS Code의 디버그 실행을 사용하는 경우가 많습니다. 이때 매번 포트를 고정하지 않고, 실행 시점에 직접 입력하고 싶어 VS Code의 inputs 기능을 사용했습니다.launch.json 설정.vscode/launch.json 파일..
Python 타입 힌트: Optional, Union, T | None 차이 정리
·
Language/Python
Python 타입 힌트를 작성하다 보면 값이 특정 타입이거나 None일 수 있는 경우가 있습니다.예를 들어 함수의 인자로 문자열을 받을 수도 있고, 값이 전달되지 않으면 None을 기본값으로 사용할 수도 있습니다. 이런 경우 기존에는 Optional[T] 또는 Union[T, None]을 사용했습니다.하지만 Python 3.10 이상부터는 T | None 문법을 사용할 수 있습니다. 더 간결하고 직관적이기 때문에 최근 코드에서는 이 방식을 많이 사용합니다.기존 방식: Optional[T]Python 3.10 이전에는 typing.Optional을 사용해 None이 가능한 타입을 표현했습니다.from typing import Optionaldef greet(name: Optional[str] = None)..
MSA에서 DB를 서비스별로 나누는 이유
·
Database
MSA 구조를 공부하다 보면 “서비스별로 DB를 분리해야 한다”는 이야기를 자주 보게 됩니다.처음에는 단순히 데이터를 물리적으로 나누기 위한 것처럼 보일 수 있습니다.하지만 DB를 나누는 가장 큰 목적은 단순한 데이터 분리보다 서비스 간 책임 경계를 명확히 하는 것에 가깝습니다.테이블만 나누는 경우하나의 DB 안에 여러 서비스의 테이블을 함께 두는 방식도 가능합니다.예를 들어 다음과 같은 구조입니다.app_db├── users├── products├── orders└── payments이 구조에서는 데이터가 테이블 단위로 분리되어 있습니다.user-service는 users 테이블을 사용하고, product-service는 products 테이블을 사용하도록 규칙을 정할 수 있습니다.user-servic..
Git Hook으로 브랜치 이슈 번호를 커밋 메시지에 자동 추가하기
·
Git
Git Hook으로 브랜치 이슈 번호를 커밋 메시지에 자동 추가하기프로젝트를 진행하다 보면 커밋 메시지에 이슈 번호를 함께 남겨야 하는 경우가 많습니다.예를 들어 브랜치 이름이 다음과 같다면,feature/#1커밋 메시지 끝에 자동으로 feature/#1을 붙이고 싶었습니다.feat: 로그인 API 구현 feature/#1매번 직접 입력해도 되지만, 반복 작업이기 때문에 Git Hook을 사용해 자동화했습니다.이번 글에서는 .git/hooks/prepare-commit-msg Hook을 수정해 현재 브랜치 이름에서 이슈 번호를 추출하고, 커밋 메시지에 자동으로 추가하는 방법을 정리합니다.prepare-commit-msg Hook이란?Git에는 특정 시점에 자동으로 실행되는 Hook 기능이 있습니다.그중 ..