Useful npm Libaraies

succeeding·2022년 10월 8일

유용한 npm 라이브러리 리스트를 적어둔 문서. 내가 정리해둔 문서가 있다면 제목에 링킹을 해두었다.

dotenv

환경 변수를 .env 파일에서 설정한대로 설정해주는 라이브러리

  • override는 default로 false 이다. 즉, 이미 셋팅된 환경 변수는 수정하지 않는다. 옵션으로 true로 설정할 수 있다.
require('dotenv').config({ override: true })

dotenv-flow

아래 순서로 덮어쓰기 방식으로 process.env 프로퍼티 값을 설정한다.

.env => .env.local => .env.${NODE_ENV} => .env.${NODE_ENV}.local

.env.local 파일은 ${NODE_ENV} 값이 설정됐을 때 완전 대체되기를 권장한다. 즉, .env.local 파일은 정말 local에서만 사용.

dotenv-flow는 dotenv와 마찬가지로 CLI에서 설정된 값을 오버라이딩하지 않는다.

dotenv-flow를 이용한 NODE_ENV 환경변수 핸들링

NODE_ENV가 다음의 값을 갖는다고 해보자

  • local-test: 로컬에서 테스트하는 환경
  • qa: QA 환경
  • production: 실제 애플리케이션 운영 환경

local-test 이외의 환경변수들은 도커 등을 이용해서 배포하는 과정에서 NODE_ENV를 비롯한 기타 환경변수를 주입받는다고 하자. 그렇담 로컬 테스트 환경에서만 NODE_ENV값을 local-test으로 잘 설정해주면 된다.

이것을 dotenv-flow를 이용하자면,

  • .env: 모든 환경에서 공통으로 사용되는 환경변수를 설정하고, 여기에서 NODE_ENV=local-test로 설정한다. 이미 설정된 환경변수에 대해서 오버라이딩을 허용하지 않으니, 의도한대로 로컬 테스트환경에서만 해당 값이 설정된다.
  • .env.local: local-test 환경에서 필요한 설정값을 설정하되, 다른 환경에서 해당 값을 모두 대체할 것을 권장한다.

jest

node 소스 코드 테스트 본좌급인듯?

mysql

This is a node.js driver for mysql. await를 공식적으로 구현하지 않았다. 아마 mysql2라는 모듈이 이를 지원하는 듯한데, postgresql을 주로 사용하게 되면서 사용안하게 되었다.

mutexify

뮤텍스 알고리즘을 구현한 라이브러리. 굳이 구현하지말고 이거 쓰자.

const mutexify = require('mutexify/promise')

const fooLock = mutexify()

function foo() {
  const fooRelease = await fooLock() // lock을하고 release함수를 리턴하는 듯
  // main logic
  fooRelease()
}
  • 참고로 라이브러리의 소스코드가 길지 않고 구현 로직이 흥미로웠던 기억이 있다. 궁금하거나 심심할 때 다시 보는 것도 나쁘지 않을듯.

nock

테스트 시 모의 HTTP 응답을 만듬. 실제 HTTP 엔드 포인트를 두지 않고 유닛 테스트를 할 수 있게 해줌.

ts-aspect

ts에서 AOP(Aspect Oriented Programming) 구현한 라이브러리

my sample code

import {Advice, Aspect} from 'ts-aspect'
import {AspectContext} from 'ts-aspect/build/aspect.interface'
import {UseAspect} from 'ts-aspect/build/decorator/UseAspect'


class LogAspect implements Aspect {
  execute(ctx: AspectContext): void {
    if (ctx.error) {
      console.error(ctx.error)
    }
    console.log(ctx)
    return ctx.returnValue
  }
}

class Calculator {
  @UseAspect(Advice.AfterReturn, LogAspect)
  public add(a: number, b: number): number {
    return a + b
  }

  @UseAspect(Advice.AfterReturn, LogAspect)
  public divide(a: number, b: number): number {
    if (b === 0) {
      throw new Error('Division by zero!')
    }
    return a / b
  }
}

const calculator = new Calculator()
const addResult = calculator.add(130, 37)
const divideResult = calculator.divide(1, 0)

print

{
  target: Calculator {},
  methodName: 'add',
  functionParams: [ 130, 37 ],
  returnValue: 167,
  error: null
}
d:\_\aspect.ts:29
      throw new Error('Division by zero!')
            ^
Error: Division by zero!

zod

TypeScript-first schema validation with static type inference

ts판 joi라고 보면 될 듯

  • required가 default로 적용
  • infer 라는 메서드로 스키마에서 타입을 생성할 수 있다. 유용할 듯! 코드 출처
// all properties are required by default
const Dog = z.object({
  name: z.string(),
  age: z.number(),
});

// extract the inferred type like this
type Dog = z.infer<typeof Dog>;

// equivalent to:
type Dog = {
  name: string;
  age: number;
};

0개의 댓글