Docker & Next.js 가이드·약 5분 내외

Next.js 미들웨어와 Docker 실전 개념 Q&A

Next.js 미들웨어의 역할, Docker 컨테이너 네이밍 규칙, 다중 환경(Dev/Staging/Prod) 구성, 그리고 고아 컨테이너 삭제(--remove-orphans)의 원리에 대해 알기 쉽게 정리합니다.

Q1. Next.js 미들웨어는 원래 어떤 역할을 하나요? Nginx랑은 다른 건가요?

역할은 비슷하지만 "작동하는 위치(계층)"가 다릅니다!

미들웨어(Middleware)는 클라이언트(사용자)의 요청과 목적지(서버의 페이지나 API) 사이에 서서 수문장 역할을 하는 소프트웨어입니다.

Nginx vs Next.js 미들웨어

Nginx (인프라 레벨의 리버스 프록시): 건물 전체의 "1층 경비실"입니다. 서버 맨 앞단에 서서 들어오는 모든 인터넷 통신을 받습니다. "이 요청은 A 프로젝트로, 저 요청은 B 프로젝트로 가야 하네?"라며 트래픽을 각 앱으로 분배해 주는 거시적인 역할을 합니다.
Next.js 미들웨어 (애플리케이션 레벨): 건물 안 "특정 사무실(웹앱) 문 앞의 보안 요원"입니다. Nginx를 통과해 Next.js 앱 내부에 도착한 요청을 검사합니다. "이 유저가 마이페이지에 들어가려는데 로그인은 했나?" 같은 앱 내부의 구체적인 비즈니스 로직을 검사하고 권한에 따라 리다이렉트(Redirect)시키는 미시적인 역할을 합니다.

💡 왜 Next.js 16부터는 middleware.ts 대신 proxy.ts를 쓰라고 할까요?

기존 middleware라는 단어는 Node.js나 Express 환경의 전통적인 미들웨어와 혼동을 주기 쉬웠습니다. Next.js의 미들웨어는 클라이언트와 서버 사이에서 중계해 주는 프록시(Proxy)와 똑같은 역할을 하므로, 이를 더 직관적으로 표현하기 위해 이름 규칙(Convention)이 proxy.ts로 변경되었습니다.

Q2. 도커 컨테이너 이름에 dev-를 꼭 붙여야 하나요?

결론부터 말씀드리면, 이름은 개발자 마음대로 지어도 기술적으로는 전혀 상관없습니다.

`dev-postgres`, `dev-server`처럼 앞에 `dev-`를 붙이는 것은 도커가 요구하는 필수 규칙이 아닙니다. 순전히 사람이 알아보기 편하게 하기 위한 암묵적인 약속(Naming Convention)일 뿐입니다.

만약 데이터베이스 이름을 단순하게 `postgres`라고 지어버리면, 나중에 터미널에서 `docker ps`로 실행 중인 목록을 볼 때 "이게 운영 서버(실서비스)용 DB인지, 로컬 테스트용 DB인지" 헷갈리기 쉽습니다. 실수로 실서비스 DB를 삭제하는 대참사를 막기 위해 `dev-`, `staging-`, `prod-` 같은 꼬리표를 달아 눈으로 쉽게 구분하려는 목적입니다.

Q3. Dev, Staging, Prod 환경을 한 컴퓨터에 같이 켜면 서로 엉키거나 지워지지 않나요?

절대 엉키거나 삭제되지 않습니다! 그 이유는 도커의 "프로젝트 이름(Project Name)" 개념 때문입니다.

도커는 컨테이너들을 그룹 지을 때 "프로젝트 이름(마치 회사의 부서 이름)"을 기준으로 삼습니다.

환경별 프로젝트 이름 분리

Dev 환경: `my-app` (폴더명을 기본 프로젝트 이름으로 사용)
Staging 환경: `my-app-staging` (`-p` 옵션으로 명시적 할당)

도커 명령어는 오직 자기 프로젝트(부서) 소속인 컨테이너들에게만 영향을 미칩니다. 스테이징 환경을 끄거나 고아 컨테이너를 삭제하라고 명령을 내려도, 바로 옆에서 돌아가고 있는 Dev나 Prod 컨테이너들은 소속 부서가 다르기 때문에 완전히 투명 인간 취급을 받습니다.

Q4. docker compose down과 --remove-orphans는 어떻게 다른가요?

이 둘의 차이는 "과거의 기억을 가지고 있느냐"에 있습니다. 도커 컴포즈(Docker Compose)는 컨테이너를 켤 때 모든 컨테이너에 `소속: 우리 프로젝트`라는 보이지 않는 라벨(주민등록증)을 붙여둡니다.

일반적인 docker compose down

  • 비유: "지금 내 손에 들려있는 서류(설정 파일)에 적힌 애들만 해고해라."
  • 문제점: 어제까진 광고 서버가 설정 파일에 있어서 실행시켰는데, 오늘 설정 파일의 코드에서 지워버렸다면 도커는 아예 건드리지 않고 넘어가버립니다.
  • 결과: 서류에서 지워진 녀석만 영원히 켜진 채 고아(Orphan) 상태로 남게 됩니다. (잦은 포트 충돌의 주범)

--remove-orphans 옵션을 붙인 경우

추천
  • 비유: "우리 부서 마크를 달고 몰래 돌아다니는 녀석이 있으면 전부 색출해서 해고해라."
  • 장점: 설정 파일(yml)에서 지워졌지만 여전히 메모리에서 돌아가고 있는 옛날 찌꺼기 컨테이너까지 도커가 알아서 박박 긁어 지워줍니다.
  • 하나의 프로젝트를 하나의 docker-compose.yml로 묶어서 관리하는 환경에서는 필수적인 좋은 습관입니다.
가이드 모음

다른 가이드도 확인해보세요

이정마 프로젝트의 다양한 가이드와 꿀팁들을 확인하실 수 있습니다.