프로그래밍 421

포이즌 필(Poison Pill) 패턴 : 멀티 스레드 프로세스를 안전하게 종료하는 방법

AI가 만들어낸 코드를 한 줄 한 줄 곱씹어 보던 중에 특이한 패턴을 발견했다.@classmethoddef stop_processor(cls): """백그라운드 처리 스레드 중지""" cls._is_running = False cls._processing_queue.put(None) 나라면 스레드를 종료하기 위해서 그냥 is_running 플래그만 False로 바꿔놨을 것 같은데, 왜 Queue에다가 None이라는 이상한 값을 집어 넣는걸까? 포이즌 필 패턴이는 안전하게 스레드를 종료하기 위한 포이즌 필(Poison Pill) 패턴이라고 한다.실생활에서 보이는 포이즌 필 패턴 예시가 재미있다.식당에서 "CLOSED" 사인을 걸어두는 것을 예로들 수 있다. 영업종료 시간이 다가오면 식당주인..

DASHI - 치지직 도네이션 연동 룰렛 업데이트

이번에 DASHI에서 업데이트한건 룰렛 기능이다.예전에 트위치 시절, 투네이션에서 룰렛 기능을 제공했었다. 최소금액이상 후원하면 룰렛 후원에 참여할 수 있고, 방송에 변수를 줄 수 있다. 룰렛 기능을 개발하기 위해서는 생각보다 많은 것이 필요하다.단순히 채팅 메세지를 받아 룰렛을 처리하는 작업 이외에도 OBS용 오버레이, 스트리머만 접근 가능한 룰렛 관리 화면을 준비해야한다. 예전같았다면 최소 일주일은 잡고 들어갔을테지만, 오늘 나는 10시간만에 모든 작업을 끝내버렸다. 바로, AI의 서포트 덕분이다. 이번 업데이트 회고를 작성하면서 AI와 함께 어떤식으로 개발했는지 공유해보려한다. 장애물 치우기AI와 개발할때 가장 중요한 점은 일을 단계별로 쪼개야한다는 것이다.어떤 목표지점에 도착하는게 일이라면 먼..

직접 RAG를 구축할 필요없게 해주는 Gemini File Search API

Chatbot을 만들면서 가장 귀찮았던건 RAG였다. RAG를 구현하기 위해 VectorDB라는 관리 포인트가 생기며, 임베딩 정책 및 모델 설정, 임베딩할 파일들을 관리하는 컴포넌트까지...RAG 구축 하나로 프로젝트가 복잡해지는 것은 순식간이다. 지난 11월 6일, Google이 Gemini 3, Nano Banana Pro와 함께 Gemini File Search API를 발표했다. Gemini File Search API는 Gemini API에 구축된 RAG 시스템이다. 텍스트 파일 종류라면 대부분 지원하며, File Store를 생성하고 파일을 업로드하는 간단한 절차만으로 검색 기능을 추가할 수 있다. 나는 사내 API 문서를 바탕으로 API에 대한 질의를 할 수 있는 하는 MCP서버를 만들어보..

[Android] Room이 생성한 Dao 구현체 확인방법

오늘 @Upsert 어노테이션을 사용해서 Collection 데이터를 넘겼을때 과연 "트랜잭션처리가 되는가?"에 대해서 검증해야할 일이 있었다. Room을 당연한듯이 사용하고는 했지만 너무 추상화되어있어서 내부 동작을 알지 못했다. 당연히- 트랜잭션처리가 될거라고, 되어야만 한다고 생각했지만, 어림짐작으로 그치지 않고 코드로 확실하게 보고싶었다. 안드로이드 빌드를 한번 끝내면 generated/build에 내 Dao이름 + _Impl 이름으로 Dao의 구현체에대한 Java Class가 생성되어있는 것을 볼 수 있다. upsert 함수가 이렇게 트랜잭션으로 감싸져 있는것을 확인했고, Room에 대한 흐릿한 불신을 지울 수 있게 되었다.@Override public Object upsert(fina..

OAuth 2.0 관련 용어 공부

인가(Authorization)확인된 사용자가 특정 자원에 접근할 권한이 있는지 확인 (권한 확인) 인증(Authentication)사용자가 누구인지 확인 (로그인)따라서 일반적인 순서: Authentication → Authorization 인증 서버(Authorization server)OAuth 2.0 프레임워크의 구성요소로, 클라이언트가 인증 및 인가에 성공하면 Access Token을 발급한다. Bearer 인증OAuth 2.0 프레임워크에서 사용하는 토큰 인증 방식. HTTP 통신시 Header에 “Authorization: Bearer ”과 같은 형식으로 사용한다. Basic 인증방식만으로는 사용자의 권한을 정교하게 제어할 수 없기 때문에 등장했다. 형식은 *불투명한(Opaque) 문자열일수..

Gevent 알아보기

gevent는 동시성과 네트워크 관련 작업들을 위한 다양한 API를 제공하는 동시성 라이브러리다. gevent에서는 Greenlet이라고하는 경량 코루틴을 사용한다. 한 번에 오직 하나의 greenlet만이 실행되기에, multiprocessing이나 threading을 이용한 병렬처리와는 다르다.yield를 통해 컨텍스트 스위칭이 이루어지며, 네트워크, I/O bound 작업을 처리할때 그 힘이 발휘된다. gevent는 네트워크 라이브러리들이 컨텍스트 스위칭이 가능한 시점에 yield하도록 보장해준다. Monkey patchasyncio를 사용하는 것 보다 gevent가 나은 점 중에 하나는 바로 monkey patch로 gevent를 사용하지 않는 다른 라이브러리들도 동시처리를 가능하도록 만들어준다는..

나노바나나로 피규어 만드는 방법 (더 상세한 설정 가능)

ChatGPT의 "지브리" 이미지 생성 열풍에 이어 Google의 나노 바나나가 피규어 만들기로 화제다.나노 바나나는 Gemini 2.5 Flash Image의 이름인데, 구글의 최신 이미지 생성 모델이다. 이미지의 맥락, 빛과 그림자를 이해하고, 일관성을 유지하는데 탁월한 모습을 보이고있다. 나노 바나나로 피규어 이미지를 만드는 방법은 LMArena에서 진행하는 방법이 널리 알려져있으나, LMArena는 서드파티 앱이기때문에 기본 설정밖에 사용하지 못한다. 나노 바나나는 Google 제품이기 때문에 Google Ai Studio를 활용하면 훨씬 더 자유로운 설정을 할 수 있고, 대화편집도 가능해서 일관된 이미지 생성에 더 유리하다. Google AI StudioGoogle AI Studio에 들어온 ..

[Python] Pipeline Pattern 구현

코드 베이스에대한 위키 문서를 작성하는 토이 프로젝트를 만드는 중, 선형적으로 진행되는 작업에 대해 깔끔하게 처리해야할 경우를 발견했다. 작업은 다음 순서대로 이어진다. 1. 코드 베이스를 다운받는다.2. 코드 베이스의 구조를 참고하여 작성할 위키 문서의 뼈대를 생성한다.3. 만들어진 뼈대의 각 페이지들을 생성한다.4. 전체 문서에 대한 인덱스 페이지를 생성한다.5. 변경사항을 다시 업로드한다. 이전 스텝의 진행이 실패하면 멈춰야하며, 각 스텝은 이전 스텝의 출력 또는 맥락을 필요로 한다.구현에 앞서, 어떻게 쓰고싶은지부터 정하면 늘 도움이 된다.pipeline = ( Pipeline.with_context(context) .register(Download) .register(Genera..

missing required module ‘GRDBSQLite’ 해결방법

Framework에서 GRDB를 사용할 경우, 빌드시 Swift Interface가 생성되면서 GRDBSQLite를 찾을 수 없다는 오류가 뜬다. Framework 내부에서만 GRDB를 사용한다면 import GRDB 대신에 internal import GRDB 로 GRDB를 사용한다면 Swift Interface에서 불필요한 GRDB 의존성이 노출되지않아 오류를 해결할 수 있다.Swift 6 이전 문법으로는 @_implementationOnly 라고 한다.@_implementationOnly import GRDB

프로그래밍/iOS 2025.07.31

실생활 예시로 이해하는 스윕 라인 알고리즘 (Sweep line Algorithm)

Sweep은 “쓸다”라는 의미를 가지고있는데, 스윕 라인 알고리즘은 빗자루로 먼지를 쓸어내듯이 특정 방향을 따라 스위핑하면서 점 또는 선을 확인하며 답을 찾아가는 알고리즘이다. 선분의 교차 여부, 구간 겹, 점의 분포등을 계산할 수 있기때문에 주로 시/공간의 겹침, 자원할당, 스케쥴링 문제를 다룰때 해결할 수 있는다. 나도 마찬가지로 회의실 예약 관련 Tool을 만들다 접하게되었다. 스윕 라인 알고리즘의 문제 해결과정은 대부분 이렇다:모든 데이터를 특정 기준에따라 정렬한다.스위핑 라인을 이동시키며 데이터를 하나씩 처리한다. 내 경우 회의실이 비는 시간을 파악하기 위해서 사용했는데, 이를 단순화한 예시로 스윕 라인 알고리즘을 알아보자. 3개의 회의실이 있고, 이미 예약된 회의가 있다.이미 예약된 회의가 ..