반응형

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

https://youtu.be/5e0axgEP8EE

 

우선 아래 사이트에 가서 Docker를 설치합니다.

https://www.docker.com/get-started

 

Get Started with Docker | Docker

Learn about the complete container solution provided by Docker. Find information for developers, IT operations, and business executives.

www.docker.com

 

다음은 프로젝트 루트 폴더에 다음과 같이 docker-compose.yml을 생성합니다.

version: '3'
services:
  local-db:
    image: library/mysql:5.7
    container_name: local-db
    restart: always
    ports:
      - 13306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Seoul
    volumes:
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/init:/docker-entrypoint-initdb.d
    platform: linux/x86_64

 아래 스크립트를 실행합니다.

docker-compose up -d

설치가 완료되면 Docker Dashboard에 아래와 같이 mysql 이 추가됩니다.

우측의 start 버튼을 클릭하여 서버를 실행합니다.

MySQL Workbench를 이용해서 db에 접속합니다.

접속 정보는 다음과 같습니다.

 

이후로는 MySQL Schema와 사용자를 생성하시면 됩니다.

 

반응형
반응형

맥북에서 무료 FTP 프로그램을 찾아보던 중 CyberDuck이란 프로그램이 있어 설치를 해 보았습니다.

AppStore에는 유료 버전이 올라와 있기 때문에 아래 URL을 통해 설치하였습니다.

https://cyberduck.softonic.kr/mac/download

 

Cyberduck

우아하고 효율적인 무료 FTP 클라이언트

cyberduck.softonic.kr

 

설치 후 실행을 하면 다음과 같은 화면이 나옵니다.

여기서 상단의 새연결을 클릭하면 연결 설정을 할 수 있습니다.

제일 상단의 Selectbox를 클릭하면 접속 형태를 변경할 수 있습니다.

SFTP를 선택할 경우 아래와 같이  SSH 개인키를 설정하는 부분이 추가적으로 보입니다.

AWS의 경우 .pem 형식의 개인키를 지정하시면 됩니다.

완료된 후에 연결 버튼을 클릭하면 접속이 완료됩니다.

반응형
반응형

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

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 버튼을 클릭합니다.

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

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

 

반응형

+ Recent posts