turin's blog
만들고, 터지고,
기록합니다
풀스택, Flutter, 서버 운영, SEO, 배포 삽질을 실제 프로젝트 기준으로 정리합니다. 검색해서 들어온 사람이 바로 쓸 수 있는 체크리스트와 명령을 남기는 게 목표입니다.
자주 다루는 주제
주제별로 빠르게 훑어보기
전체 글
운영 중 부딪힌 문제를 검색 의도에 맞춰 정리
package-lock.json을 함부로 삭제하면 안 되는 이유
package-lock.json은 설치할 패키지 버전을 고정하는 파일이다. 지우면 팀원마다 다른 버전이 설치될 수 있고, CI에서 재현 불가능한 빌드가 발생한다.
SSH 포트를 바꿀 때 실수하지 않는 순서
SSH 포트를 변경하다가 현재 세션까지 끊기면 서버에 접근할 수 없다. 기존 세션을 유지하면서 안전하게 포트를 바꾸는 순서를 정리했다.
계속 읽기 →파일 업로드 시 이름 충돌을 피하는 방법
사용자가 올린 파일을 원래 이름 그대로 저장하면 같은 이름의 파일이 덮어씌워지거나 경로가 노출된다. UUID나 해시로 파일명을 바꿔서 저장하는 방식을 정리했다.
계속 읽기 →Next.js middleware를 쓰기 전에 알아야 할 것들
Next.js middleware는 Edge Runtime에서 돌기 때문에 Node.js API를 쓸 수 없고, 잘못 쓰면 모든 요청에 불필요한 처리를 붙이게 된다.
계속 읽기 →DB 마이그레이션 파일을 Git에 올려야 하는 이유
Prisma 마이그레이션 파일을 .gitignore에 추가하면 팀 협업과 배포에서 예상치 못한 스키마 충돌이 생긴다.
계속 읽기 →GitHub Personal Access Token 권한을 최소로 줘야 하는 이유
repo 전체 권한을 주는 게 편하긴 한데, 토큰이 유출됐을 때 어디까지 털리는지 생각해보면 손이 멈춘다.
계속 읽기 →CSS line-height 하나 바꿨을 뿐인데 글이 훨씬 읽기 편해졌다
line-height를 1.5에서 1.7로 올리는 것만으로도 긴 글을 읽을 때 눈이 덜 피로하다는 걸 직접 비교해보고 나서야 실감했다.
계속 읽기 →개발 서버와 운영 서버의 로그 레벨을 다르게 설정하는 이유
개발 환경에서 DEBUG 레벨로 찍은 로그를 운영에도 그대로 두면 노이즈가 쌓이고 정작 중요한 에러를 찾기 어려워진다.
계속 읽기 →React key 경고가 버그로 이어지는 상황
key 경고를 콘솔에서 무시하다 보면 리스트 아이템이 섞이거나 상태가 엉뚱한 컴포넌트에 붙는 문제를 겪게 된다.
계속 읽기 →Next.js sitemap에 잘못된 URL이 들어갔을 때 찾아서 고치는 법
sitemap.xml을 열어봤더니 존재하지 않는 URL이나 www가 붙은 URL이 섞여 있었다. 원인을 좁히는 순서를 정리했다.
계속 읽기 →서버 메모리가 줄어들 때 Node.js 프로세스에서 먼저 보이는 것들
OOM이 나기 전에 Node.js 앱이 먼저 이상한 신호를 보낸다. 어떤 순서로 증상이 나타나는지 정리했다.
계속 읽기 →Nginx 설정 파일을 도메인별로 분리하기 시작한 이유
nginx.conf 하나에 모든 설정을 밀어 넣다가 수정 한 번에 전체가 내려갈 뻔하고 나서 구조를 바꿨다.
계속 읽기 →API 응답에 createdAt과 updatedAt을 둘 다 넣는 이유
두 타임스탬프는 서로 다른 질문에 답한다. 하나만 있으면 클라이언트가 추론에 의존하게 된다.
계속 읽기 →나중에 git log로 검색할 수 있는 커밋 메시지 쓰는 법
커밋 메시지를 잘 써두면 3개월 후에 버그 원인을 찾을 때 git log 한 번으로 끝난다.
계속 읽기 →개인 프로젝트에 에러 페이지를 추가하고 나서 달라진 것
404나 500이 발생했을 때 기본 에러 화면을 보여주는 것만으로도 프로젝트의 완성도가 달라진다.
계속 읽기 →Dockerfile에서 COPY 순서를 바꿨더니 빌드 시간이 확 줄었다
package.json을 소스 코드보다 먼저 COPY하는 패턴 하나로 npm install 캐시가 살아난다.
계속 읽기 →Next.js 서버 컴포넌트에서 window를 쓰면 안 되는 이유
서버 컴포넌트에서 window나 document를 참조하면 런타임 에러가 난다. 왜 그런지, 어떻게 피하는지 정리했다.
계속 읽기 →브라우저 캐시가 Next.js 수정을 숨기고 있을 때 확인하는 법
코드를 고쳤는데 화면이 바뀌지 않는다면 십중팔구 캐시 문제다. 어디서 막힌 건지 확인하는 순서를 정리했다.
계속 읽기 →robots.txt 설정을 배포 전에 확인했어야 했던 이유
배포 후 며칠이 지나서야 robots.txt가 잘못 설정된 걸 알아차렸다. 크롤러는 이미 다녀간 뒤였다.
계속 읽기 →서버에서 npm install이 비정상적으로 느릴 때 확인한 것들
npm install이 로컬에서는 빠른데 서버에서만 오래 걸린다면 메모리 부족이나 DNS 문제가 원인인 경우가 많다.
계속 읽기 →React controlled input이 유용했던 경우와 그렇지 않은 경우
모든 폼 필드를 controlled로 만들 필요는 없다. 언제 controlled가 필요한지 알면 코드가 단순해진다.
계속 읽기 →HTTP 301과 302의 차이, 그리고 잘못 쓰면 생기는 일
301은 브라우저와 검색엔진이 캐시한다. 임시 상황에 301을 썼다가 되돌리려면 생각보다 오래 걸린다.
계속 읽기 →환경변수 이름을 대충 지으면 나중에 생기는 혼란
DB_URL인지 DATABASE_URL인지, SECRET인지 SECRET_KEY인지 — 이름이 일관되지 않으면 설정 파일을 볼 때마다 원본을 찾아야 한다.
계속 읽기 →SQLite DB 파일을 Docker 볼륨에 두는 이유
컨테이너 레이어에 쓴 파일은 컨테이너가 재시작되면 사라진다. SQLite처럼 단일 파일 DB는 반드시 볼륨에 마운트해야 한다.
계속 읽기 →