Categories

backend

PHP Fatal Error를 LLM이 자동으로 고치게 만든 이야기

4 minute read

“PHP Fatal Error 발생 → 사내메신저 알림 확인 → 코드 확인 → 원인 분석 → 수정 → PR 생성 → 코드 리뷰 → 배포”. 에러 하나에 평균 1시간. 매번 같은 패턴인데 매번 사람이 해야 했다. “이걸 AI가 하면 안 되나?” 생각이 들었고, 그냥 만들어봤다.

슬로우 쿼리 0건 달성기 - MySQL 쿼리 최적화 실전

2 minute read

“슬로우 쿼리 로그 좀 켜볼까요?” 학원 ERP 서비스에서 간헐적으로 API 응답이 느려지는 문제가 있었다. 슬로우 쿼리 로그를 켜보니 원인이 보였다. 하루 평균 15~20건. 인덱스 문제가 아니라 쿼리 구조 자체가 문제였다. 막상 보니 고칠 수 있겠다 싶었다.

쿠키 기반 통합 인증(SSO) 구현기 - 3개 서비스를 1시간 점검으로 통합하기

3 minute read

여러 서비스가 각자 로그인 시스템을 갖고 있으면 사용자는 서비스를 이동할 때마다 다시 로그인해야 한다. 사용자 불만 접수가 계속 들어오는 걸 알면서도 한동안 미뤘다. 세 팀이 동시에 움직여야 하는 작업이라서 조율이 부담이었다. 결국 점검 시간 1시간으로 끝냈다.

Redis 분산 락으로 배차 중복 수락 Race Condition 해결하기

3 minute read

실시간 배차 서비스에서 20~30명의 기사가 동시에 수주 버튼을 누르면 어떤 일이 발생할까? 답은 “두 명이 동시에 수락 완료된다”였다. 로그를 처음 봤을 때 이게 실제로 일어나고 있다는 게 믿기지 않았다.

위치 기반 알림 최적화로 불필요한 알림 60% 줄이기

3 minute read

배차 서비스에서 새 배차가 등록되면 모든 기사에게 알림을 보내고 있었다. 서울 기사에게 부산 배차 알림이 가는 게 말이 안 됐다. 기사들 불만이 쌓이다가 배차 수락률이 40%까지 떨어지고 나서야 손댔다.

Back to Top ↑

Backend

배포 전 안전장치: PHP 테스트로 트랜잭션 롤백 검증

3 minute read

레거시 코드를 리팩토링하면 “잘 동작하는지 어떻게 확인하지?”가 항상 문제였다. 테스트 DB를 쓰면 운영 데이터랑 조건이 달라서 미심쩍고, 운영 DB를 쓰면 데이터가 오염된다. 트랜잭션 롤백으로 이 딜레마를 해결했다.

외부 사이트 DOM 변경에도 안정적인 스크래핑 유지하기

3 minute read

OddsPortal에서 실시간 배당 데이터를 스크래핑하는 엔진을 구축했다. 외부 사이트는 예고 없이 DOM 구조를 바꾼다. 어느 날 아침 출근하니 데이터가 멈춰 있었고, 원인은 사이트가 디자인을 바꿔버린 것이었다. 그때부터 “어떻게 하면 그 다음에는 이런 일이 안 생길까”를 고민했...

Back to Top ↑

devops

Back to Top ↑

회고

Back to Top ↑

collaboration

코드 리뷰 문화 정착 - 주니어 개발자 2명을 독립 개발자로 만든 방법

4 minute read

공동주택 관리 서비스 팀에 백엔드 주니어 1명, 프론트 주니어 1명이 들어왔다. 처음엔 솔직히 막막했다. 내가 직접 혼자 다 하는 게 빠른데, 이걸 같이 하면서 어떻게 성장까지 시키지? 3개월 후 이들은 독립적으로 기능을 개발하고 배포할 수 있는 개발자가 됐다.

Back to Top ↑

Testing

배포 전 안전장치: PHP 테스트로 트랜잭션 롤백 검증

3 minute read

레거시 코드를 리팩토링하면 “잘 동작하는지 어떻게 확인하지?”가 항상 문제였다. 테스트 DB를 쓰면 운영 데이터랑 조건이 달라서 미심쩍고, 운영 DB를 쓰면 데이터가 오염된다. 트랜잭션 롤백으로 이 딜레마를 해결했다.

Back to Top ↑

retrospective

2026년 회고 - AI가 내 코드를 고치기 시작했다

3 minute read

2025년부터 AI 코딩 도구를 실무에 쓰기 시작했다. 처음엔 반신반의했다. “AI가 코드를 짠다고?” 1년 지나고 보니 생각이 바뀌었다. AI는 코드를 짜는 게 아니라, 내가 코드 짜는 방식을 바꿔놓았다.

Back to Top ↑