turin's blog

만들고, 터지고, 기록합니다

풀스택, Flutter, 서버 운영, SEO, 배포 삽질을 실제 프로젝트 기준으로 정리합니다. 검색해서 들어온 사람이 바로 쓸 수 있는 체크리스트와 명령을 남기는 게 목표입니다.

1175published
8topics
kopractical notes

자주 다루는 주제

주제별로 빠르게 훑어보기

웹 개발350Next.js283서버 운영165Docker110API80TypeScript58DB50Flutter39

전체 글

운영 중 부딪힌 문제를 검색 의도에 맞춰 정리

API

package-lock.json을 함부로 삭제하면 안 되는 이유

package-lock.json은 설치할 패키지 버전을 고정하는 파일이다. 지우면 팀원마다 다른 버전이 설치될 수 있고, CI에서 재현 불가능한 빌드가 발생한다.

·1분 읽기
웹 개발1분 읽기

SSH 포트를 바꿀 때 실수하지 않는 순서

SSH 포트를 변경하다가 현재 세션까지 끊기면 서버에 접근할 수 없다. 기존 세션을 유지하면서 안전하게 포트를 바꾸는 순서를 정리했다.

계속 읽기 →
웹 개발1분 읽기

파일 업로드 시 이름 충돌을 피하는 방법

사용자가 올린 파일을 원래 이름 그대로 저장하면 같은 이름의 파일이 덮어씌워지거나 경로가 노출된다. UUID나 해시로 파일명을 바꿔서 저장하는 방식을 정리했다.

계속 읽기 →
Next.js2분 읽기

Next.js middleware를 쓰기 전에 알아야 할 것들

Next.js middleware는 Edge Runtime에서 돌기 때문에 Node.js API를 쓸 수 없고, 잘못 쓰면 모든 요청에 불필요한 처리를 붙이게 된다.

계속 읽기 →
DB1분 읽기

DB 마이그레이션 파일을 Git에 올려야 하는 이유

Prisma 마이그레이션 파일을 .gitignore에 추가하면 팀 협업과 배포에서 예상치 못한 스키마 충돌이 생긴다.

계속 읽기 →
웹 개발1분 읽기

GitHub Personal Access Token 권한을 최소로 줘야 하는 이유

repo 전체 권한을 주는 게 편하긴 한데, 토큰이 유출됐을 때 어디까지 털리는지 생각해보면 손이 멈춘다.

계속 읽기 →
웹 개발1분 읽기

CSS line-height 하나 바꿨을 뿐인데 글이 훨씬 읽기 편해졌다

line-height를 1.5에서 1.7로 올리는 것만으로도 긴 글을 읽을 때 눈이 덜 피로하다는 걸 직접 비교해보고 나서야 실감했다.

계속 읽기 →
서버 운영2분 읽기

개발 서버와 운영 서버의 로그 레벨을 다르게 설정하는 이유

개발 환경에서 DEBUG 레벨로 찍은 로그를 운영에도 그대로 두면 노이즈가 쌓이고 정작 중요한 에러를 찾기 어려워진다.

계속 읽기 →
Next.js1분 읽기

React key 경고가 버그로 이어지는 상황

key 경고를 콘솔에서 무시하다 보면 리스트 아이템이 섞이거나 상태가 엉뚱한 컴포넌트에 붙는 문제를 겪게 된다.

계속 읽기 →
Next.js1분 읽기

Next.js sitemap에 잘못된 URL이 들어갔을 때 찾아서 고치는 법

sitemap.xml을 열어봤더니 존재하지 않는 URL이나 www가 붙은 URL이 섞여 있었다. 원인을 좁히는 순서를 정리했다.

계속 읽기 →
서버 운영1분 읽기

서버 메모리가 줄어들 때 Node.js 프로세스에서 먼저 보이는 것들

OOM이 나기 전에 Node.js 앱이 먼저 이상한 신호를 보낸다. 어떤 순서로 증상이 나타나는지 정리했다.

계속 읽기 →
서버 운영1분 읽기

Nginx 설정 파일을 도메인별로 분리하기 시작한 이유

nginx.conf 하나에 모든 설정을 밀어 넣다가 수정 한 번에 전체가 내려갈 뻔하고 나서 구조를 바꿨다.

계속 읽기 →
API1분 읽기

API 응답에 createdAt과 updatedAt을 둘 다 넣는 이유

두 타임스탬프는 서로 다른 질문에 답한다. 하나만 있으면 클라이언트가 추론에 의존하게 된다.

계속 읽기 →
Next.js1분 읽기

나중에 git log로 검색할 수 있는 커밋 메시지 쓰는 법

커밋 메시지를 잘 써두면 3개월 후에 버그 원인을 찾을 때 git log 한 번으로 끝난다.

계속 읽기 →
웹 개발1분 읽기

개인 프로젝트에 에러 페이지를 추가하고 나서 달라진 것

404나 500이 발생했을 때 기본 에러 화면을 보여주는 것만으로도 프로젝트의 완성도가 달라진다.

계속 읽기 →
Docker1분 읽기

Dockerfile에서 COPY 순서를 바꿨더니 빌드 시간이 확 줄었다

package.json을 소스 코드보다 먼저 COPY하는 패턴 하나로 npm install 캐시가 살아난다.

계속 읽기 →
Next.js1분 읽기

Next.js 서버 컴포넌트에서 window를 쓰면 안 되는 이유

서버 컴포넌트에서 window나 document를 참조하면 런타임 에러가 난다. 왜 그런지, 어떻게 피하는지 정리했다.

계속 읽기 →
Next.js1분 읽기

브라우저 캐시가 Next.js 수정을 숨기고 있을 때 확인하는 법

코드를 고쳤는데 화면이 바뀌지 않는다면 십중팔구 캐시 문제다. 어디서 막힌 건지 확인하는 순서를 정리했다.

계속 읽기 →
웹 개발1분 읽기

robots.txt 설정을 배포 전에 확인했어야 했던 이유

배포 후 며칠이 지나서야 robots.txt가 잘못 설정된 걸 알아차렸다. 크롤러는 이미 다녀간 뒤였다.

계속 읽기 →
서버 운영1분 읽기

서버에서 npm install이 비정상적으로 느릴 때 확인한 것들

npm install이 로컬에서는 빠른데 서버에서만 오래 걸린다면 메모리 부족이나 DNS 문제가 원인인 경우가 많다.

계속 읽기 →
Next.js1분 읽기

React controlled input이 유용했던 경우와 그렇지 않은 경우

모든 폼 필드를 controlled로 만들 필요는 없다. 언제 controlled가 필요한지 알면 코드가 단순해진다.

계속 읽기 →
웹 개발2분 읽기

HTTP 301과 302의 차이, 그리고 잘못 쓰면 생기는 일

301은 브라우저와 검색엔진이 캐시한다. 임시 상황에 301을 썼다가 되돌리려면 생각보다 오래 걸린다.

계속 읽기 →
웹 개발1분 읽기

환경변수 이름을 대충 지으면 나중에 생기는 혼란

DB_URL인지 DATABASE_URL인지, SECRET인지 SECRET_KEY인지 — 이름이 일관되지 않으면 설정 파일을 볼 때마다 원본을 찾아야 한다.

계속 읽기 →
Docker1분 읽기

SQLite DB 파일을 Docker 볼륨에 두는 이유

컨테이너 레이어에 쓴 파일은 컨테이너가 재시작되면 사라진다. SQLite처럼 단일 파일 DB는 반드시 볼륨에 마운트해야 한다.

계속 읽기 →