RISK IT

[TIL11_23.1.19.] [Node] Express 초기 환경세팅 중 javascript 및 typeorm 구문 분석 본문

IT/TIL

[TIL11_23.1.19.] [Node] Express 초기 환경세팅 중 javascript 및 typeorm 구문 분석

nomoremystery 2023. 1. 19. 13:12
반응형

Javasciprt 구문 분석

전체 소스코드

// third-party module
require('dotenv').config(); // 환경변수 사용

const express = require('express');

const cors = require('cors');

const morgan = require('morgan');

const { DataSource } = require('typeorm');

const mysqlDataSource = new DataSource({
  type: process.env.TYPEORM_CONNECTION,
  host: process.env.TYPEORM_HOST,
  port: process.env.TYPEORM_PORT,
  username: process.env.TYPEORM_USERNAME,
  password: process.env.TYPEORM_PASSWORD,
  database: process.env.TYPEORM_DATABASE,
});

mysqlDataSource
  .initialize()
  .then(() => {
    console.log('Data Source has been initialized!');
  })
  .catch((err) => {
    console.error('Error during Data Source initialization', err);
    mysqlDataSource.destroy();
  });

const app = express();
const PORT = process.env.PORT;

app.use(cors());
app.use(morgan('dev'));
app.use(express.json());

// health check
app.get('/ping', (req, res) => {
  res.status(200).json({ message: 'pong' });
});

const start = async () => {
  try {
    app.listen(PORT, () => console.log(`Server is listening on ${PORT}!!`));
  } catch (err) {
    console.error(err);
  }
};

start();

Javascript 구문 분석

// third-party module
require('dotenv').config(); // 환경변수 사용

const express = require('express');

const cors = require('cors');

const morgan = require('morgan');

const { DataSource } = require('typeorm');
// built-in module, custom module은 없으니 생략

모듈은 built-in module, third-party module, custom module이 존재한다.
모듈의 순서를 조정하여 코드의 가독성을 높일 수 있다.

  1. built-in module
  2. third-party module
  3. custom module
const mysqlDataSource = new DataSource({
  // 변수명 변경
  type: process.env.TYPEORM_CONNECTION,
  host: process.env.TYPEORM_HOST,
  port: process.env.TYPEORM_PORT,
  username: process.env.TYPEORM_USERNAME,
  password: process.env.TYPEORM_PASSWORD,
  database: process.env.TYPEORM_DATABASE,
});

mysqlDataSource의 변수명을 원래의 myDataSource에서 변경하였다.
"my"라는 용어는 예제 코드에서는 사용할 수 있으나 실제 코드에서는 피해야 하기 때문이다.

const start = async () => {
  try {
    app.listen(PORT, () => console.log(`Server is listening on ${PORT}!!`));
  } catch (err) {
    console.error(err);
  }
};

start(); // 에러 출력 실행

console.error()

console.error() 메서드는 웹 콘솔에 에러 메시지를 출력한다.

try...catch

동작 알고리즘

  1. 먼저, try {...} 안의 코드가 실행됩니다.
  2. 에러가 없다면, try 안의 마지막 줄까지 실행되고, catch 블록은 건너뜁니다.
  3. 에러가 있다면, try 안 코드의 실행이 중단되고, catch(err) 블록으로 제어 흐름이 넘어갑니다. 변수 err(아무 이름이나 사용 가능)는 무슨 일이 일어났는지에 대한 설명이 담긴 에러 객체를 포함합니다.

Promise

Promise 객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다.

Promise는 프로미스가 생성된 시점에는 알려지지 않았을 수도 있는 값을 위한 대리자로, 비동기 연산이 종료된 이후에 결과 값과 실패 사유를 처리하기 위한 처리기를 연결할 수 있습니다. 프로미스를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있습니다. 다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)을 반환합니다.
Promise는 다음 중 하나의 상태를 가집니다.

  • 대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
  • 이행(fulfilled): 연산이 성공적으로 완료됨.
  • 거부(rejected): 연산이 실패함.

대기 중인 프로미스는 값과 함께 이행할 수도, 어떤 이유(오류)로 인해 거부될 수도 있습니다. 이행이나 거부될 때, 프로미스의 then 메서드에 의해 대기열(큐)에 추가된 처리기들이 호출됩니다. 이미 이행했거나 거부된 프로미스에 처리기를 연결해도 호출되므로, 비동기 연산과 처리기 연결 사이에 경합 조건은 없습니다.

async function

function 앞에 async를 붙이면 해당 함수는 항상 프라미스를 반환합니다. 프라미스가 아닌 값을 반환하더라도 이행 상태의 프라미스(resolved promise)로 값을 감싸 이행된 프라미스가 반환되도록 합니다.

참고링크-promise
참고링크-express공식문서

TypeORM 구문분석

const { DataSource } = require('typeorm');

const mysqlDataSource = new DataSource({
  type: process.env.TYPEORM_CONNECTION,
  host: process.env.TYPEORM_HOST,
  port: process.env.TYPEORM_PORT,
  username: process.env.TYPEORM_USERNAME,
  password: process.env.TYPEORM_PASSWORD,
  database: process.env.TYPEORM_DATABASE,
});

mysqlDataSource
  .initialize()
  .then(() => {
    console.log('Data Source has been initialized!');
  })
  .catch((err) => {
    console.error('Error during Data Source initialization', err); // 에러 메시지와 에러 출력
    mysqlDataSource.destroy();
  });

Creating a new DataSource

새로운 DataSource 인스턴스를 만들기 위해, 새로운 데이터 소스를 호출하고 전역 변수에 사용할 애플리케이션을 할당함으로써 constructor를 초기화해야 한다.

initialize()

.initialize()는 데이터 소스를 초기화하고 데이터베이스로의 연결 풀을 오픈한다.

then()과 catch()

.then()promise의 resolve
Promise에서는 resolve시에는 .then()으로, reject시에는 .catch()로 값을 처리한다.

destroy()

.destroy()는 데이터 소스를 삭제하고 모든 데이터베이스 연결을 종료한다. 보통 애플리케이션을 종료시킬 때 이 메소드를 호출한다.

참고링크-typeorm

참고링크-promise-catch,then

반응형