turin's blog
만들고, 터지고,
기록합니다
풀스택, Flutter, 서버 운영, SEO, 배포 삽질을 실제 프로젝트 기준으로 정리합니다. 검색해서 들어온 사람이 바로 쓸 수 있는 체크리스트와 명령을 남기는 게 목표입니다.
자주 다루는 주제
주제별로 빠르게 훑어보기
전체 글
운영 중 부딪힌 문제를 검색 의도에 맞춰 정리
Tailwind 클래스가 한 줄에 20개 넘어갈 때 하는 것들
Tailwind는 빠르지만 클래스가 쌓이면 읽기도 수정하기도 어려워진다. 몇 가지 기준을 정해두고 나서 훨씬 나아졌다.
main 브랜치에 직접 push하기 전에 내가 확인하는 것들
혼자 작업할 때도 main에 바로 올리기 전에 짧게라도 확인 루틴을 돌리면 황당한 실수를 꽤 막을 수 있다.
계속 읽기 →서버 시간대가 맞지 않을 때 겪는 문제들
서버 시간대를 UTC로 방치하면 cron 스케줄이 틀어지고, 로그 타임스탬프가 9시간씩 어긋난다.
계속 읽기 →API 요청 실패를 프론트에서 조용히 삼키면 생기는 일
fetch가 에러를 throw하지 않는 경우가 있다. response.ok를 확인하지 않으면 실패한 요청이 성공한 것처럼 처리된다.
계속 읽기 →Next.js dynamic route에서 한글 slug를 다룰 때 생기는 문제
한글 URL은 브라우저가 퍼센트 인코딩하기 때문에 params.slug와 실제 저장된 슬러그가 일치하지 않을 수 있다.
계속 읽기 →도커 볼륨을 지우기 전에 확인하는 것들
docker volume rm은 되돌릴 수 없다. 지우기 전에 딱 세 가지만 확인하면 실수를 막을 수 있다.
계속 읽기 →배포 서버에서 prisma generate를 다시 돌려야 하는 이유
Prisma Client는 플랫폼별 바이너리를 포함한다. 로컬에서 생성한 클라이언트를 그대로 Linux 서버에 올리면 조용히 실패한다.
계속 읽기 →GitHub Actions에서 캐시로 빌드 시간을 줄이는 방법
actions/cache를 제대로 설정하면 npm install 단계를 건너뛸 수 있다. 캐시 키 설계가 핵심이다.
계속 읽기 →개인 블로그에 RSS 피드를 붙이면 달라지는 것
블로그를 만들고 나서 RSS를 늦게 추가했다. 구현 자체는 간단한데, 붙이고 나서 콘텐츠가 자동으로 퍼지기 시작했다.
계속 읽기 →로그인 쿠키에 SameSite를 설정하지 않으면 생기는 일
SameSite 속성 없이 쿠키를 발급하면 cross-origin 요청에서 쿠키가 붙지 않는다. Lax, Strict, None의 차이와 언제 무엇을 써야 하는지 정리했다.
계속 읽기 →TypeScript 코드에서 any를 조금씩 걷어낸 방법
any를 한꺼번에 없애려 하면 타입 에러가 한꺼번에 터져서 오히려 멈추게 된다. 실제로 효과가 있었던 접근 방법을 정리했다.
계속 읽기 →git rebase를 쓰기 전에 챙기는 것들
rebase는 커밋 히스토리를 깔끔하게 만들어주지만, 공유 브랜치에서 잘못 쓰면 협업이 복잡해진다. 내가 정한 기준을 정리했다.
계속 읽기 →서버 디스크가 꽉 찼을 때 처음 실행하는 명령들
디스크가 100%에 가까워지면 로그 쓰기부터 막히기 시작한다. df와 du로 원인 위치를 빠르게 좁히는 순서를 정리했다.
계속 읽기 →Nginx proxy_pass에서 upstream이 엉뚱한 도메인을 받는 이유
Nginx로 리버스 프록시를 설정할 때 upstream 서버가 Host 헤더를 localhost로 받는 경우가 있다. proxy_set_header Host 설정 하나로 해결된다.
계속 읽기 →React 필터 상태를 URL 쿼리스트링으로 관리하는 이유
페이지네이션이나 필터 조건을 컴포넌트 state로만 관리하면 URL을 공유했을 때 상태가 날아간다. URL 쿼리스트링으로 옮기면 해결되는 문제들이 있다.
계속 읽기 →Docker 컨테이너 exit code로 재시작 원인 좁히기
컨테이너가 재시작을 반복할 때 exit code만 봐도 앱 자체 문제인지, 설정 문제인지, OOM인지를 꽤 좁힐 수 있다.
계속 읽기 →Docker 컨테이너가 계속 재시작될 때 로그에서 찾는 것
컨테이너가 restart loop에 빠졌을 때 어디서부터 봐야 할지, 자주 마주치는 원인과 확인 순서를 정리했다.
계속 읽기 →Next.js generateMetadata에서 og:image를 동적으로 생성하는 방법
정적 og:image 하나로 모든 글에 같은 이미지를 쓰면 SNS 공유 미리보기가 단조롭다. 글 제목을 이미지에 넣는 방법을 정리했다.
계속 읽기 →Next.js generateMetadata에서 헷갈렸던 것들
generateMetadata는 단순해 보이지만 params 접근, async fetch, 레이아웃과의 관계에서 예상과 다르게 동작하는 경우가 있다.
계속 읽기 →기술 블로그 주제를 꾸준히 확보하는 방법
막상 쓰려고 앉으면 뭘 써야 할지 모르는 게 제일 큰 문제였다. 주제를 미리 모아두는 습관이 생기고 나서 달라졌다.
계속 읽기 →개인 서버 백업을 미루면 안 되는 이유
개인 서버에서 데이터가 날아간 경험은 없지만, 날아갈 뻔한 경험은 두 번 있었다. 백업은 사고가 나기 전에 해야 한다.
계속 읽기 →버그를 고치기 전에 재현 조건부터 적는다
코드를 건드리기 전에 재현 방법을 한 줄이라도 써두면, 나중에 비슷한 문제가 왔을 때 시간이 반으로 줄어든다.
계속 읽기 →개인 프로젝트 README를 쓸 때 내가 꼭 넣는 것들
몇 달 뒤 자신이 다시 봤을 때 바로 이해할 수 있는 README가 좋은 README다. 매번 비슷한 내용을 쓰면서 정리된 기준을 공유한다.
계속 읽기 →파일 업로드 기능을 만들 때 빠뜨리기 쉬운 보안 처리
확장자 검사만 하고 넘어가면 위험하다. MIME 타입 검증부터 저장 경로까지 실제로 확인해야 할 것들을 정리했다.
계속 읽기 →