ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nest.js
    Backend/Nest.js 2023. 9. 18. 22:59
    728x90

    Nest.js는 효율적이고 확장 가능한 서버 사이드 애플리케이션을 구축하기 위한 고성능의 Node.js 프레임워크입니다.

    기업 친화적인 프레임워크이고, express보다 우리가 선호하는 구조를 적용할 수 있습니다.

    Typescript를 기반으로 하지만, Javascript로도 사용이 가능하며

    OOP(Object Oriented Programming)
    FP(Functional Programming)
    FRP(Functional Reactive Programming)

    와 같은 다양한 개발 방법론을 사용할 수 있습니다.

    1. OOP (객체 지향 프로그래밍, Object-Oriented Programming)

    객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그램을 객체들의 집합으로 보고 이들이 서로 상호작용하는 방식으로 설계하고 구현하는 방법론입니다.

    객체는 데이터와 이 데이터를 다루는 기능(메소드)을 하나로 묶은 것을 의미하며, 이런 방식은 프로그램을 더욱 이해하기 쉽고, 유지 보수하기 편하게 만듭니다.

    OOP의 주요 원칙에는 캡슐화, 상속, 다형성 등이 있습니다.

     

    2. FP (함수형 프로그래밍, Functional Programming)

    함수형 프로그래밍은 프로그램을 수학적 함수의 계산으로 보는 방법론입니다.

    이는 데이터를 변화시키는 것보다 **불변성(Immutable)**을 중요시하며, 사이드 이펙트를 최소화 하기 위해 순수 함수를 사용하는 것을 강조합니다.

    함수형 프로그래밍은 코드를 더 간결하고 예측 가능하게 만들어 줄 수 있습니다.

     

    3. FRP (함수 반응형 프로그래밍, Functional Reactive Programming)

    FRP은 함수형 프로그래밍과 반응형 프로그래밍의 개념을 결합한 것입니다. 반응형 시스템을 구축하는 데 사용됩니다.

    FRP에서는 시간에 따라 변화하는 값에 집중하며, 이를 이벤트 스트림이라고 합니다. 이벤트 스트림은 이벤트 발생 시점에 따라 값을 방출하는 시퀀스로 간주됩니다.

    FRP은 이벤트 스트림을 통해 입력, 출력 및 중간 계산 단계를 표현하고 조합할 수 있습니다. 함수형 프로그래밍의 개념을 적용하여 변화하는 값을 변환하는 함수를 사용하고, 이벤트 스트림을 조합하여 원하는 동작을 설명하는 식으로 프로그램을 구성합니다. 이러한 방식으로 FRP은 선언적이고 모듈화된 코드를 작성할 수 있습니다.

    함수형 프로그래밍의 불변성과 순수 함수를 활용함으로써 복잡성을 줄이고, 상태 변화에 따른 부작용을 최소화하여 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.


    Nest.js의 장점

    1. Typescript 기반

    Nest.js는 TypeScript를 기반으로 합니다.

    TypeScript는 JavaScript의 슈퍼셋으로, 정적 타입을 지원하여 더 안전하고 예측 가능한 코드를 작성하게 돕습니다.

    또한, Typescript는 코드 자동완성, 인텔리센스, 얼리 에러 디텍션 등의 IDE 기능을 제공하여 개발 과정을 보다 편리하게 만듭니다.

     

    2. 확장성과 모듈성

    Nest.js는 확장성 있는 소프트웨어를 만드는 데 필요한 모든 도구를 제공합니다.

    이를 위해 Nest.js는 모듈, 미들웨어, 파이프, 가드, 인터셉터 등의 기능을 지원하며, 이들은 개발자가 효과적으로 코드를 구성하고 재사용하게 해줍니다.

     

    3. DI (Dependency Injection) 컨테이너

    Nest.js는 강력한 의존성 주입 기능을 제공합니다.

    이는 각 클래스와 모듈이 서로의 의존성을 최소화하면서도 필요한 기능을 효율적으로 제공할 수 있게 돕습니다.

    이러한 설계는 코드의 유지보수성과 테스트 용이성을 향상시킵니다.

     

    4. 테스트 용이성

    Nest.js는 Jest와 Supertest 같은 테스트 프레임워크와 쉽게 통합할 수 있습니다.

    이로 인해 단위 테스트와 통합 테스트를 쉽게 작성하고 실행할 수 있습니다.

     

    5. 데코레이터와 메타 프로그래밍

    Nest.js는 데코레이터를 광범위하게 활용하여 코드를 더욱 직관적이고 간결하게 만듭니다.

    데코레이터를 사용하면 메타데이터를 활용하여 코드의 동작을 정의하거나 변경할 수 있습니다.

     

    6. 강력한 CLI

    Nest.js는 프로젝트를 생성하고, 컴포넌트를 추가하고, 테스트를 실행하는 등의 작업을 수행하는데 사용할 수 있는 강력한 CLI(Command Line Interface)를 제공합니다.

     

    7. 다양한 라이브러리와의 통합

    Nest.js는 TypeORM, Sequelize, Mongoose 등의 ORM 라이브러리와 쉽게 통합될 수 있습니다.

    또한, Passport, GraphQL, Websockets 등의 라이브러리와의 통합도 지원합니다.


    설치

    npm i -g @nestjs/cli

     

    프로젝트 생성

    nest new 프로젝트이름

     

    main.ts

    서버가 구동되면 listen() 메소드가 Promise 객체를 반환하기 때문에 await를 사용합니다.

    main.ts의 bootstrap 함수는 기본적으로 async로 선언되어 만들어집니다.

     

    app.module.ts

    @Module() 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타데이터를 제공하는 역할입니다.

    상위 모듈인 app.moudle.ts에서 각 기능 모듈을 import 하는 것이 코드를 체계적으로 유지하고 명확한 경계를 설정할 수 있게 해줍니다.

     

    데코레이터

    데코레이터를 잘 활용하면 횡단관심사를 분리하여 관점 지향 프로그래밍을 적용한 코드를 작성할 수 있습니다.

    타입스크립트의 데코레이터는 파이썬의 데코레이터나 자바의 어노테이션과 유사한 기능을 합니다.

    클래스, 메서드, 접근자, 프로퍼티, 매개변수에 적용 가능합니다.

    사용자가 잘못된 요청을 보냈을 때 데코레이터를 이용하여 애플리케이션이 허용하는 값으로 제대로 요청을 보냈는지 검사합니다.

     

    ***.spec.ts

    spec이라고 붙은 파일은 테스트용 파일입니다.

     

    Entity

    DB와 1:1매칭이 되는 Class입니다.

     

    DTO

    데이터 전송 객체(Data Transfer Object)

    코드를 더 간결하게 작성할 수 있고 NestJS가 Validation을 해줄 수 있게 만들어 줄 수 있음

    💡 Entity 클래스는 실제 테이블과 매핑되어 만일 변경되게 되면 여러 다른 클래스에 영향을 끼치고, DTO 클래스는 View와 통신하며 자주 변경됩니다.

    결국 DTO는 Domain Model 객체를 그대로 두고, 복사하여 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent만을 위해서 사용해야합니다.

    즉, Entity는 DB와 1:1매칭이 되는 Class이지만, DTO의 경우 통신간의 Data의 형태를 정의한것임으로 Entity와는 다르게 수시로 변경이 될수 있습니다.

    계층형 아키텍처에서 Controller는 DTO로 변환된 요청 body를 매개변수로 적절한 Service의 메소드를 호출하게 되고, Service는 DTO를 비즈니스 로직을 통해 Entity로 변환된 객체를 Repository를 이용해서 저장됩니다.

     

    Controller

    사용자(client)의 요청(request)을 처리하고, 응답(response)을 반환하는 역할을 담당합니다.

     

    Providers

    어플리케이션이 제공하는 서비스 기능을 구현하고 수행하는 역할입니다.

    예를 들어 중고 물품 거래 플랫폼인 당근 마켓 같은 경우라면 사용자의 위치를 읽고 주변의 거래를 보여주는 서비스를 보여주는 기능을 구현한다면, Providers 없이 Controller에서 이러한 비즈니스 로직을 구현할 수 있겠지만 코드가 매우 길어지기 때문에 유지 보수할 때 정말 힘들 것 입니다.

    그리고 객체 지향 프로그래밍의 SOLID 원칙 중 단일 책임 원칙(SRP: Single Responsibility Principle)에 부합되지 않는 형태가 되기 때문에 더더욱 Controller와 Providers는 분리되어야 합니다.

     

    Nest.js DI

    @Injectable() 데코레이터는 해당 클래스가 Providers로 사용될 것임을 Nest js에게 알려줍니다.

     


    REF

    https://time-map-installer.tistory.com/222

    https://tristy.tistory.com/39

     

    728x90

    'Backend > Nest.js' 카테고리의 다른 글

    [Nest.js] Guards  (0) 2024.04.04
    [Nest.js] Test Code  (0) 2023.11.25
    [Nest.js] TypeORM, Repository Pattern  (0) 2023.10.02
Designed by Tistory.