# SQLite로 실제 쇼핑몰을 운영하며 배운 것들

> Clean Markdown view of GeekNews topic #28377. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=28377](https://news.hada.io/topic?id=28377)
- GeekNews Markdown: [https://news.hada.io/topic/28377.md](https://news.hada.io/topic/28377.md)
- Type: news
- Author: [darjeeling](https://news.hada.io/@darjeeling)
- Published: 2026-04-10T11:17:01+09:00
- Updated: 2026-04-10T11:17:01+09:00
- Original source: [ultrathink.art](https://ultrathink.art/blog/sqlite-in-production-lessons)
- Points: 31
- Comments: 4

## Summary

AI 에이전트가 자율 운영하는 쇼핑몰을 **SQLite + Rails 8**로 프로덕션에 올리면서 겪은 실전 경험담입니다. 2시간에 11번 배포하다가 블루-그린 배포 겹침으로 **Stripe 결제는 됐는데 DB에 주문이 안 남는** 사고가 발생한 이야기가 생생합니다. 해결책이 기술적이 아니라 "배포 속도를 늦춰라"라는 절차적 규칙이었고, 이걸 `CLAUDE.md`에 명시해서 AI 에이전트가 따르게 했다는 점이 재미있습니다. SQLite 프로덕션 도입을 고민하는 분에게 **실패 사례까지 포함된 귀한 레퍼런스**입니다.

## Topic Body

ultrathink.art는 AI 에이전트가 자율적으로 운영하는 이커머스 쇼핑몰이다. 상품 디자인, 주문 처리, 블로그 작성까지 모두 AI가 담당한다. 이 글은 그 쇼핑몰을 실제 Stripe 결제까지 처리하는 프로덕션 환경에서 SQLite로 운영하면서 겪은 경험을 담고 있다.  
  
---  
  
#### 구성: 파일 4개, 볼륨 1개  
  
프로덕션 환경에서 `primary`(주문·상품·사용자), `cache`(Rails 캐시), `queue`(백그라운드 잡), `cable`(Action Cable) 총 4개의 SQLite 데이터베이스를 운영하며, 모두 Docker 볼륨 하나에 저장된다.  
  
Rails 8이 SQLite를 1등 선택지로 만들어줬고, 실제로 배포 단순화, 커넥션 풀 관리 불필요, 별도 DB 서버 없음 등의 장점을 누렸다.  
  
---  
  
#### WAL 모드가 동시성을 가능하게 하는 원리  
  
SQLite 기본 저널 모드는 쓰기 시 DB 전체를 잠가 동시 요청이 많은 웹 앱에는 부적합하다. WAL(Write-Ahead Logging) 모드에서는 쓰기가 별도 `-wal` 파일에 추가되고 읽기는 메인 파일을 계속 사용하므로, 다수의 읽기와 단일 쓰기가 동시에 가능하다. Rails 8은 SQLite에 WAL 모드를 기본 활성화한다.  
  
---  
  
#### 사고: 주문 2건이 사라졌다  
  
2월 4일, 2시간 동안 11번의 커밋을 main에 푸시했다. 각 푸시마다 Kamal의 블루-그린 배포가 실행되어 기존 컨테이너와 신규 컨테이너가 동시에 동일한 WAL 파일을 열게 되는 겹침 구간이 생겼다. 배포 11회가 겹치면서 컨테이너 A가 드레이닝 중에 B가 시작되고, B가 완전히 준비되기 전에 C의 배포가 시작되는 상황이 발생했다.  
  
주문 16번과 17번은 Stripe에서 결제가 성공했고 고객 계좌에서 금액도 빠져나갔지만, DB에는 레코드가 남지 않았다. `sqlite_sequence`로 확인하니 자동증가 카운터는 17을 가리켰는데 실제 행은 15개뿐이었다.  
  
---  
  
#### 해결책: 배포 속도를 늦춰라  
  
해결책은 기술적이 아니라 절차적이었다. 관련 변경 사항을 묶어 배포하고, 빠른 연속 푸시를 피하는 규칙을 AI 에이전트들이 따르는 거버넌스 파일(`CLAUDE.md`)에 명시했다.  
  
이는 SQLite 문제가 아니라 배포 파이프라인 문제다. PostgreSQL은 TCP 소켓을 통해 연결되므로 새 컨테이너도 동일한 DB 서버에 연결되어 쓰기 순서를 DB 엔진이 관리한다. SQLite는 공유 Docker 볼륨의 파일시스템 잠금에 의존하는데, 컨테이너가 겹치면 이것이 깨진다.  
  
---  
  
#### `sqlite_sequence`: 포렌식 도구로 활용하기  
  
`sqlite_sequence` 테이블은 SQLite에서 가장 저평가된 디버깅 도구다. 나중에 삭제된 행이라도 과거에 자동증가 값이 할당된 최댓값을 기억한다. 현재 행 수와 시퀀스 값이 예상 밖으로 벌어지면 무언가 행을 잘못 삭제했다는 신호다.  
  
---  
  
#### 아무도 말 안 해주는 함정들  
  
PostgreSQL 개발자들이 습관적으로 쓰는 `ILIKE`는 SQLite에서 구문 오류를 낸다. `LOWER(name) LIKE`를 대신 써야 한다. `json_extract`는 값이 숫자로 저장됐다면 정수를 반환해 문자열 비교 시 조용히 실패한다. `kamal app exec`는 매번 새 컨테이너를 생성하는데, 2GB RAM 서버에서 동시에 두 번 실행하면 OOM 킬러가 웹 프로세스를 죽인다.  
  
---  
  
#### 다시 선택해도 SQLite를 쓸 것인가?  
  
그렇다. 단일 서버에 적당한 쓰기 부하라면 SQLite는 인프라 복잡도를 통째로 없애준다. 백업도 sqlite3 `.backup` 명령 하나면 충분하다(WAL 모드와 동시 쓰기를 안전하게 처리한다). 수평 확장이나 진정한 멀티 라이터 동시성이 필요해지는 날이 오면 그때 PostgreSQL로 마이그레이션하면 된다. Rails는 그 전환을 간단하게 만들어준다.  
  
  
---  
  
*원문: [ultrathink.art Blog, 2026.04.03](https://ultrathink.art/blog/sqlite-in-production-lessons)*

## Comments



### Comment 55101

- Author: click
- Created: 2026-04-11T16:47:27+09:00
- Points: 3

아무리 인프라 복잡도 문제가 있더라도 쇼핑몰 같이 동시 쓰기가 많이 필요한 곳에서는 처음부터 sqlite를 쓰지 않는 게 좋은 선택이지 않을까요?  
심지어 도커로 구성한거였으면 postgresql 구성의 인프라 복잡도가 많이 높지도 않을텐데요.  
rails 로 만들어서 생태계가 sqlite 를 사용하는 쪽으로 틀이 잡혀있으니 좋다고 유도된거라는 의견이 드네요  
주문 누락같은 중대한 오류가 발생했고 pg 같은 동시 쓰기 문제가 있더라도 쇼핑몰 같이 동시 쓰기가 많이 필요한 곳에서는 처음부터 sqlite를 쓰지 않는 게 좋은 선택이지 않을까요?  
rails 로 만들어서 생태계가 sqlite 를 사용하는 쪽으로 틀이 잡혀있으니 좋다고 유도된거라는 생각이 드네요.  
주문 누락같은 중대한 오류가 발생했고 이걸 근본적으로 해결하는 건 pg 같은 동시 쓰기 db를 사용하는 방법인데  
sqlite를 기술적으로 선호하니까 이걸 계속 쓸거라고 고집하는건 제게는 엔지니어로서 신뢰가 떨어뜨리는 발언으로 들립니다.  
필요없는데 k8s를 올리고 replica 1짜리 HPA 구성하고 잘 쓰던 모노리스를 MSA로 바꾸는 이력서 드리븐 개발의 반대버전으로 느껴지네요

### Comment 55130

- Author: okxrr
- Created: 2026-04-12T10:12:02+09:00
- Points: 2
- Parent comment: 55101
- Depth: 1

컨테이너로 띄울때 볼륨 설정을 잘못한게 문제지 동시쓰기가 안되서 문제가 된 것이 아닙니다. 글을 다시 읽어보시면 동시쓰기가 안되는건 busy timeout 으로 충분히 커버된다고 나와있어요. 볼륨 설정은  
ipc=host 로 해결이 될거구요.  
  
postgres는 결국 운영을 해야하고 sqlite는 어디든 앱 바이너리만 배포하면 됩니다.  
   
수많은 운영 경험과 실패들이 쌓이다보니 sqlite가 유행하기 시작하는 것이고  
동시쓰기는 글에서도 전혀 문제가 아니라고 분명히 나와있습니다.

### Comment 55131

- Author: darjeeling
- Created: 2026-04-12T10:27:54+09:00
- Points: 1
- Parent comment: 55130
- Depth: 2

사실 여러가지 설정만 하면되는데요, 결국 경험이 필요하죠 흐흐. 여튼 이런글이 저는 좋더라구요.

### Comment 55102

- Author: darjeeling
- Created: 2026-04-11T16:55:12+09:00
- Points: 2
- Parent comment: 55101
- Depth: 1

그렇쵸, 그러기에 더더욱 이런글이 가끔 올라오면 좋겠네요.
