본문 바로가기

Coding/내일배움캠프

[내일배움캠프] NestJS 1주차, 2주차 | Node.js 4기 | Day 60 | 24.03.04.(월)

NestJS 1주차

01. Warm-Up

02. Express.js의 장점 & 단점

1. 왜 Express.js로 웹 개발을 시작했는가?

- 빠르고 간편한 웹 서버 개발

2. Express.js로 복잡한 웹 서버를 개발해보자

- 복잡한 웹 서버를 개발해야 된다고 하면?
    - body-parser 적용하여 페이로드 파싱 기능 추가
    - CORS 적용해보기
    - cookie-parser 적용하여 로그인/로그아웃 처리하기
    - 레이어드 아키텍처 패턴
: 웹 서버를 구현할 때 가장 보편적으로 사용되는 구현 패턴
: 시스템을 여러 계층으로 나누어 각 계층이 특정 책임을 갖도록 하는 아키텍처 스타일
: SOLID 원칙 중 SRP(Single Responsibility Principle)와 유사한 면이 있다. SRP는 하나의 클래스나 모듈이 하나의 책임만을 가져야 함을 주장하는 원칙

3. 레이어드 아키텍처 패턴

    - 레이어드 아키텍처 패턴
        - 프리젠테이션 계층
            - 클라이언트와 직접 통신
            - API 또는 UI를 제공, 컨트롤러로 대변됨
        - 비즈니스 계층
            - 비즈니스 로직을 수행하는 계층
        - 데이터 계층
            - 실제 데이터베이스(RDBMS 혹은 NoSQL)에 접근하는 계층
    - 레이어드 아키텍처 패턴의 주요 특징
        - 의존성
        - 독립성
    - 반찬도 셀프

4. Express.js로 레이어드 아키텍처 패턴을 적용한다면?

- 반찬도 셀프, 물도 셀프, 프레임워크 구조 설계도 셀프
- 셀프 서비스는 자유롭지만 번거롭기도 하다

03. Nest.js의 등장!

1. Nest.js의 등장

2. Nest.js의 인기 비결

- 명령어 하나로 쉽고 간편하게 계층 생성!
- 컨트롤러 뿐 아니라 서비스, 미들웨어와 인터셉터 등 웹 서버에 필요한 다양한 구성요소를 커맨드로 정확하게 구현할 수 있다는 것은 Nest.js만의 엄청난 장점입니다!
- 보다 더 로직에 집중할 수 있는 환경 제공!

 

NestJS 2주차

01. Nest.js 개발환경 구축

02. Nest.js 코드를 통한 개념 학습

1. 진입점 파일

- main.ts 파일은 절대로 임의로 파일 이름을 변경하면 안 된다!

2. 모듈

- Nest.js에서 모듈은 애플리케이션의 특정 부분을 캡슐화하며, 관련된 컴포넌트, 서비스, 그리고 다른 모듈들을 그룹화한다.
- 데코레이터란 해당 클래스나 함수가 어떤 역할을 수행하는지에 대해서 Nest.js에 알려주는 역할을 하는 친구이다.
- 모듈 속성 파헤치기!
    - imports
: 현재 모듈에서 사용하려는 다른 모듈들의 목록을 정의
    - controllers
: 현재 모듈과 관련된 컨트롤러의 목록을 정의
    - providers
: 현재 모듈에서 사용하거나 제공하는 서비스, 리포지토리, 팩토리 등의 목록을 정의한다.
    - exports
: 현재 모듈에서 다른 모듈로 제공하려는 서비스의 목록을 정의

3. 모듈 - 고찰

- 외부 서비스를 사용할 수 있는 방법에는 2가지가 있다.

    1. service (only) + providers
: 서비스가 특정 모듈 내에서만 사용되고 다른 모듈에서는 사용되지 않을 때 좋다.
    2. module exports + imports
: 해당 서비스를 여러 모듈에서 공통으로 사용할 때는 무조건 이렇게 해야 한다.

4. 컨트롤러

- 의존성 주입

constructor(private readonly appService: AppService) {}

- 컨트롤러는 서비스를 반드시 의존해야 한다.
- 이는 생성자를 통한 DI로 해결해야 한다.

5. 서비스

- 컨트롤러라는 고객에게 서비스를 제공하는 것
- AppService와 같은 서비스 객체는 실제로 리포지토리를 의존하며 비즈니스 로직 실행을 담당
- 서비스는 리포지토리를 반드시 의존해야 하며 이는 생성자를 통한 DI로 해결

03. IoC와 DI

1. IoC (제어 역전)

- IoC : Inversion of Control : 제어 역전
    - IoC는 개발자가 사용하고 싶은 객체를 직접 생성하는 것(바로 위의 전통적인 방법)이 아니라 객체의 생명 주기 관리 자체를 외부(여기서는 Nest.js IoC 컨테이너)에 위임을 한다.
- 전통적인 방법의 한계
    - 의존하는 서비스가 변경되면 개발자도 그에 맞추어서 코드를 수정해야 한다.
- 하지만, IoC 원칙이 출동한다면?
    - IoC 원칙은 모듈 간 결합도를 낮추기 때문에 하나의 모듈이 변경되어도 다른 모듈들에는 영향을 최소화되어 웹 어플리케이션을 지속 가능하고 확장성 있게 해준다!

2. DI (의존성 주입) - IoC 원칙 구현 방법

- constructor(private readonly appService: AppService() {}