Skip to content

Nest js 개념 정리

Vardy edited this page Dec 10, 2023 · 1 revision

Nest js 개념 정리

서문

Nest 공식 문서를 읽기 전에 선행되어야 하는 개념을 이 글에서 알아보고자 합니다. (그렇지 않으면 이해하기가 힘들더군요.) 추가로 Nest js의 장단점을 알아보겠습니다.

Nest js란?

Nest.js는 Node.js를 기반으로 한 서버 사이드 애플리케이션을 구축하기 위한 강력하고 모듈화된 프레임워크입니다. 다음은 Nest js의 주요 특징과 역할을 설명한 것입니다.

계층형 구조 (Layered Structure)

  • 계층형 구조는 소프트웨어를 여러 레벨의 계층으로 구성하는 방식을 의미합니다.
  • 각 계층은 특정한 역할과 책임을 가지며, 상위 계층은 하위 계층을 활용하여 기능을 제공합니다.
  • 전형적으로 웹 애플리케이션에서 사용되는 계층은 다음과 같습니다: 프레젠테이션( Presentation), 비즈니스 로직 (Business Logic), 데이터 액세스(Data Access) 계층 등입니다.

제어 역전 (Inversion of Control, IoC)

  • 제어 역전은 소프트웨어 컴포넌트 간의 의존성 관리 방식을 나타냅니다.
  • 일반적으로 컴포넌트는 자신이 필요로 하는 다른 컴포넌트를 직접 생성하거나 관리합니다.
  • 그러나 제어 역전은 컴포넌트가 필요로 하는 다른 컴포넌트의 생성과 관리를 외부에서 담당하도록 하는 개념입니다.
  • 이렇게 하면 코드를 더 모듈화하고 재사용하기 쉽게 만들며, 유지보수가 용이해집니다.

의존성 주입 (Dependency Injection, DI)

  • 의존성 주입은 제어 역전의 구체적인 구현 방법 중 하나입니다.
  • 컴포넌트가 필요로 하는 다른 컴포넌트를 직접 생성하지 않고, 외부에서 주입받는 방식을 나타냅니다.
  • 이렇게 하면 컴포넌트 간의 결합도가 낮아지며, 유연성과 테스트 용이성이 향상됩니다.
  • 의존성 주입은 클래스나 함수의 매개변수를 통해 다른 객체를 주입받거나, 컨테이너에서 필요한 객체를 가져와 사용하는 방식으로 구현됩니다.

싱글톤

싱글톤(Singleton)은 소프트웨어 디자인 패턴 중 하나로, 특정 클래스의 인스턴스가 오직 하나만 생성되고 이 인스턴스에 대한 전역적인 접근 지점을 제공하는 패턴을 가리킵니다.

데코레이터 패턴

Nest.js는 데코레이터 패턴을 활용하여 컴포넌트, 라우트 핸들러, 파라미터 유효성 검사, 미들웨어 등을 설정하고 메타데이터를 추가합니다. 데코레이터 패턴은 코드의 가독성과 확장성을 향상시키며, 애플리케이션의 동작을 확장할 수 있도록 합니다.

모듈화

Nest.js는 모듈화된 구조를 채택하여 애플리케이션을 작은 모듈의 집합으로 구성합니다. 각 모듈은 특정 기능 또는 도메인을 나타내며, 컨트롤러, 서비스, 미들웨어, 파이프, 인터셉터 등과 같은 컴포넌트로 구성됩니다. 모듈화는 코드의 재사용성을 높이고 애플리케이션을 구조화하는 데 도움이 됩니다.

아키텍처 및 디자인 패턴

Nest.js는 MVC (Model-View-Controller), MVW (Model-View-Whatever)와 같은 디자인 패턴을 채택하여 코드를 구조화하고 모듈화합니다. 이를 통해 애플리케이션의 아키텍처를 관리하고 가독성을 향상시킵니다.

Controllers

  • 컨트롤러는 클라이언트 요청을 처리하고 응답을 반환하는 역할을 하는 클래스입니다.
  • 특정 엔드포인트(예: "/users")와 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)를 처리하는 로직을 정의합니다.

예를 들어, 사용자 정보를 검색하고 반환하는 API 엔드포인트를 처리하는 메서드를 컨트롤러 내에 작성할 수 있습니다.

https://velog.velcdn.com/images/shinjy9802/post/a3b92bf6-526d-473b-8a57-2939408122d7/image.png

라우팅

라우팅은 웹 애플리케이션에서 클라이언트 요청과 서버의 특정 URL 주소 간의 연결을 설정하는 과정이라고 생각할 수 있습니다. 다시 말해, 어떤 URL이 들어오면 어떤 코드를 실행할 것인지 결정하는 것이 라우팅입니다.

Service

  • 서비스는 애플리케이션의 비즈니스 로직을 처리하는 클래스로, 컨트롤러에서 사용됩니다.
  • 데이터베이스 연동, 외부 API 호출, 데이터 가공 등과 같은 작업을 수행합니다.
  • 컨트롤러와 다른 서비스 간에 데이터 및 기능을 공유하기 위한 용도로 사용됩니다.

Providers

  • 프로바이더는 의존성 주입을 위해 사용되는 인스턴스입니다.
  • 서비스, 컨트롤러, 및 모듈에서 필요한 객체를 제공하고 주입하는 역할을 합니다.
  • Nest.js의 의존성 주입 시스템을 통해 컴포넌트 간에 데이터 및 인스턴스를 공유합니다.

프로바이더는 서비스, 레파지토리, 팩토리, 헬퍼 등등의 프로바이더로 취급될 수 있습니다.

Modules

  • 모듈은 관련된 컨트롤러, 서비스 및 다른 관련 컴포넌트를 그룹화하는 방법을 제공합니다.
  • 애플리케이션을 조직화하고 재사용 가능한 코드를 생성하는 데 중요한 역할을 합니다.
  • 모듈은 @Module() 데코레이터를 사용하여 정의하며, 다른 모듈에서 가져와 재사용할 수 있습니다.

Middleware

미들웨어는 요청과 응답 사이에 실행되는 중간 단계의 함수로, 요청 및 응답을 수정하거나, 로깅 및 인증과 같은 공통된 작업을 수행하는 데 사용됩니다.

Pipe

  • 파이프는 요청 데이터의 유효성 검사 및 변환을 위해 사용되는 중간 처리 단계입니다. 예를 들어, 입력 데이터의 형식을 검사하거나 데이터를 변환하는 데 사용됩니다.
  • 컨트롤러 메서드의 파라미터에 @UsePipes() 데코레이터를 사용하여 파이프를 적용할 수 있습니다.

Nest.js는 이러한 특징과 원칙을 활용하여 강력하고 확장 가능한 서버 사이드 애플리케이션을 빠르게 개발할 수 있는 강력한 도구입니다.

Nest js 장단점

장점

  1. 모듈화 및 구조화: Nest.js는 모듈화 아키텍처를 지원하므로 코드를 모듈로 구분하여 애플리케이션을 구조화하기 쉽습니다. 이로써 큰 프로젝트를 보다 효과적으로 관리할 수 있습니다.
  2. TypeScript 지원: Nest.js는 TypeScript를 완벽하게 지원하며, 정적 타입 검사와 강력한 개발 도구를 통해 안정성과 생산성을 향상시킵니다.
  3. 의존성 주입 및 제어 역전: Nest.js는 의존성 주입(DI)와 제어 역전(IoC)을 통해 컴포넌트 간의 의존성을 쉽게 관리하고, 코드를 더 모듈화하며 테스트하기 쉽게 합니다.
  4. 데코레이터 패턴: 데코레이터 패턴을 활용하여 코드를 더 가독성 있게 작성하고, 컴포넌트에 메타데이터를 추가하여 동작을 확장할 수 있습니다.
  5. 성능: Nest.js는 노드의 이벤트 루프를 효과적으로 활용하고 높은 성능을 제공합니다.
  6. 액티브 커뮤니티: Nest.js는 활발한 커뮤니티와 공식 문서를 통해 지원을 받을 수 있으며, 다양한 확장 모듈과 플러그인이 제공됩니다.
  7. 테스트 용이성: 모듈화 및 의존성 주입을 통해 단위 테스트 및 통합 테스트를 수행하기 용이하며, 자체적인 테스트 유틸리티를 제공합니다.

단점

  1. 러닝 커브: Nest.js는 다른 백엔드 프레임워크와 비교했을 때 학습 곡선이 높을 수 있습니다. 특히 처음에는 모듈, 데코레이터 및 의존성 주입 등의 개념을 이해해야 합니다.
  2. 보일러플레이트 코드: Nest.js는 높은 수준의 추상화를 제공하므로 간단한 프로젝트에서는 과도한 보일러플레이트 코드가 필요할 수 있습니다.
  3. 성능 최적화 복잡성: 성능 최적화를 위해 추가 구성 및 조정이 필요할 수 있으며, 초보 개발자에게는 복잡하게 느껴질 수 있습니다.
  4. 클라이언트 사이드 개발에는 적합하지 않음: Nest.js는 주로 서버 사이드 백엔드 개발에 중점을 두고 있으며, 클라이언트 사이드 또는 싱글 페이지 애플리케이션 (SPA) 개발에는 적합하지 않을 수 있습니다.

참고 문헌

https://docs.nestjs.com/https://www.wisewiredbooks.com/nestjs/overview/01-firstStep.html

Clone this wiki locally