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() {}