1. NestJS 너 대체 정체가 뭐야?
NestJS는 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구축하기 위한 혁신적인 프레임워크입니다. 2017년 Kamil Myśliwiec에 의해 개발된 이 프레임워크는 Angular의 아키텍처에서 영감을 받아, TypeScript를 기반으로 한 견고하고 모듈화된 구조를 제공합니다.
현대적인 서버 애플리케이션 개발에서 마주치는 많은 과제들, 예를 들어 코드의 구조화, 확장성, 유지보수성 등의 문제를 NestJS는 효과적으로 해결합니다. 이 프레임워크는 Express.js를 기본 HTTP 서버 프레임워크로 사용하지만, 필요에 따라 Fastify로 전환할 수 있는 유연성도 제공합니다.
Fastify: Node.js 환경에서 사용되는 웹 프레임워크로, 성능이 뛰어나고 확장성이 좋은 프레임 워크
NestJS의 주요 목표는 개발자들에게 높은 수준의 추상화를 제공하면서도, 기본 플랫폼의 강력한 기능들을 직접 활용할 수 있는 자유를 주는 것입니다. 이를 통해 개발자들은 효율적이고 확장 가능하며 쉽게 유지보수할 수 있는 애플리케이션을 만들 수 있습니다.
2. NestJS의 주요 특징
2.1. TypeScript 기반
NestJS는 TypeScript를 기본 언어로 사용합니다. TypeScript는 JavaScript의 상위 집합으로, 정적 타입 검사와 객체 지향 프로그래밍 기능을 제공합니다. 이는 다음과 같은 이점을 제공합니다:
- 더 나은 코드 품질: 컴파일 시점에 오류를 잡아내어 런타임 오류를 줄입니다.
- 향상된 개발자 경험: 코드 자동 완성, 리팩토링 도구 등 IDE의 강력한 기능을 활용할 수 있습니다.
- 명확한 코드 구조: 인터페이스, 제네릭 등의 기능으로 코드의 의도를 명확히 표현할 수 있습니다.
2.2. 모듈화 아키텍처
NestJS는 모듈 기반의 아키텍처를 채택하고 있습니다. 각 모듈은 관련된 기능들을 그룹화하고 캡슐화합니다. 이러한 접근 방식은 다음과 같은 장점이 있습니다:
- 코드 구조화: 관련 기능들을 논리적으로 그룹화하여 코드를 더 잘 구조화할 수 있습니다.
- 재사용성: 모듈은 다른 애플리케이션에서 쉽게 재사용할 수 있습니다.
- 확장성: 새로운 기능을 추가할 때 기존 코드를 크게 변경하지 않고도 새로운 모듈을 추가할 수 있습니다.
2.3. 의존성 주입
NestJS는 강력한 의존성 주입(DI) 시스템을 제공합니다. 이는 Spring 프레임워크의 DI 시스템과 유사하며, 다음과 같은 이점을 제공합니다:
- 느슨한 결합: 컴포넌트 간의 의존성을 줄여 유지보수성을 향상시킵니다.
- 테스트 용이성: 의존성을 쉽게 모킹할 수 있어 단위 테스트가 용이합니다.
- 코드 재사용: 의존성을 쉽게 교체할 수 있어 코드 재사용성이 향상됩니다.
2.4. 데코레이터 사용
NestJS는 TypeScript의 데코레이터를 광범위하게 사용합니다. 이는 메타데이터를 클래스, 메서드, 속성에 추가하는 선언적 방식을 제공합니다. 주요 이점은 다음과 같습니다:
- 간결한 문법: 복잡한 설정을 간단한 데코레이터로 표현할 수 있습니다.
- 가독성 향상: 코드의 의도를 명확하게 표현할 수 있습니다.
- 기능 확장: 사용자 정의 데코레이터를 통해 프레임워크의 기능을 쉽게 확장할 수 있습니다.
3. NestJS의 핵심 개념
3.1. 컨트롤러
컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 합니다. NestJS에서 컨트롤러는 `@Controller()` 데코레이터로 클래스를 장식하여 정의합니다. 주요 특징은 다음과 같습니다:
- 라우팅: HTTP 메서드와 경로를 특정 메서드에 매핑합니다.
- 요청 처리: 요청 본문, 쿼리 파라미터, 헤더 등을 쉽게 추출할 수 있습니다.
- 응답 형식화: 응답 상태 코드, 헤더, 본문을 쉽게 설정할 수 있습니다.
예를 들어:
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
3.2. 프로바이더
프로바이더는 NestJS의 기본 개념으로, 대부분의 Nest 클래스(서비스, 리포지토리, 팩토리 등)가 프로바이더로 취급될 수 있습니다. 프로바이더의 주요 아이디어는 의존성으로 주입할 수 있다는 것입니다. 특징은 다음과 같습니다:
- 의존성 주입: 클래스 간의 관계를 정의하고 객체의 인스턴스를 자동으로 생성합니다.
- 싱글톤 패턴: 기본적으로 프로바이더의 인스턴스는 애플리케이션 전체에서 공유됩니다.
- 생명주기 관리: NestJS가 프로바이더의 생성과 소멸을 관리합니다.
예를 들어:
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
3.3. 모듈
모듈은 관련된 기능들을 하나의 단위로 캡슐화하는 데 사용됩니다. NestJS 애플리케이션은 최소한 하나의 루트 모듈을 가지며, 이를 중심으로 기능 모듈들이 구성됩니다. 모듈의 주요 특징은 다음과 같습니다:
- 관련 기능 그룹화: 컨트롤러, 서비스 등 관련된 기능들을 하나의 모듈로 묶습니다.
- 공유 모듈: 모듈은 다른 모듈에서 가져와 사용할 수 있습니다.
- 의존성 관리: 모듈 간의 의존성을 명확히 정의할 수 있습니다.
예를 들어:
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
'Dev Framework > Node.js' 카테고리의 다른 글
[Node.js] 이벤트 루프의 이해: 비동기 처리의 핵심 (0) | 2024.09.23 |
---|---|
[NestJS] Node진영에서의 NestJS의 위상 (0) | 2024.09.21 |
[NestJS] NestJS는 Spring에서 많은 영감을 받았다. (0) | 2024.09.21 |
[Node.js] ORM에 대해서 (9) | 2024.09.15 |