Skip to content

Latest commit

 

History

History
90 lines (66 loc) · 4.34 KB

README.ko.md

File metadata and controls

90 lines (66 loc) · 4.34 KB

jin-frame

ts Download Status Github Star Github Issues NPM version License ci codecov code style: prettier

Reusable HTTP request definitation library

Why jin-frame?

RESTful API는 GraphQL, gRPC, tRPC 등 다양한 프로토콜이 있는 지금도 가장 인기 있는 API 구현 방식입니다. iOS, Android, Web 등 다양한 플랫폼에서 사용할 수 있는 API를 쉽게 개발할 수 있습니다. 하지만 RESTful API 수가 많아 질 수록 API를 사용하기 위한 코드를 작성하는 작업은 반복적이고 지루합니다. 여러 프로젝트에서 재사용 가능하게 만드는 작업은 쉽지 않고, 이를 별도 패키지로 다수 프로젝트에서 사용하는 것은 더 어렵습니다.

jin-frame은 이러한 RESTful API를 간결하고 명확하게 정의하고 별도 패키지로 분리하여 여러 프로젝트에서 재사용하는 것을 목표로 개발된 확장 가능한 RESTful API 정의 시스템 입니다.

  1. API 파라미터에 타입 체크
  2. OOP 디자인을 활용한 API 정의 확장
  3. Axios 에코 시스템 활용
  4. ctix를 활용한 별도 패키지 구축

Requirements

  1. TypeScript
  2. Reflect-Metadata
    • tsconfig.json > experimentalDecorators, emitDecoratorMetadata 옵션 활성화

Install

npm i jin-frame --save

Useage

class TestPostQuery extends JinFrame {
  @JinFrame.param()
  public readonly passing: string;

  @JinFrame.body({ key: 'test.hello.marvel.name' })
  public readonly name: string;

  @JinFrame.header({ key: 'test.hello.marvel.skill' })
  public readonly skill: string;

  @JinFrame.body({ key: 'test.hello.marvel.gender' })
  public readonly gender: string;

  constructor(name: string, skill: string) {
    super({ ...args, host: 'http://some.api.yanolja.com/jinframe/:passing', method: 'POST' });
  }
}

이 클래스는 다음과 같은 axios 요청을 생성합니다.

const query = new TestPostQuery('ironman', 'beam');
console.log(query.request());
{
  timeout: 2000,
  headers: { test: { hello: { marvel: { skill: 'beam' } } }, 'Content-Type': 'application/json' },
  method: 'POST',
  data: { test: { hello: { marvel: { name: 'ironman', gender: 'male' } } } },
  transformRequest: undefined,
  url: 'http://some.api.yanolja.com/jinframe/pass',
  validateStatus: () => true
}

이름이나 스킬을 변경하더라도 일정하게 요청 객체가 생성됩니다. timeout, transformRequest, validateStatus 등 다양한 부분을 자동으로 생성하며 실수하기 쉬운 data, headers 에서 depth 역시 올바르게 생성합니다. 이 객체를 여러 번 생성하더라도 JinFrame은 실수를 하지 않고 언제나 올바른 객체를 생성할 것입니다.

실행하는 과정도 단순합니다. 요청을 보내는 함수를 생성하고 실행하면 나머지 작업은 모두 JinFrame이 작업합니다. 물론 이 과정은 모두 axios를 사용하기 때문에 브라우저에서도 잘 동작합니다.

const query = new TestPostQuery('ironman', 'beam');
const requester = query.create();

const res = await requester();

만약 my-only-either를 사용한다면 JinEitherFrame를 사용해서 Either 인터페이스를 사용할 수도 있습니다.