본문 바로가기
잡(job)기술

복사-붙여넣기 하던 NestJS 명령어 - 그 속에 숨겨진 5가지 의미

by 무니이구나 2026. 2. 1.

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 명령어에는 분명한 이유와 설계 의도가 있다. 이 의도를 이해하면 코드는 더 안정적이고 예측 가능해진다.

이제부터는 익숙한 명령어라도 한 번쯤 이렇게 질문해보자.

왜 이렇게 쓰는 걸까?

 

그 질문 하나가 우리를 다음 단계로 끌어올린다.