본문 바로가기
WIKI 기술 지식 베이스

ADR013: [대체됨] HTTP 가져오기 라이브러리의 올바른 사용

원문 보기 위키 갱신

대체됨

출처: 문서

본문

대체됨

이 ADR은 ADR014로 대체되었으며 더 이상 적용되지 않습니다.

맥락

여러 HTTP 패키지를 데이터 가져오기에 사용하면, 해당 패키지를 최신 상태로 유지하는 복잡성과 지원 부담이 늘어납니다.

결정

백엔드(node) 패키지는 HTTP 데이터 가져오기에 node-fetch 패키지를 사용해야 합니다. 예:

import fetch from 'node-fetch';import { ResponseError } from '@backstage/errors';const response = await fetch('https://example.com/api/v1/users.json');if (!response.ok) {  throw await ResponseError.fromResponse(response);}const users = await response.json();

프론트엔드 플러그인과 패키지는 fetchApiRef를 사용하는 것을 선호해야 합니다. 내부적으로 cross-fetch를 사용합니다. 예:

import { useApi } from '@backstage/core-plugin-api';// Inside some functional React component...const { fetch } = useApi(fetchApiRef);const response = await fetch('https://example.com/api/v1/users.json');if (!response.ok) {  throw await ResponseError.fromResponse(response);}const users = await response.json();

동형(isomorphic) 패키지는 모킹과 타입 정의를 위해 cross-fetch 패키지에 의존해야 합니다. 바람직하게는, 동형 패키지의 클래스와 함수가 typeof fetch 타입의 인자를 받아 호출자가 선호하는 fetch 구현을 제공할 수 있게 해야 합니다. 이렇게 하면 호출자들이 인증이나 기타 정보를 호출에 덧붙이고, 크로스 플랫폼 방식으로 메트릭 등을 추적할 수 있습니다. 예:

import crossFetch from 'cross-fetch';export class MyClient {  private readonly fetch: typeof crossFetch;  constructor(options: { fetch?: typeof crossFetch }) {    this.fetch = options.fetch || crossFetch;  }  async users() {    return await this.fetch('https://example.com/api/v1/users.json');  }}

결과

axios, got 등의 서드파티 패키지에서 점진적으로 벗어날 것입니다. node-fetch로 전환한 후에는 이 결정을 강제하는 lint 규칙을 추가할 것입니다.

더 알아보기 (Learn more)