| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- JavaScript
- react
- auth
- API
- Infra
- PostgreSQL
- HTTP
- observability
- CI
- web
- Kubernetes
- NextJS
- database
- CSS
- aws
- Git
- frontend
- 성능
- Ops
- Security
- reliability
- Operations
- architecture
- Performance
- backend
- version-control
- Microservices
- SRE
- DevOps
- Debugging
- Today
- Total
목록2026/04/07 (4)
고민보단 실천을
무중단 스키마 변경(Expand-Contract) 실전: 컬럼 추가/이동/삭제를 안전하게스키마 변경은 코드 배포보다 무섭다. 데이터가 바뀌면 롤백이 어려워서 '안전한 절차'가 필요하다.Expand-Contract 한 장 요약Expand: 새 구조 추가(컬럼/테이블/인덱스).Backfill: 기존 데이터 채우기(청크/멱등).Dual-write: 일정 기간 구/신 구조 동시 기록.Switch-read: 읽기를 신 구조로 전환(Feature Flag).Contract: 구 구조 제거(삭제는 마지막).예시 SQL(Expand + Backfill)ALTER TABLE users ADD COLUMN first_name TEXT;ALTER TABLE users ADD COLUMN last_name TEXT;UPDAT..
TypeScript 런타임 검증 실전: Zod로 API 스키마 드리프트 막기TypeScript는 컴파일 타임에만 안전하다. 런타임에는 API가 바뀌면 그대로 터진다. Zod로 '명확히 실패'하게 만들어 조기 발견을 돕는다.스키마 정의import { z } from 'zod';export const UserSchema = z.object({ id: z.number().int().positive(), email: z.string().email(), name: z.string().min(1), createdAt: z.string().datetime(),});응답 파싱const res = await fetch('/api/users/1');const json = await res.json();const u..
타임존 지옥 탈출: UTC 저장, 로컬 표시, DST(서머타임) 버그를 막는 규칙시간 버그는 재현이 어렵고, 한 번 터지면 신뢰를 크게 잃는다. DST(서머타임)와 타임존 변환이 겹치면 데이터 무결성 문제로 커진다.원칙: 저장은 UTC(Instant), 표시는 로컬DB/로그는 UTC 기준 Instant로 통일한다.화면은 사용자 타임존으로 변환해 표시한다.입력은 로컬 시각만 받지 말고 타임존을 함께 받는다.Kotlin/Java 예시import java.time.*val instant = Instant.parse('2026-04-01T10:00:00Z')val userZone = ZoneId.of('Asia/Seoul')val view = instant.atZone(userZone)// 입력(로컬) + 타임..
Spring Boot Resilience4j 실전: timeout-retry-circuit breaker를 '같이' 설계하는 법재시도는 쉽게 붙이지만, 타임아웃과 서킷 브레이커를 같이 설계하지 않으면 폭주를 만든다.원칙Timeout을 먼저 정한다(상한).Retry는 멱등 요청에만, 횟수는 적게(지터 포함).Circuit Breaker로 계속 실패하는 다운스트림을 잠시 격리한다.Bulkhead로 장애 전파를 막는다(격리).설정 예시(application.yml)resilience4j: timelimiter: instances: partnerApi: timeoutDuration: 800ms retry: instances: partnerApi: maxA..
