반응형

다음은 이 글의 동영상 강의입니다.

https://youtu.be/MEaTJTyHVnc

다음은 실습 동영상입니다.

https://youtu.be/J8HWEoZSC-Y

 

* 이 글은 nestjs 공식 홈페이지를 참조하여 작성하였습니다.

https://docs.nestjs.kr/middleware

 

네스트JS 한국어 매뉴얼 사이트

네스트JS 한국, 네스트JS Korea 한국어 매뉴얼

docs.nestjs.kr

Nest의 미들웨어란?

미들웨어는 라우터 핸들러 이전에 호출되는 함수입니다.

Middlewar

다시말해 위 그림에서와 같이 클라이언트의 요청을 라우터 핸들러가 받기 전에 가로채 다른 작업을 처리할 수 있습니다.

이를 응용하면 여러가지 공통적으로 처리해야 하는 부분들의 처리를 중복 없이 개발할 수 있습니다.

예를 들면 다음과 같은 것들을 할 수 있습니다.

  • 모든 코드가 공통으로 실행해야 하는 인증, 로깅등을 처리할 수 있습니다.
  • 요청과 응답 객체를 변경할 수 있습니다.
  • 요청의 validation을 체크하여 오류 처리를 할 수 있습니다.

 

Nest의 미들웨어 사용법

Nest에서 미들웨는 다음과 같이 사용할 수 있습니다.

  • @Injectable 데코레이터를 사용합니다.
  • NestMiddleware 인터페이스를 implements 해서 사용합니다.
  • Module의 class 내부에 configure를 사용하여 선언합니다. 이때 NestModule 인터페이스를 implements 합니다.

다음은 Log를 위한 Middleware 예제입니다.

지금까지의 실습 소스는 아래 git 주소에서 받으시면 됩니다.

https://github.com/CodeGearGit/nest-cats.git

 

GitHub - CodeGearGit/nest-cats

Contribute to CodeGearGit/nest-cats development by creating an account on GitHub.

github.com

logger.middleware.ts

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('Request...');
    next();
  }
}

app.module.ts

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes('cats');
  }
}

다음과 같이 라우트를 특정하여 사용할 수도 있습니다.

.forRoutes({ path: 'cats', method: RequestMethod.GET });

다음과 같이 패턴 기반의 라우팅도 지원됩니다.

.forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });

 

Middleware 관리를 위한 내장 모듈 - MiddlewareConsumer

MiddlewareConsumer라는 헬퍼클래스를 사용하면 여러 스타일로 미들웨어를 설정할 수 있습니다.

forRoutes() 메소드는 단일 문자열, 여러 문자열, RouteInfo 객체, 컨트롤러 클래스 및 여러 컨트롤러 클래스를 사용할 수 있습니다.

다음은 Controller의 사용 예입니다.

app.module.ts

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';
import { CatsController } from './cats/cats.controller.ts';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(CatsController);
  }
}

apply 메서드는 여러 미들웨어를 지정할 수 있습니다.

 

라우트 예외처리

다음과 같이 exclude() 메소드로 라우트를 제외할 수 있습니다.

consumer
  .apply(LoggerMiddleware)
  .exclude(
    { path: 'cats', method: RequestMethod.GET },
    { path: 'cats', method: RequestMethod.POST },
    'cats/(.*)',
  )
  .forRoutes(CatsController);

Functional middleware

지금까지 만든 Class 미들웨어는 아래와 같이 간단한 Funtional middleware로 변경할 수 있습니다.

logger.middleware.ts

import { Request, Response, NextFunction } from 'express';

export function logger(req: Request, res: Response, next: NextFunction) {
  console.log(`Request...`);
  next();
};

위의 logger functrion은 Module에서 다음과 같이 사용할 수 있습니다.

app.module.ts

consumer
  .apply(logger)
  .forRoutes(CatsController);

 

여러개 미들웨어 사용

다음과 같이 apply() 메서드에 여러개의 미들웨어를 사용할 수 있습니다,

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);

Global 미들웨어

모든 경로에서 사용하는 미들웨어는 INestApplication 인스턴스에서 제공하는 user() 메서드를 사용할 수 있습니다.

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);
  • 단, Global 미들웨어에서 DI 컨테이너에 액세스할 수 없습니다.
  • app.use()에서 미들웨어를 사용할 때는 대신 functional middleware를 사용하고 있습니다.

반응형
반응형

아래는 이 글의 동영상 강의입니다.

https://youtu.be/5FiFW_057KU

 

 

서버를 운영하다보면 정기적으로 Job을 실행해야 하는 경우가 생깁니다.

이럴때 정기적으로 Job을 자동으로 실행해 주는 것을 스케줄러라고 합니다.

 

nodejs에서는 node-shedule이라는 패키지를 사용하면 스케줄러를 쉽게 만들 수 있습니다.

node express 에서 scheduler를 만드는 방법을 알아 보겠습니다.

 

우선 node 프로젝트를 생성합니다.

node init -y

프로젝트에 express를 추가합니다.

npm i express

app.js 파일을 만들고 다음 내용을 추가합니다.

const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(3000)

서버를 실행합니다.

node app

브라우저 주소창에 http://localhost:3000을 입력하고 "Hello World"가 나오는지 확인 합니다.

 

스케줄러를 만들기 위해 사용할 패키지를 다음 url에서 확인합니다.

https://github.com/node-schedule/node-schedule

 

GitHub - node-schedule/node-schedule: A cron-like and not-cron-like job scheduler for Node.

A cron-like and not-cron-like job scheduler for Node. - GitHub - node-schedule/node-schedule: A cron-like and not-cron-like job scheduler for Node.

github.com

 

프로젝트에 node-schedule을 설치합니다.

npm i node-schedule

app.js에 다음 내용을 추가합니다.

const schedule = require('node-schedule');
const express = require('express');
const app = express();

app.get('/', function (req, res) {
  res.send('Hello World');
})

app.listen(3000, function(){
    console.log('Express start on port 3000!');
    schedule.scheduleJob('* * * * * *', function(){
        console.log('The answer to life, the universe, and everything!');
    });
});

프로그램을 실행합니다.

node app

실행 결과는 다음과 같습니다.

스케쥴일 1초 마다 수행되는 것을 확인할 수 있습니다.

 

스케줄을 설정하는 법은 다음과 같습니다.

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)

앞에서 부터 초, 분, 시, 일, 월, 요일의 순입니다.

지속적인 실행은 *를 사용하면됩니다.

특정 시간에 실행하는 것은 아래와 같이 작성하면됩니다.

  • 매초 실행 : * * * * * *
  • 매분 실행 : * * * * *
  • 매분 0초에 실행 : 0 * * * * *
  • 매분 10초에 실행 : 10 * * * * *
  • 매시 1분 10초에 실행 : 10 1 * * * * 

다음은 매분 0초에 실행하도록 변경한 예입니다.

app.listen(3000, function(){
    console.log('Express start on port 3000!');
    schedule.scheduleJob('0 * * * * *', function(){
        console.log(new Date() + ' scheduler running!');
    });
});

실행 결과는 다음과 같습니다.

이상으로  Express에서 스케줄러를 만드는 방법이었습니다.

반응형
반응형

이 글의 동영상은 아래를 참조하세요.

https://youtu.be/R7qcPoZVW_U

 

M1 맥북 프로를 초기화해야 될 일이 생길때 다음과 같은 절차로 진행 하시면 됩니다.

 

전원 버튼 짧게 한번 그리고 길게 누릅니다.

옵션에서 계속 버튼을 클릭합니다.

맥OS 복구 창에서 이전 사용자 암호를 입력합니다.

4개의 옵션 창이 나오면 제일 하단의 디스크 유틸리티를 선택하고 계속버튼을 클릭합니다.

디스크 유틸리티 화면에서 좌측의 "Machintosh HD - Data"를 선택합니다.

우측 상단의 지우기를 클릭합니다.

확인 창에서 지우기를 선택합니다.

Activate Mac 화면에서 우측 상단의 wi-fi 버튼을 클릭하여 공유기를 선택합니다.

wi-fi 비밀번호를 입력하고 Join 버튼을 클릭합니다.

Activation Lock 화면에서 Apple ID와 비밀번호를 입력하고 Next를 클릭합니다.

Activate 되었다는 메시지가 나옵니다. Exit to Recovery를 클릭합니다.

다시 옵션창이 나오면 Reinstall macOS Monterey를 선택하고 Continue를 클릭합니다.

macOS Monterey 창에서 Continue를 클릭합니다.

라이선스 동의 창에서 Agree 버튼을 클릭합니다.

Install 할 디스크를 선택하고 Continue 버튼을 클릭합니다.

OS 설치가 시작됩니다.

Migration Assistant 창에서는 좌측하단의 Not Now를 클릭합니다.

Sign In 화면에서는 Apple ID를 입력합니다.

이중보안이 되어 있을 경우 휴대폰으로 전송된 인증번호를 입력합니다.

iCloud 약관 동의에 체크하고, Agree 버튼을 클릭합니다.

맥의 사용자 계정과 패스워드를 입력하고, Continue 버튼을 클릭합니다.

Find My 화면에서 Continue 버튼을 클릭합니다.

다음화면에서도 Continue 버튼을 클릭합니다.

Select Your Time Zone에서는 Set time zone automatically 에 체크하고 Continue 버튼을 클릭합니다.

Touch ID 화면에서도 Continue 버튼을 클릭합니다.

Place Your Finger 화면에서는 전원버튼을 이용해 지문을 인식시켜 줍니다.

시스템 설정에서 Language & Region을 선택합니다.

Preferred languages에서 한국어를 위로 끌어 올려줍니다.

창을 닫으면 리스타트 창이 나오고, Restart Now 버튼을 클릭합니다.

맥을 재시작 하면 다음과 같이 한국어로 설정이 완료됩니다.

이렇게 하면 맥 초기화가 완료됩니다.

 

반응형
반응형

맥북프로M1에 Java(OpenJDK)를 설치하는 방법입니다.

 

아래는 이 내용으로 만든 동영상입니다.

https://youtu.be/ixhJpAkdKf0

 

homebrew 설치하기

Java를 쉽게 설치하기 위해서 homebrew를 먼저 설치합니다.

homebrew는 MacOS에 프로그램 설치를 쉽게 해주는 패키지관리자입니다.

homebrew 설치는 터미널에서 아래 명령을 복붙하여 실행합니다.

 

 

openjdk 저장소 추가

아래 명령으로 homebrew에 openjdk 저장소를 추가합니다.
 

brew tap AdoptOpenJDK/oepnjdk

 

openjdk 설치

아래 명령을 이용해 openjdk를 설치합니다.
 
 
brew install --cask adoptopenjdk8

반응형
반응형

이 글의 동영상 강의 입니다.

https://youtu.be/BQAR-0JCA7o

 

* 이 글은 아래 사이트를 참조하여 작성하였습니다.

https://docs.nestjs.kr/providers

 

Providers

  • provider는 services, repositories, factories, helpers 등이 있습니다. 
  • provider는 종속성에 의해 Inject(주입)할 수 있습니다.
  • 즉, provider 객체의 생성 및 연결은 nest runtime 시스템에 위임될 수 있습니다.
  • 컨트롤러는 HTTP 요청을 처리하고 복잡한 작업은 Provider에게 위임을 합니다.
  • provider는 module에서 선언하는 일반 javascript class 입니다.

 

Service

다음과 같이 CatsService를 만들어 보겠습니다.

CatsService는 지난 시간에 만든 CatsController에서 사용할 Service이며, 데이터의 조회, 저장, 수정, 삭제를 처리합니다.

서비스는 다음과 같이 generate script를 사용하여 만들 수 있습니다.

nest g service cats

 

cats.service.ts

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}

@Injectable() 데코레이터는 이 class가 Nest IoC 컨테이너에서 관리하는 class 임을 선언하는 것입니다.

 

다음은 CatsService에서 사용한 Cat 인터페이스입니다.

cat.interface.ts

export interface Cat {
  name: string;
  age: number;
  breed: string;
}

이제 CatsController를 다음과 같이 바꿀 수 있습니다.

cats.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

CatsService는constructor를 통해 주입됩니다. private을 사용하면 선언과 초기화가 동시에 이루어 집니다.

 

이상으로 provider의 개념과 service를 만들어보았습니다.

반응형

+ Recent posts