🦁 Nest.js
Nest.js에 대해 깊이 배워보고 싶어서 새로 작성한다.

- TypeScript 기반의 웹 애플리케이션을 만들기 위한 프레임워크로, Angular의 아키텍처에서 영감을 받았고, Express나 Fastify와 함께 사용될 수 있다. NestJS는 강력한 DI(의존성 주입), 데코레이터, 모듈화된 아키텍처를 제공하여 대규모 애플리케이션을 쉽게 유지 관리하고 확장할 수 있다.
👍 Nest.js의 핵심
-
모듈화: 애플리케이션이 여러 개의 모듈로 나뉘며, 각 모듈은 관련된 컨트롤러, 서비스, 파이프, 미들웨어 등을 포함한다.
- 모듈화를 통해 애플리케이션의 유지보수성을 높여주고, 각 기능이 독립적으로 관리될 수 있도록한다.

- 효율성: 모듈화된 구조는 코드의 재사용성과 테스트 용이성을 증가시킨다. 각 모듈은 독립적으로 테스트할 수 있으며, 모듈 간의 의존성도 명확하게 정의된다.
-
의존성 주입(DI): 의존성 주입 패턴을 사용하여 클래스 간의 의존성을 관리한다. 객체 간의 결합도를 낮추고 테스트 가능성을 높여준다.
- DI의 역할: 클래스는 필요한 의존성 객체들을 생성자에 주입받고, 이를 통해 의존성 객체에 접근할 수 있다.
- 효율성: DI를 통해 객체 간의 강한 결합을 피할 수 있고, 코드 변경 시 한 곳만 수정하면 되므로 유지보수가 용이하다.
-
데코레이터: TypeScript의 데코레이터 기능을 활용한다. 클래스를 설명하는 메타데이터를 추가하고, 그 클래스를 다른 코드에서 어떻게 사용할지를 정의하는 역할을 한다.
- @Controller(), @Injectable(), @Get() 등등 미리 만들어둔 데코레이터를 이용하며, 의존성 주입, 라우팅 등을 처리하는데 사용된다.
-
비동기 처리: 비동기 이벤트 기반 아키텍처를 활용하여 비동기 작업을 자연스럽게 처리할 수 있다.
🧩 Nest.js의 아키텍처
1. 모듈(Module): 데코레이터 @Module()을 사용해 정의되며, 다른 모듈을 imports 배열에 추가하여 의존성을 해결한다.
@Module({
imports: [CatsModule], // 다른 모듈을 임포트
controllers: [CatsController],
providers: [CatsService], // 서비스 주입
})
export class AppModule {}
2. 컨트롤러(Controller): HTTP요청 즉 사용자와 소통하는 클래스이다.
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Get()
findAll() {
return this.catsService.findAll();
}
}
3. 서비스(Service): 가장 중요한 비즈니스 로직을 처리하는 클래스이다. @Injectable() 데코레이터를 이용하여 정의되며, 서비스 간의 의존성을 관리하고, 데이터를 처리한다.
@Injectable()
export class CatsService {
findAll() {
return 'All cats';
}
}
4. 파이프(Pipe): 입력 데이터를 변환하거나 검증하는데 사용된다. 예를 들어, 유효성 검사, 형식 변환, 데이터 정규화 등을 처리할 수 있다.
5. 가드(Guard): 요청을 처리하기 전에 특정 조건을 확인할 수 있다. 예를 들어, 인증, 권한 확인 등을 처리하는 데 사용된다.
6. 인터셉터(Interceptor): 요청과 응답을 가로채서 처리할 수 있는 기능을 제공한다. 응답 데이터를 변환하거나, 로깅을 하는 데 사용된다.