
1. 들어가며
개발자라면 터미널 명령어를 정확히 이해하지 못한 채 그대로 복사해 사용한 경험이 있을 것이다. NestJS 프로젝트를 시작할 때도 마찬가지다. 익숙하다는 이유로 사용하는 명령어에는 사실 분명한 의도와 설계 원칙이 숨어 있다.
이 글에서는 우리가 자주 사용하는 NestJS 명령어에 담긴 다섯 가지 의미를 정리한다. 목적은 단순한 사용법 소개가 아니라, 왜 이런 명령어가 필요한지 이해하는 것이다.
2. 첫 번째 의미
의도된 중복은 실수를 막기 위한 장치다
실무나 자동화 환경에서 다음과 같은 명령어를 자주 본다.
npx @nestjs/cli new . --directory . --skip-git --package-manager npm --strict
여기서 눈에 띄는 부분은 new . 와 --directory . 다. 둘 다 현재 디렉터리에 프로젝트를 생성한다는 의미다. 중복처럼 보이지만, 이는 실수가 아니라 방어적 설계다.
왜 이런 중복이 필요할까?
자동화 스크립트나 CI 환경에서는 실행 위치가 항상 동일하다고 보장할 수 없다. 이때 옵션 하나라도 빠지면 예상치 못한 하위 폴더가 생성될 수 있다. 이 명령어는 다음을 강제한다.
어떤 상황에서도
새 폴더를 만들지 말고, 지금 위치에만 생성한다
3. 두 번째 의미
패키지는 보이지 않는 3단 구조를 가진다
PostgreSQL을 사용하기 위해 흔히 다음 명령어를 실행한다.
npm install @nestjs/typeorm typeorm pg
이 세 패키지는 단순한 나열이 아니다. 명확한 역할 분담 구조를 가진다.
역할 분담 표
| 단계 | 패키지 | 역할 |
| 1 | @nestjs/typeorm | NestJS와 ORM 연결 |
| 2 | typeorm | ORM 핵심 로직 |
| 3 | pg | PostgreSQL과 실제 통신 |
구조 도식

이 구조가 왜 중요할까?
이 구조는 디버깅 순서표이기도 하다.
- password authentication failed → DB 계정, 연결 문자열, pg 확인
- Repository not found → @nestjs/typeorm 설정 확인
4. 세 번째 의미
Validator와 Transformer는 반드시 함께 써야 한다
NestJS에서 ValidationPipe를 제대로 사용하려면 다음 두 라이브러리가 필요하다.
| 라이브러리 | 역할 |
| class-validator | 값 검증 |
| class-transformer | 객체 변환·응답 가공 |
ValidationPipe 동작 흐름

이 흐름이 동작하려면 다음 설정이 필요하다.
app.useGlobalPipes(
new ValidationPipe({ transform: true }),
);
transform: true가 없으면?
- DTO가 그냥 JSON 객체로 들어온다
- 타입 정보가 없어 검증이 부정확해진다
예시
@IsInt()
age: number;
- "age": "20"
- transform ❌ → 문자열, 검증 실패
- transform ✅ → 숫자로 변환 후 검증 성공
5. 네 번째 의미
실행 코드가 없는 패키지도 중요한 역할을 한다
uuid를 설치한 뒤 다음을 추가하는 경우가 있다.
npm install --save-dev @types/uuid
@types/uuid에는 실행 코드가 없다. 이 패키지는 TypeScript 전용 설명서다.
왜 필요한가?
- uuid는 JavaScript로 작성됨
- TypeScript는 매개변수·반환 타입을 알 수 없음
- 타입 정의가 없으면 자동 완성과 타입 검사가 불가능
비유
- uuid → 계산기
- @types/uuid → 사용 설명서
설명서는 개발 중에만 필요하므로 devDependencies에 둔다.
참고: 최근 라이브러리(axios 등)는 타입을 자체 포함하는 경우도 많다.
이 경우 @types 패키지는 필요 없다.
6. 다섯 번째 의미
엄격함은 런타임 에러를 컴파일 에러로 바꾼다
프로젝트 생성 시 --strict 옵션을 사용하면 TypeScript 엄격 모드가 활성화된다.
strict 모드 전·후 비교
// strict OFF
const user = findUser();
user.name.toUpperCase(); // 런타임 에러 가능
// strict ON
const user = findUser(); // User | null
// 컴파일 단계에서 null 처리 요구
strict 모드는 다음을 강제한다.
- null 가능성 명시
- 암묵적 any 금지
- 위험한 코드 조기 차단
초기에는 귀찮지만, 운영 환경에서의 장애를 크게 줄여준다.
7. 마무리
우리가 무심코 사용하던 NestJS 명령어에는 분명한 이유와 설계 의도가 있다. 이 의도를 이해하면 코드는 더 안정적이고 예측 가능해진다.
이제부터는 익숙한 명령어라도 한 번쯤 이렇게 질문해보자.
왜 이렇게 쓰는 걸까?
그 질문 하나가 우리를 다음 단계로 끌어올린다.
'잡(job)기술' 카테고리의 다른 글
| Nginx 설정, 이 5가지만 알면 ‘고수’ 소리 듣는다 (0) | 2026.02.03 |
|---|---|
| React 프로젝트를 200% 효율적으로 만드는 4가지 핵심 원칙 (0) | 2026.02.01 |
| 도커 헬스체크, Up 상태만 믿고 있지 않은가? (0) | 2026.02.01 |
| 영상 스트리밍의 숨겨진 기술: RTSP over HTTP의 3가지 놀라운 사실 (0) | 2025.10.13 |
| I/O 기반 코루틴: 블로킹을 피하는 우아한 방법 (0) | 2025.09.04 |