본문 바로가기

분류 전체보기39

[FastAPI] 요청 단위 로깅 구현하기 - Middleware, ContextVar, Decorator 문제상황: 요청 단위 로깅 및 쓰레드 로컬이번에 로깅 시스템을 개선하는 작업을 진행했습니다. 원래는 아주 단순한 수준의 로깅만 되어 있었는데, 실제로 장애나 예외 상황이 발생했을 때 특정 요청의 흐름을 추적하기가 너무 어려웠습니다. 예를 들어, 같은 시점에 여러 요청이 들어오면 로그가 섞여버리기 때문에 "이 로그가 어떤 요청에서 나온 건지" 확인하려면 로그 타임스탬프나 유추에 의존해야 했습니다. 그래서 이번에 요청 단위로 UUID 같은 고유한 ID를 부여하고, 그걸 모든 로그에 자동으로 포함시키는 방식을 적용했습니다. 자바/스프링에서는 AOP와 ThreadLocal을 지원하기 때문에 이러한 로깅을 손쉽게 적용할 수 있습니다. 요청이 들어올 때마다 ThreadLocal에 request ID를 저장하고, .. 2025. 10. 14.
[Python] Context Manager 문제상황프로젝트를 운영하던 중, 로그에 주기적으로 아래와 같은 에러가 발생했습니다. [ERROR] token_manager: Thread error during token refresh 처음에는 일시적인 네트워크 문제나 인증 서버의 응답 지연이라고 생각했지만, 해당 로그가 계속 같은 주기로 쌓이고 있었고, 특정 기능을 호출하지 않아도 지속적으로 에러가 발생했습니다. 결국 코드 레벨에서 로그를 추적한 결과, 해당 오류는 제가 작성한 코드가 아니라 사용 중이던 SDK 내부의 토큰 관리 스레드(token_manager)에서 발생하고 있음을 확인했습니다. 이 객체는 내부적으로 인증 토큰을 자동으로 갱신하는 token_manager를 가지고 있었고, 토큰 만료 시마다 백그라운드 스레드를 통해 지수 백오프(Expo.. 2025. 10. 1.
Colima + IntelliJ에서 Docker Compose 실행 문제 해결 해당 글은 ChatGPT를 활용하여 작성하였습니다. AI 특성상 잘못된 정보가 포함되어있을 수 있습니다. 1. 문제 상황개인 개발 환경에서 Colima를 사용하고 있었는데,IntelliJ에서 Docker Compose 실행을 시도하니 문제가 발생했다.IntelliJ는 기본적으로 docker compose (공식 v2 CLI)를 호출하지만 내 Colima 환경에서는 docker-compose (하이픈 버전)만 동작결과적으로 IntelliJ에서 Compose 실행이 불가능한 상태가 됐다👉 IntelliJ는 docker compose만 아는데, 내 환경은 docker-compose만 된다 라는 충돌 발생2. 시도한 방법들처음에는 래퍼 스크립트를 만들어서 docker compose → docker-compo.. 2025. 9. 30.
[임베디드] 밸런싱 로봇 (1) - MPU6050, L298N 기본개념MPU6050 6축 자이로 가속도 센서MPU6050은 3축 가속도계(Accelerometer)와 3축 자이로스코프(Gyroscope)를 통합한 6축 IMU(Inertial Measurement Unit, 관성 측정 장치) 센서입니다. MPU6050를 사용하면 가속도 + 회전 데이터를 동시에 읽을 수 있고, 이를 조합하여 자세 추정(orientation estimation), 기울기 감지, 자율주행 로봇의 자세 보정 등을 할 수 있습니다.3축 가속도계 (Accelerometer)X, Y, Z 축 방향으로의 선형 가속도(중력 포함)를 측정로봇의 기울기, 이동 속도 변화 등을 계산할 때 활용3축 자이로스코프 (Gyroscope)X, Y, Z 축 회전 각속도(각도 변화율)를 측정회전 동작, 방향 변화 추.. 2025. 9. 28.
[Fastify] Prisma에서 Transaction 추상화 Prisma에서 트랜잭션을 처리하기 위해서는 Service 계층에 Prisma 관련 코드가 필요하게 됩니다. 하지만 Prisma 트랜잭션을 직접 다루면 Service 계층이 ORM에 의존하게 됩니다. 이를 해결하기 위한 방안으로 트랜잭션 관련 로직을 추상화하는 TransactionManager를 고민해보았습니다. Prisma Interactive TransactionPrisma에서 트랜잭션을 처리하는 방식으로, prismaClient.$transaction()을 활용한 Interactive Transaction 방식을 사용할 수 있습니다. 이를 통해 트랜잭션을 관리하며, 트랜잭션 내에서 여러 쿼리를 처리하는 것이 가능합니다. 예시 코드는 다음과 같습니다// prisma.client.tsexport con.. 2025. 3. 16.
[NestJS] Interceptor를 사용해서 Transaction 분리하기 Transaction 이란?데이터베이스의 여러 테이블의 값을 수정할 때 일관성을 유지하기 위해서 트랜잭션 단위로 처리 QueryRunnerTypeORM에서 트랜잭션 처리를 위해서는 QueryRunner를 사용합니다. QueryRunner는 데이터베이스 트랜잭션과 쿼리 실행을 관리하는 객체로, 여러 데이터베이스 쿼리를 하나의 트랜잭션 내에서 실행할 수 있도록 도와줍니다. 보통 복잡한 트랜잭션을 다룰 때 유용하게 사용되며, 여러 쿼리를 안전하게 묶어 실행할 수 있도록 돕습니다. import { getManager } from "typeorm";import { User } from "./entity/User";import { Post } from "./entity/Post";async function exam.. 2025. 3. 16.