Vibe Coding

Next.js rewrites는 일반 HTTP는 흘려보내 주는데, WebSocket handshake(HTTP Upgrade 요청)는 통과시키지 못한다 — 따라서 프록시만 있으면 ws 연결이 안 만들어지고, 증상은 "채팅 접속이 안 된다"나 "가끔 끊긴다"다. 해결 패턴: UI와 REST는 프록시, 웹소캣만 백엔드 직결. ws://backend:port/ws/...로 프론트에서 직접 붙인다 — 쿠키는 포트를 무시하고 도메인만 보는 매칭이라 세션 검증이 그대로 통한다. 두 가지 여운: 로컬 HTTP에서는 문제가 잘 안 보이다(Secure

멀티테넌 커뮤니티에서 RLS를 실제로 심어보며 얻은 것들, 다섯 개다. 1) FORCE ROW LEVEL SECURITY부터 걸어라 — 걸지 않으면 테이블 소유자에게는 정책이 적용되지 않는다. "소유자 롤은 런타임에 절대 안 쓴다"는 규칙과 함께 소유자 누설을 봉쇄한다. 2) 세션 주입은 set_config(..., true) — 트랜잭션 내 is_local로만. PgBouncer 트랜잭션 모드에서 다음 요청이 앞 사용자의 권한을 상속하는 사고(§: 화면엔 아무 증상이 없다)를 막는다. 3) owner 롤은 마이그레이션·배치 전용

개발은 "완성"에서 끝나지 않는다. 서비스가 처음 열릴 때 가장 중요한 건 빈 페이지를 보여주지 않는 것 — 그래서 이번 라운드는 시드 콘텐츠였다: 개발 일지 시리즈 5편, 쇼케이스 2편, 꿀팁 4편, Q&A 마중물 4건. 씨앗 규칙은 셋이다. ① 가짜 인기를 만들지 않는다 — 가짜 댓글과 추천 몰아주기는 신뢰를 부순다. 시드 계정은 일지를 쓸 3명뿐이다. ② 결함과 실측 수치는 숨기지 않는다 — 2,435→44→5, 53300, WS 프레임 스킴 같은 실제 배움만 기록한다. 성공 위주의 글은 일지가 아니라 광고다. ③ 마중물 질문은

이번 편은 실제 크래시 3건의 정리 — 전부 논리 버그가 아니라 설정/라이프사이클 문제였다. ① Postgres 커넥션 소진 — error 53300. DB 접근 팩토리가 Pool을 호출마다 돌려주고 아무도 안 끊는 설계에서, 워커가 RSS 아이템마다 호출하는 순간 커넥션 한도가 붕괴했다 — sorry, too many clients already. 고쳐주는 게 싱글턴 memoize + 워커 종료 시 풀 end(). 배움: "팩토리 함수가 리소스를 뱉는다"는 설계는 호출자가 반드시 되돌림 책임을 지지 않으면 그대로 누수가 된다.

커뮤니티의 제일 뿌리는 고민은 "빈 페이지에 글을 쓸 글러리를 모으는 것"이다 — 그래서 자동 콘텐츠로 뉴스봇을 심었다. 파이프라인: 8개 RSS 소스 수집 → 중복 제거(URL UNIQUE + 제목 trigram 유사도 문턱 0.85) → 7일 오래 원문 스킵 → 한국어 요약(LLM) → 봇 계정 발행. 실측하나: 어느 하루 사이클에서 fetched 2,435건 → 기록 44건 → 발행 5건. 절반 이상이 유사도 문턱에서 버려졌다. RSS는 과거 번들을 다시 주고, 같은 소식을 여러 소스가 따로 접수한다 — "같은 소식 다른 소스"

커뮤니티 서비스는 게시글 하나에 조회 권한이 얽힌다 — 팔로우/친구/차단/모더레이터 등. 이걸 화면 코드에 분기로 심으면 사고 대열이 무한하다. 이 프로젝트는 Postgres RLS를 제일 먼저 심었다 — 화면은 권한을 몰라도 조회 자체가 필터된 채 돌아온다. 화면이 실수하면 침묵으로 막힌다. "화면이 맞는데 권한이 뚫리는" 실수가 더 큰 사고다. 규칙 한 개는 깨지 않는다: 세션 변수는 반드시 트랜잭션 안에서 set_config(..., true)(is_local)로 주입한다. 세 번째 인자 true가 없으면 PgBouncer 트랜잭션

시작은 "어차피 고쳐 쓸 텐데?"였다. 이전에 운영하던 커뮤니티 프레임웍(Reafy)은 4년 동안 운영과 패치가 쌓여 있었고, fork를 뜯어보는 30분이면 결론이 나왔다 — 거기서 바꿔 쓰는 것보다 벗겨내는 게 노력이 덜 든다. 그래서 내린 결정 하나: 스키마(모델)와 배움은 이어받고, 코드는 한 줄도 이어받지 않는다. 테이블 정의와 운영 배움(작동 원리, 실패 이력, 테스트 전략)은 그대로 끌어오고, 논리·라우트·화면은 전부 새로 썼다. 유지보수 비용이 안 늘게 의존성을 backend/ 한 폴더 안에 밀어 넣었다. 차이가 가장