TIL

24.03.07

아리단길아조씨 2024. 3. 8. 01:09
728x90

Express.js 의 장점과 단점
node.js를 공부하다 보면 필연적으로 웹 서버를 개발하는 단계에 도착하는데 책이나 메뉴얼에서는 Express를 공식 라이브러리 처럼 다룸.
익스프레스는 간단한 코드로 빠르고 간편하게 웹서버를 만들 수 있다. 
하지만 익스프레스를 사용하여 웹 서버를 만들다 보면 사용하고 싶은 미들웨어들이 많으면 많을 수록 미들웨어를 사용하겠다고 계속 선언을 해야하며 사용하려는 미들웨어에 대한 공부를 피할 수 없게되었다.

 레이어드 아키텍처 패턴: 웹 서버를 구현할 때 가장 보편적으로 사용되는 구현 패턴임
- 시스템을 여러 계층으로 나누어 각 계층이 특정 책임을 갖도록 하는 아키텍처 스타일
(하나의 클래스나 모듈은 하나의 책임만을 가져야한다!)

레이어드 아키텍처 패턴의 각 계층
1. 프레젠테이션 계층(컨트롤러)
- 클라이언트와 통신을 직접적으로 담당하고, 클라이언트의 요청 해석과 응답을 하는 계층임.
- API나 UI를 제공하며 컨트롤러로 대변된다.
- 비즈니스 계층으로 요청을 위임, 받은 결과를 응답하는 역할만 수행함
2. 비즈니스 계층(서비스)
- 컨트롤러에서 요청을 받아 비즈니스 로직을 수행한다.
- 비즈니스 로직 수행과정에서 데이터 계층과 통신하며 서비르로 대변된다.
3. 데이터 계층(레포지토리)
- 실제 데이터베이스(RDBMS, NoSQL)에 접근하는 계층임
- 레포지토리로 대변된다.

레이어드 아키텍처 패턴의 주요 특징
1. 의존성: 각 계층은 가장 가까운 하위 계층의 의존성을 주업받는다.
2. 독립성: 각 계층은 다른 계층의 역할 침범X, 각 계층은 역할이 명확하여 기능 구현이나 테스트에 용이함

Express로 레이어드 아키텍처를 구현할 수 있지만 스스로 일일이 다 해야하기 때문에 주니어 개발자에게는 어렵고 혼란만 가중되는 사태가 발생할 수 있다.

Nest.js의 등장 =>  번거롭고 혼란하던 express을 단죄하기 위해? 등장

Nest의 인기 비결
1. 명령어 하나로 쉽고 간편한 계층 생성: 웹 서버에 필요한 다양한 구성요소를 커맨드로 정확하게 구현할 수 있다
2. 보다 더 로직에 집중할 수 있는 환경 제공:  커맨드로 계층을 생성해주기 때문에 개발자는 웹 서버의 핵심 로직 구현에만 힘을 쏟을 수 있다.

Nest.js 개발환경 구축
1. 터미널에 npm i -g @nestjs/cli 명령어를 입력하여 Nest.js를 설치함
2. nest 명령어로 nest.js를 실행시킴
3. nest new 프로젝트 이름 명령어로 새로운 nest.js 프로젝트를 생성한다.
4.  ? Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm
  yarn
  pnpm
라는 질문을 던지는데 내가 사용할 패키지매니저를 선택해준다.
** nest는 npm 호환이 가장 좋기 때문에 npm으로 사용하는 것이 좋음

Nest.js 코드를 통한 개념 학습
진입점 파일 main.ts
=> main.ts는 Nest.js에서 진입점으로 사용하겠다고 사전에 약속한 파일이기 때문에 절대 파일이름을 바꾸면 안된다.
main.ts 파일은 Nest.js에서 웹 어플리케이션의 진입점임

모듈(app.module.ts)
-> main.ts 파일에서의 const app = await NestFactory.create(AppModule); AppModule은 app.module.ts 파일에 정의되어 있음
* 모듈을 만들게 되면 '모듈이름' 이라는 디렉토리가 src디렉토리 내부에 새로 생기고, 모듈이름.module.ts라는 이름의 파일로 생성이 된다.

데코레이터(@): 해당 클래스나 함수가 어떤 역할을 수행하는지에 대해 알려주는 Nest.js에 알려주는 역할을 담당한다.(개발자가 직접 데코레이터를 만들 수도 있음)

모듈의 속성
1. imports
- 현재 모듈에서 사용하려 하는  다른 모듈 목록들을 정의한다.(수입)
- 이 속성에 명시된 모듈들은 주로 필요한 프로바이더(서비스)를 제공함
2. controller
- 현재 모듈과 관련된 컨트롤러의 목록을 정의함
- 해당 모듈의 요청 처리 로직을 담당
3. provider
- 현재 모듈에서 사용하거나 제공하는 서비스, 레포지토리, 팩토리 등의 목록을 정의함.
- 주로 비즈니스 로직 처리나 데이터 엑세스 같은 작업 수행
4. exports
- 현재 모듈에서 다른 모듈로 제공하려는 서비스 목록 정리(수출)
- 이 속성에 명시된 서비스들은 해당 모듈 외부에서 사용이 가능함

컨트롤러(app.controller.ts)
-> AppModule에서 사용하는 컨트롤러 파일임 @Controller라는 데코레이터를 통해서 AppController 클래스가 컨트롤러 역할을 하는 것을 Nest.js에 알림

서비스(app.service.ts)
@Injectable이라는 데코레이터가 등장을 하는데 Appservice가 필요한 곳에 어디든 주입해서 사용할 수 있다는 것을 의미함.
서비스의 역할: 고객(컨트롤러)에게 서비스(메인 로직)를 제공한다.
서비스 객체는 실제로 레포지토리를 의존하면서 비즈니스 로직을 담당한다.(어플리케이션의 중추)
** 서비스는 레포지토리를 반드시 의존하고 생성자를 통한 DI(생성자 주입)으로 해결해야함

실제 웹 서버에서 서비스를 공급받는 플로우
- 서비스-> 컨트롤러 -> 클라이언트(브라우저, 앱,  etc) -> 고객




'TIL' 카테고리의 다른 글

24.03.13  (0) 2024.03.14
24.03.08  (0) 2024.03.11
24.03.06  (0) 2024.03.07
24.03.05  (0) 2024.03.05
24.03.04  (0) 2024.03.04