웅파
안녕하세요, 웅파입니다 — 26년째 PHP로 개발하고, 요즘은 AI와 같이 개발합니다
변종원(닉네임 웅파). CodeIgniter 한국 사용자 포럼을 만들고 책을 쓴 PHP 개발자이고, 지금은 AIvance라는 이름으로 SaaS 제품 11개를 Claude Code와…
웅파 17년: CodeIgniter 포럼 운영하며 배운 것
문을 닫고 나서야 쓰는 글 올해 봄, CodeIgniter 한국사용자포럼(CI Korea)의 게시판을 닫았습니다. 지금 cikorea.net에 들어가면 CI4·CI3 매뉴얼 링크와…
CI4 모델·서비스 계층 분리: 컨트롤러를 얇게 유지하는 규칙과 트랜잭션 위치
결론부터 말하면 규칙은 두 줄이다. 컨트롤러는 "검증 → 서비스 호출 → 응답"만 한다. 트랜잭션은 유스케이스를 대표하는 서비스 메서드 하나가 연다. 나머지는 이 두 줄을 지키기…
프론트 로그를 큐로 받는 수집 파이프라인: 즉시 202 → Redis → 워커 → 파일 + DB, 실패 시 dead-letter
한 줄 요약 — 로그 수집 API는 받은 것을 Redis에 넣고 바로 202를 돌려줍니다. 파일과 DB에 쓰는 일은 워커가 배치로 하고, 끝내 처리하지 못한 로그는 버리지 않고 d…
목록에 —가 그대로 찍혔다: strip_tags 다음에 빠진 한 단계
한 줄 요약 — 본문 HTML에서 태그만 벗기고 엔티티는 디코딩하지 않은 채 요약을 잘랐습니다. 그리고 뷰에서 esc()가 &를 한 번 더 이스케이프하면서 —가 글자 그…
페이지 번호가 41개 전부 나왔다: AI가 만든 페이저 뷰에서 빠진 한 줄
한 줄 요약 — 클로드코드가 만든 커스텀 페이저 템플릿에 $pager->setSurroundCount() 호출이 빠져 있었고, CI4 PagerRenderer는 이 값이 없으면 첫…
API 부하 분산 기본기: Redis 캐시 TTL 표, 큐 + 202 Accepted, N+1과 SELECT * 금지
한 줄 요약 — API가 느려지면 서버부터 늘리고 싶어집니다. 하지만 제 경험상 먼저 할 일은 요청 하나가 하는 일을 줄이는 것입니다. 같은 걸 두 번 계산하지 않고(캐시), 기다…
CodeIgniter 4 + 모던 PHP 8.4: readonly DTO, backed enum, match로 배열·define() 걷어내기
들어가며 결론부터 말하면, 상태·역할 같은 "닫힌 값의 집합"은 backed enum으로, 계층 사이를 오가는 데이터는 readonly DTO로, 값에 따른 분기는 match로 옮…
JWT 직접 만들지 마라: alg:none 우회, Access/Refresh 분리, Redis 회전·블랙리스트
JWT는 서명이 아니라 검증에서 무너진다 JWT를 base64_encode와 hash_hmac으로 직접 조립하지 마십시오. 토큰을 만드는 쪽은 단순하지만, 받은 토큰을 믿을지 판단…
AI 코드 리뷰를 규칙으로 고정하기
리뷰어가 없는 개발자의 리뷰 AI에게 "꼼꼼하게 리뷰해 줘"라고 부탁하는 것으로는 품질이 지켜지지 않습니다. 저는 규칙을 파일로 고정하고, 지키지 않으면 통과하지 못하게 만드는 쪽…
코드 그래프(graft)로 AI의 탐색 비용 줄이기: grep/read 대비 토큰 절감 체감
한 줄 요약 — AI 에이전트는 작업마다 저장소를 처음부터 다시 탐색합니다. 코드 그래프 도구 graft를 붙여 그 탐색을 "한 번 만든 지도 읽기"로 바꿨고, LLM 요약(--d…
스킬로 반복 작업 자동화: 이슈 착수부터 종료까지 한 명령으로 묶은 dev-issue 사례
이제 클로드코드에 "이슈 231 개발" 한 줄만 입력합니다. 그러면 브랜치 생성, 테스트 먼저 쓰기, 구현, PR, 머지, 이슈 종료까지 한 흐름으로 끝납니다. 이 글은 그 한 줄…
AI에게 기억을 심는 법: 메모리 파일로 삽질 교훈을 세션 간에 유지하기
어제 고친 버그를 오늘 또 만드는 AI 결론부터 말하면, AI는 똑똑하지만 기억력이 없다. 그래서 삽질에서 얻은 교훈은 사람이 아니라 파일에 남겨야 한다. 1년 전 Claude C…
git worktree로 AI 세션 여러 개를 동시에 돌리기: 브랜치 충돌과 stash 공유 사고를 피하는 운영 규칙
왜 세션을 여러 개 띄우게 됐나 혼자서 CodeIgniter 4 기반 솔루션 여러 개를 동시에 굴리다 보면, Claude Code 세션 하나로는 부족한 순간이 옵니다. 한 쪽에서는…
마라톤 세션이 토큰을 먹는 구조: 로그로 찾고, /compact와 서브에이전트로 줄이기
한 줄 요약 — 토큰을 많이 먹은 것은 어려운 작업이 아니라 오래 이어진 세션이었습니다. 세션 로그를 직접 집계해 원인을 찾았고, /compact·/clear와 서브에이전트 위임으…
CI4 브랜드 에러 페이지: 설계서 한 장에서 구현까지
한 줄 요약: 제품마다 제각각이던 CI4 기본 에러 화면을, 설계서 한 장으로 규칙을 먼저 정한 뒤 AIvance 브랜드 템플릿 한 벌로 바꿨습니다. 핵심은 예쁜 화면이 아니라 "…
SEO + GEO 동시 적용: 정적 페이지에서 AI 검색 노출까지 한 방법
들어가며 결론부터 말하면, 정적 페이지에서 SEO와 GEO를 따로 할 필요는 없습니다. 콘텐츠 데이터를 한 곳에 두고, 그 한 벌에서 화면(HTML)·구조화 데이터(JSON-LD)…