| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- electron
- javascript
- React
- next.js
- 도메인설계
- php
- Vite
- 마이그레이션
- 백엔드
- 인증
- 프론트엔드
- typescript
- contextBridge
- 온디바이스AI
- Kotlin
- github actions
- sqlite
- JWT
- 배포
- FastAPI
- 크롤링
- 상태관리
- 아키텍처
- REST API
- playwright
- 소셜로그인
- 메일자동화
- 보안
- python
- Android
- Today
- Total
목록sqlite (6)
HM소프트
쇼핑몰 고객 상담 챗봇을 LLM 없이 규칙 기반으로 만든 기록. 버튼 우선·자유 입력 보조의 두 갈래 대화 엔진과 키워드·FAQ 양방향 매칭, 환불 정책을 SQL 조건으로 표현하기, sql.js의 동시성 트레이드오프, npm ci와의 CI 싸움까지 담았다.왜 LLM 없이 시작했나쇼핑몰에 들어오는 고객 문의는 패턴이 지독하게 뻔하다. "주문한 거 언제 와요", "환불 어떻게 해요", "사이즈 바꿀 수 있나요". 상담 인력이 같은 답을 하루에 수십 번씩 복사·붙여넣기 하는 걸 보면, 이건 사람이 아니라 코드가 할 일이라는 생각이 든다. 그래서 한 쇼핑몰의 고객 상담용 챗봇을 만들기로 했다.처음부터 외부 LLM API를 붙일 수도 있었다. 하지만 일부러 그 길을 택하지 않았다. 이유는 세 가지였다. 첫째, 쇼..
PHP 8.1과 SQLite(PDO)로 클론하면 바로 도는 0-setup 브랜드 사이트를 만든다. 첫 요청이 곧 설치 과정이 되는 db() 함수, CREATE TABLE IF NOT EXISTS 스키마, 버전 플래그로 운영 DB까지 따라잡는 멱등 마이그레이션이 뼈대다. c() 헬퍼로 코드에서 문구를 분리해 관리자 폼이 스스로 그려지게 하고, DB-override 패턴으로 안전한 기본값과 유연한 변경을 통일한다.시리즈를 시작하며한 사회적기업의 브랜드 소개 웹사이트를 만들었다. 브랜드 스토리, 활동 소개, 제품 상세, 소식(news), 임팩트 통계를 보여주고, 운영자가 콘텐츠를 직접 고치는 사이트다. 스택은 단순하다. PHP 8.1 + SQLite(PDO), 프레임워크 없음, 빌드 도구 없음. php -S로..
오번역을 막는 번역 필요 여부 가드와 스레드 로컬 번역기 격리, 429 분기 백오프, 원문·번역 칸을 모두 훑는 다필드 LIKE 검색과 이스케이프, 화면과 일치하는 내보내기, 국가별 시각 분산과 직렬화 락 스케줄러, APScheduler 잠자기 방어, UNIQUE 마이그레이션, Electron 포트 폴백·트레이 상주까지 데스크톱 앱화 기록. 4편: 검색·번역·스케줄러·데스크톱시리즈 마지막이다. 1편 파이프라인, 2편 PDF 파싱, 3편 강건성에 이어, 이번엔 사용자가 실제로 만지는 부분과 운영 자동화를 한 번에 다룬다.번역 — "되게"보다 "틀리지 않게"수집한 외국어 원문은 googletrans로 번역했다. 네트워크 작업이라 실패가 잦아, 재시도와 백오프를 넣었다.def translate_with_ret..
BaseCrawler 추상 클래스로 5개 공개 데이터 출처(벌크 API·주간 XML·웹페이지 PDF)를 하나의 수집-파싱-저장 파이프라인에 통합한 설계. fetch/parse 두 메서드만 출처별로 구현하고, Pydantic 공통 모델의 원문/번역 분리, COALESCE UPSERT 중복 제거, 2단계 보강, 건별·출처별 격리, 수집과 번역 분리까지 다룬다.시리즈를 시작하며 — "출처가 5개인데 화면은 하나여야 한다"여러 나라가 각자 공개하는 제품 리콜 데이터를 한곳에 모아, 자동으로 번역하고, 검색·내보내기까지 되는 데스크톱 앱을 만들었다. 한 줄로 줄이면 "공개 데이터 크롤러"지만, 실제로 시간을 잡아먹은 건 크롤링 그 자체가 아니었다. 나라마다 데이터를 주는 방식이 전부 다르다는 점이 모든 설계 결정..
프린터·커팅기·결제 단말이 없는 상태에서 스텁 드라이버로 전체 흐름을 완성한 기록. 추상 인터페이스 대신 함수 시그니처를 계약으로 고정하고, 3초 지연까지 흉내 내 진행·타임아웃·재시도 UX를 검증하며, 장비 상태를 IPC 한 채널로 통합해 화면이 구현을 모르게 만든 설계를 다룬다.장비가 책상 위에 없을 때 개발을 시작하는 법현장에 설치되는 무인 키오스크는 화면만으로 끝나지 않는다. 결과물을 실제로 찍어 내는 프린터, 스티커 외곽선을 따는 커팅기, 카드를 받는 결제 단말기, 그리고 사용자가 이미지를 들고 오는 USB 저장장치까지 — 물리 장비 네 종이 소프트웨어와 맞물려 돌아간다. 그런데 개발하는 사람 입장에서 이 장비들이 늘 책상 위에 놓여 있는 건 아니다. 결제 단말기는 가맹 계약과 실물 단말이 와야..
Electron 키오스크 앱의 메인-렌더러 프로세스 경계를 contextBridge와 nodeIntegration:false로 설계한 기록. Preload IPC 브릿지로 표면을 좁히고, 내장 SQLite를 WAL·외래키·CHECK 제약으로 단단히 묶고, 하드웨어를 스텁으로 추상화해 같은 코드를 브라우저 데모로도 굴린 과정을 다룬다.시리즈를 시작하며현장에 무인으로 설치되는 터치스크린 키오스크를 한 대 만들었다. 사용자가 화면에서 직접 이미지를 올리고 글자를 얹어 굿즈 표면 디자인을 만들고, 그 자리에서 카드로 결제한 뒤, 옆에 붙은 인쇄·커팅 장비로 결과물을 받아 가는 흐름이다. 즉 이 앱은 순수한 웹 화면이 아니라 실제 하드웨어와 맞물려 돌아가는 데스크톱 앱이어야 했다. 동시에 영업·전시용으로 브라우저..