
개발
실무에서 배운 개발 이야기.
140 posts
140편
2026
- 맥미니 하나로 AI 개인비서 만들었다 - OpenClaw 설정부터 비용 최적화까지
- React Compiler 적용했더니 useMemo, useCallback 다 지워도 되더라
- JavaScript Set 새 메서드 총정리 - intersection, union, difference 실전 활용
- JavaScript Promise.withResolvers()로 비동기 코드 깔끔하게 정리하기
- Node.js AsyncLocalStorage - 함수마다 requestId 넘기던 시절은 끝났다
- TypeScript Type Guard로 타입 좁히기 - is 키워드 실전 활용
- React Error Boundary 실전 사용법 - 에러 나도 앱 안 죽게 하기
- CSS animation-timeline: scroll()로 JS 없이 스크롤 애니메이션 만들기
- Node.js stream.pipeline으로 대용량 파일 안전하게 처리하기
- Node.js --env-file로 dotenv 없이 .env 파일 로드하기
- TypeScript Record 타입으로 타입 안전한 딕셔너리 만들기
- PostgreSQL JSONB 쿼리 최적화 - GIN 인덱스로 빠르게 검색하기
- git stash push -m 으로 작업 중 코드 부분 저장하기
- TypeScript Pick, Omit, Partial 유틸리티 타입 실무 조합 패턴
- git bisect로 버그 원인 커밋 찾기 - 이진 탐색 디버깅
- Docker Compose Watch로 개발 환경 핫 리로드 설정하기
- TypeScript infer 키워드로 제네릭 타입 추출하기
- git worktree로 브랜치 전환 없이 여러 브랜치 동시 작업하기
- React useOptimistic으로 즉각적 UI 업데이트 구현하기
- CSS Container Queries로 컴포넌트 단위 반응형 만들기
- TypeScript as const로 타입 와이드닝 막는 법
- Promise.allSettled vs Promise.all, 에러 처리가 다르다
- Node.js에서 uuid 패키지 없이 UUID 생성하는 법
- TypeScript Enum vs Union Type, 뭘 써야 할까
- Next.js 15 fetch cache 기본값이 바뀌었다 - no-store 대응법
- Nginx + Docker로 정적 사이트 서빙하기
- AI한테 앱 만들어달라고 했더니 하루 만에 나왔다 - 근데 스토어 등록에 3일 걸린 건 함정
- Cookie 인증 + localStorage 폴백 패턴
- pnpm workspace로 모노레포 구성하기
- Next.js rewrites로 마이크로서비스 API 프록시 설정
- React useRef에 TypeScript 타입 제대로 지정하는 법
- LLM 토큰 수 추정하기 - 한국어와 영어 차이
- TypeScript 제네릭으로 API 응답 타입 안전하게 다루기
- Zod로 TypeScript 런타임 유효성 검사하기
- requestAnimationFrame으로 FPS 모니터링 구현하기
- TypeScript satisfies 연산자, 아직도 안 쓰고 있다면
- React useEffect 무한 루프 원인과 해결법 총정리
- Jekyll 다국어 블로그 URL 구조 바꾸고 페이지네이션까지 갈아엎은 후기
- $50 크레딧이 3시간 만에 증발했다 - Claude Code 1M 실사용 비용 후기
- Compacting 지옥에서 벗어나다 - Claude Code 1M 모델 사용후기
- AI는 똑똑한데 왜 한글 파일 하나를 못 고칠까
- CORS 에러 완벽 해결 - 원인부터 Next.js/Express 설정까지
- GitHub Actions로 Docker 이미지 빌드 + ECR 자동 배포
- Python FastAPI + SQLAlchemy 비동기 DB 연결 패턴
- AWS Lambda 배포 쉘 스크립트 - CDK 함수명 자동 조회
- OpenClaw 유행하던데, 사실 나는 이미 한국형 만들고 있었다
- structuredClone으로 JavaScript 딥카피 제대로 하기
- CSS :has() 셀렉터로 부모 요소 선택하기
- Docker Volume vs Bind Mount, 언제 뭘 쓰는 건지
- AI한테 하드웨어 3D 도면을 시켰더니 5분 만에 나왔다
- Python match-case로 if-elif 지옥 탈출하기
- S3 Presigned URL로 일회용 다운로드 링크 만들기
- JavaScript Temporal API로 날짜 다루기 - Date 객체는 이제 그만
- React useDeferredValue로 debounce 없이 검색 최적화하기
- CSS @layer로 스타일 우선순위 깔끔하게 정리하기
- Object.groupBy로 배열 그룹핑 한 줄로 끝내기
- Node.js AbortController로 fetch 타임아웃 처리하기
- DynamoDB ConditionExpression으로 동시성 제어하기
- Node.js worker_threads로 CPU 집약 작업 메인 스레드에서 분리하기
- CSS :is()와 :where() 선택자로 중복 셀렉터 줄이기
- Python dataclass(frozen=True)로 불변 데이터 객체 만들기
- AWS CDK로 SES 이메일 전송 Lambda 만들기
- Opencode 써봤는데... Claude Code가 이미 다 해주더라
- AI 시대에 어떤 서비스를 만들어야 할까 - 결국 데이터 싸움이다
- Vite 모노레포에서 상위 디렉토리 접근 허용하기 - server.fs.allow
- ESM에서 __dirname 사용하기 - import.meta.url 활용법
2025
- Redis key 네이밍 컨벤션 - 계층적 구조로 관리하기
- Electron contextIsolation + preload 보안 패턴
- Node.js --expose-gc로 메모리 누수 디버깅하기
- S3 파일 캐시 무효화 - fetch에서 항상 최신 파일 받기
- Prisma 인덱스 전략 - 복합 인덱스와 정렬 방향 설정
- Next.js Health Check API 만들기 - 프로덕션 모니터링 필수 엔드포인트
- Node.js TCP 포트 스캐너 구현 - net.Socket과 타임아웃 처리
- Node.js에서 로컬 IP 주소 가져오기 - Windows/macOS/Linux 대응
- Next.js에서 HttpOnly Cookie로 JWT 안전하게 저장하기
- Docker Compose Redis healthcheck 설정 - 앱 시작 순서 보장하기
- 라즈베리 파이로 키오스크 만들기 - 생각보다 삽질이 많다
- fetch API에 Bearer Token 자동 주입하는 인증 헬퍼 만들기
- 혼자서도 전체 프로젝트 개발이 가능해? CDK + Lambda + Cursor로 200% AI 활용기
- Firebase에 네이버/카카오 OIDC 만들기? 현실은 다르더라
- JavaScript Intl.NumberFormat - 숫자 포맷팅 라이브러리 없이 해결
- Unity + Firebase 인증 삽질기: Anonymous에서 Account Linking까지
- AI를 통해 Github Page 기술 블로그 만들기 - 완전한 시리즈 가이드
- AI를 통해 Github Page 기술 블로그 만들기 (5) - MCP로 Jekyll 다국어 블로그 완성하기
- AI를 통해 Github Page 기술 블로그 만들기 (4) - MCP로 다크모드/라이트모드 완벽 구현하기
- AI를 통해 Github Page 기술 블로그 만들기 (3) - MCP로 utterances 댓글 시스템 5분 만에 완성하기
- AI를 통해 Github Page 기술 블로그 만들기 (2) - MCP로 SEO 최적화된 기술 포스팅 완전 자동화하기
- RAG 완전 해설: 제조업 MES 시스템으로 이해하는 진정한 데이터 통합 AI
- AI 개발 현실 체크: 블로그 자동화로 깨달은 것들
- AI를 통해 Github Page 기술 블로그 만들기 (1) - Claude Desktop MCP로 로컬에 직접 Jekyll 블로그 생성하기
- Vertex AI Imagen으로 블로그 이미지 자동 생성하기: Python 패키지부터 MCP 서버까지
- vertex-ai-imagen: Google Vertex AI Imagen을 위한 간편한 Python 패키지
- 기존 MCP로 새로운 MCP 쉽게 설치하기 - Playwright MCP 설치 실전 가이드
- Claude Desktop + MCP로 기술 블로그 완전 구축하기: AI 페어 프로그래밍의 현실
- GitHub Pages로 기술 블로그 시작하기
- PM2 cluster mode로 Next.js 프로덕션 성능 올리기
- Python timestamp 값 얻기 - 현재시간, 변환, 활용법 완벽 가이드
- Node.js Redis 연결 싱글톤 패턴 + 자동 재연결 전략
- Docker Compose YAML 앵커(&)로 반복 설정 제거하기
- AI에게 개발을 잘 시키는 법 - 프롬프트가 전부는 아니다
- Cursor 에이전트 1달 사용 후기 - AI 코딩 도구의 현주소
- Docker 멀티스테이지 빌드로 Next.js 이미지 최적화하기
- Ollama로 로컬 LLM 돌려본 후기 - 결론은 용도에 따라 다르다
- 로그인 없는 API 엔드포인트 보안 - 어디까지 막아야 하나
- Next.js에서 Prisma 싱글톤 패턴 - 핫리로드 연결 누수 해결
- JavaScript UTC 한국시간(KST) 변환 - 실무에서 자주 쓰는 3가지 함수
2024
- 벡터 데이터베이스, 진짜 필요한 건가 - AI 시대의 새로운 고민
- ChatGPT-4o를 활용한 그누보드 질문 답변 사이트 만들기 - 아이디어 일기
- SvelteKit 한번 해보려고 합니다 - 프레임워크 또 갈아탈 건가
- Linux SSH 키 생성하기 - ssh-keygen 완벽 가이드
- AWS Lambda + S3 + CloudWatch + SNS를 활용한 네이버 블로그 자동 포스팅 시스템 구축
- Thingplug를 활용한 하드웨어 기반 키관리 및 접근제어 시스템 설계
- MSA 설계에 ChatGPT를 활용해본 후기
- htop으로 리눅스 시스템 리소스 모니터링하기
- AWS EC2로 원격 데스크탑 구축하기 - 클라우드 업무 환경의 현실과 미래
- .gitignore 무시된 디렉토리에서 특정 파일 추가하기
2023
- Bitbucket Access Key로 SSH Push 설정하기
- Ubuntu 18.04LTS에서 LEMP 스택 설치하기: Nginx, MariaDB, PHP 7.1 완벽 가이드
- MariaDB 외부 접속 허용 설정 완벽 가이드
- nginx 대역폭 제한 설정하기 - limit_rate 완벽 가이드
- GitKraken에서 Github 조직 계정 레파지토리 연동 완벽 가이드
- CSS 블랜딩 모드로 포토샵 효과 구현하기 - background-blend-mode와 mix-blend-mode 완벽 가이드
- 그누보드 훅(Hook) 사용법과 이벤트 종류 완벽 정리
- JavaScript 숫자 앞에 0 붙이기 - padStart()와 커스텀 함수 완벽 가이드
- MySQL/MariaDB 콘솔에서 데이터베이스 백업 및 복구 완벽 가이드
- 크롬 노란색 자동완성 버그 완벽 해결 가이드 - 실험실 기능 리셋 & 한글 입력기 설정
- Javascript jQuery AJAX 통신 시 HTTP Header에 값 추가하기
- 테마프레스 애드온 서버 아키텍처 - 마이크로서비스 기반 확장형 웹 플랫폼 설계
- 아파치에서 HTML 파일에서 PHP 코드 인식하도록 설정하기
- Amazon Cognito JavaScript 연동 시 피해야 할 치명적인 실수
- 리눅스 tar 명령어 완벽 가이드 - 압축과 해제의 모든 것
- Apache 아파치 서버 이전 후 한글이 깨지는 증상 해결법