Nest.js란?
Nest.js는 Node.js 위에서 작동하는 서버 프레임워크로,
확장성과 유지보수를 고려한 Node.js 서버 애플리케이션을 만들기 위한 프레임워크다.
특징
- TypeScript 기반으로 설계되어 타입 안정성과 대규모 코드 관리에 유리함
- Express/Fastify 위에 얹힌 구조 레이어
- 구조화가 되어있지 않아 확장성에 아쉬움이 있었던 Express의 단점을 보완함
- Angular에서 영감을 받은 아키텍처를 채택
- Module
- Controller
- Service
- Dependency Injection(DI)
💁♀️Node.js는 뭐야?
Node.js는 웹 브라우저 없이도 Javascript를 실행할 수 있게 하는 런타임 환경을 말한다.
기존에는 웹 브라우저 안에서만 JS를 실행할 수 있었다.
이런 JS를 웹 브라우저 밖에서도 실행할 수 있게 하여, OS 기능(파일 시스템 접근, 네트워크 통신, DB 연결 등)을 처리할 수 있게 하는 JS 엔진인것이다.
단, DOM 조작이나 브라우저 이벤트 처리는 Node.js의 역할이 아니며,
이는 웹 브라우저 환경에서만 수행된다.

Nest.js


1. 기본 파일 구조

Nest.js 프로젝트를 생성하면 src폴더에 기본적으로 총 5개의 파일이 들어있다.
app.controller.spec.ts
- app.controller.ts에 대한 단위 테스트 파일
- 실제 로직과는 직접적인 연관은 없음
👉 “컨트롤러가 잘 동작하는지 테스트”
app.controller.ts
- 컨트롤러
- HTTP 요청을 받는 역할
- 예: / 요청이 오면 어떤 응답을 줄지 정의
👉 “요청을 받는 입구”
app.service.ts
- 비즈니스 로직을 담당하는 서비스
- 컨트롤러에서 호출됨
- 데이터 가공, 계산, 처리 로직 등을 담당
👉 “실제 일하는 곳”
app.module.ts
- 애플리케이션의 루트 모듈
- 컨트롤러와 서비스를 묶어주는 역할
- Nest는 모든 것을 Module 단위로 관리
👉 “애플리케이션의 설계도”
main.ts
- 애플리케이션의 시작점(entry file)
- Nest 앱을 생성하고 서버를 실행하는 역할
👉 “서버를 켜는 파일”
Platform
Nest.js는 기본적으로 HTTP 서버 플랫폼으로 Express와 Fastify를 지원한다.
개발자는 프로젝트 성격에 따라 두 프레임워크 중 하나를 선택해 사용할 수 있다.
Nest.js의 중요한 설계 철학 중 하나는 플랫폼에 종속되지 않는 구조를 지향한다는 점이다.
즉,
- 내부적으로 Express를 사용하든 Fastify를 사용하든
- HTTP 프레임워크가 변경되더라도
Nest 애플리케이션의 코드는 수정 없이 그대로 재사용 가능해야 한다.
이를 가능하게 하기 위해 Nest.js는 내부적으로 Adapter 패턴을 사용한다.

💁♀️ Adapter 패턴
: 서로 다른 인터페이스들이 같은 클래스를 사용할 수 있도록, 클래스 코드 수정 없이 중간에서 인터페이스를 변환해주는 패턴이다.
다음 그림과 같이, 클라이언트가 요청을 보내면 서버 플랫폼에 먼저 전달이 된다.

main.ts 파일에 서버 플랫폼을 설정할 수 있다.
기본적으로 플랫폼과 무관하게 작성하도록 제공한다.
Express / Fastify 전용 API를 사용한다면, 따로 타입을 지정하여 설정해준다.
// Express 애플리케이션을 사용할 때
const app = await NestFactory.create<NestExpressApplication>(AppModule);
// 별다른 서버 플랫폼 설정 없음
const app = await NestFactory.create(AppModule);

Controllers
Controller는 클라이언트로부터 들어오는 HTTP 요청을 받고, 응답을 돌려주는 역할을 한다.
역할
- 특정 요청(URL, HTTP Method)을 처리
- 요청을 받아 적절한 Service를 호출
- 결과를 클라이언트에게 응답으로 반환
👉 요청의 진입점(Entry Point)
Nest가 제공하는 '전용 데코레이터'
Nest는 전용 데코레이터가 있어 직접 Express의 req 객체를 꺼낼 필요가 없다
📥 요청(Request) 관련 데코레이터

📤 응답(Response) 제어 데코레이터

예시 코드
@Get(':id')
@HttpCode(200)
@Header('Cache-Control', 'no-store')
getUser(
@Param('id') id: string,
@Query('page') page: number,
@Body() body: any,
@Ip() ip: string,
) {
return { id, page, ip };
}
📚 참고자료
https://yozm.wishket.com/magazine/detail/2215/
Node.js의 새로운 파트너 NestJS는 왜 탄생했을까? | 요즘IT
기존에는 Node.js와 익스프레스를 사용해 웹 서버를 구축하고 서비스를 만들었습니다. 익스프레스를 사용해서 서버를 구축할 때, 먼저 고민했던 부분이 무엇이었나요? 바로 디렉터리 구조입니다.
yozm.wishket.com
'Web' 카테고리의 다른 글
| SSR의 한계를 보완한 'Streaming SSR'에 대해 알아보자 (1) | 2025.12.12 |
|---|---|
| 웹 렌더링 방식 4가지 비교: CSR·SSR·SSG·ISR (0) | 2025.12.08 |
| [Javascript] 13장-15장: 스코프와 var/let/const 비교 (0) | 2025.10.11 |