홈시리즈개발 의뢰

© 2026 정기창. All rights reserved.

본 블로그의 콘텐츠는 CC BY-NC-SA 4.0 라이선스를 따릅니다.

☕후원하기소개JSON Formatter러닝 대기질개인정보처리방침이용약관환불 규정

© 2026 정기창. All rights reserved.

콘텐츠: CC BY-NC-SA 4.0

☕후원하기
소개|JSON Formatter|러닝 대기질|개인정보처리방침|이용약관|환불 규정

정기창 · 풀스택 개발자

매일 쓰고, 매일 빌드합니다.

NestJS 백엔드와 Next.js 프론트엔드를 하나의 모노레포에서 운영하며 겪은 시행착오, 그리고 AI를 개발 워크플로우에 녹이며 배운 것을 기록합니다.

시리즈로 읽기→소개
최신 글

재시도는 모두가 동시에 하면 안 됩니다 — 지수 백오프와 지터

같은 순간에 실패한 요청들이 똑같이 기다리면 다시 한꺼번에 몰려옵니다. 고정 간격, 지수 백오프, 풀 지터를 시뮬레이션으로 비교했더니 무작위 지터 하나가 회복 시간을 10초에서 2초로 줄였습니다. Retry-After 해석 방법까지 함께 정리했습니다.

2026. 10. 6.

파일 형식은 확장자가 아니라 첫 바이트가 말합니다 — 매직 넘버와 인코딩

.csv 라는 이름의 파일이 실제로는 엑셀이었고, .xls 아래에는 서로 다른 형식이 섞여 있었습니다. 파일 맨 앞 몇 바이트의 매직 넘버로 형식을 가리고, 인코딩과 숫자 앞 0 을 지키는 포장까지 하나씩 벗겨서 읽는 과정을 예제 파일로 정리했습니다.

2026. 10. 5.

DATETIME 에는 시간대가 없습니다 — 드라이버 설정과 두 개의 시계

같은 순간을 넣었는데 9시간 다른 값이 저장됐습니다. DATETIME 은 숫자만 저장하고, 그 숫자가 어느 지역의 시계인지는 드라이버 설정이 정하기 때문입니다. Go 의 time.Time 과 데이터베이스 시계까지 함께 실험하며 그 원인을 직접 정리했습니다.

2026. 10. 4.

금액은 JavaScript Number 에 담기지 않습니다 — DECIMAL 과 BigInt

데이터베이스의 DECIMAL 은 정확하지만, 꺼내서 Number 로 바꾸는 순간 큰 금액이 반올림됩니다. mysql2 가 DECIMAL 을 문자열로 주는 이유와 Go 의 float64, 가장 작은 단위의 정수로 계산하는 방법을 직접 실험으로 정리했습니다.

2026. 10. 3.

행 잠금은 작업을 지켜 주지 않습니다 — SKIP LOCKED 와 시간 리스

여러 워커가 한 작업 목록을 나눌 때 SKIP LOCKED 로 경쟁은 풀렸지만, 잠금은 트랜잭션과 함께 사라졌습니다. 그래서 누가 언제까지 맡았는지를 행에 적는 시간 리스를 더했고, 멈춘 워커의 작업을 다른 워커가 이어받는 과정을 로컬에서 직접 재현했습니다.

2026. 10. 2.

같은 요청이 두 번 와도 한 번만 — 멱등 키(Idempotency-Key) 구현하기

응답이 사라지면 재시도는 피할 수 없습니다. 그래서 같은 요청이 두 번 와도 한 번만 처리하고, 두 번째에도 처음과 같은 응답을 돌려주는 멱등 키를 MySQL 로 직접 구현했습니다. 다섯 요청이 동시에 와도 확정은 한 번이었던 실험을 함께 정리했습니다.

2026. 10. 1.

upsert 가 돌려준 4 는 새로 들어간 건수가 아니었습니다 — MySQL affected rows

같은 데이터를 두 번 받아도 한 번만 남기려고 upsert 를 썼는데, 돌아온 숫자는 신규 건수가 아니었습니다. 같은 SQL 이 Node 의 mysql2 에서는 4, Go 드라이버에서는 3 을 돌려준 이유와, 신규 건수를 올바르게 세는 방법을 정리했습니다.

2026. 9. 30.

0 과 빈 문자열과 null 은 다른 말입니다 — Go 의 zero value 에서 TypeScript 로

Go 에 약해서 서버를 TypeScript 로 다시 짜며 가장 먼저 다시 배운 것은 빈 값이었습니다. 0, 빈 문자열, null, 키 없음이 각각 다른 뜻이라는 것과, 설정 파일이 없는 환경 변수를 조용히 빈 문자열로 넣는다는 것을 직접 실험으로 확인했습니다.

2026. 9. 29.

CodeRabbit으로 코드 속 예상 SQL을 정리하고 DBA 검토를 요청한 이유

조건문과 쿼리 빌더에 흩어진 코드를 DBA가 검토하려면 어떤 SQL이 만들어지는지부터 파악해야 했습니다. CodeRabbit에 예상 SQL과 검토 지점을 정리하도록 설정한 배경, 가상 코드 예시, 실제 SQL 대조와 사람의 판단이 필요한 구간을 함께 정리했습니다.

2026. 9. 28.

사람이 거의 열지 않는 옵시디언 — AI가 주 독자인 vault에서 치운 것과 일부러 남긴 것

옵시디언 vault를 정리하다 '나는 거의 안 쓴다'는 한마디에 전제가 바뀌었습니다. 주 독자는 AI였습니다. 두 번째 정본이 된 대시보드와 진짜 노트를 가린 빈 폴더 노트, 아무도 보지 않던 스크린샷을 치우고, 규약인 이름과 서로 인용하는 문서는 일부러 남긴 기준을 정리했습니다.

2026. 9. 27.
<이전12345...33>다음