axios 를 이용해서 우아하게 파라미터 넘기기

axios 를 이용해서 우아하게 파라미터 넘기기
Photo by Caspar Camille Rubin / Unsplash

GET 메서드는 파라미터를 query string으로 넘깁니다

  • 위 그림의 parameters는 query string 이라고도 부릅니다

데이터 조회 시 파라미터 넘기기

type FactoryParams = {
  size: number;
  page: number;
  companyId?: string;
  factoryName?: string;
  enabled?: boolean;
  sort?: string | string[];
}
export async function getFactories({
  companyId,
  factoryName,
  enabled,
  page,
  size,
  sort,
}: FactoryParams) {
  const queryParams = [];

  if (companyId !== '') {
    queryParams.push(`companyId=${companyId}`);
  }
  if (factoryName !== '') {
    queryParams.push(`factoryName=${factoryName}`);
  }
  if (enabled !== '') {
    queryParams.push(`enabled=${enabled}`);
  }
  if (sort && sort.length > 0) {
    if (Array.isArray(sort)) {
      const sortQueryString = sort.map((s) => `sort=${s}`).join('&');
      queryParams.push(sortQueryString);
    } else {
      queryParams.push(`sort=${sort}`);
    }
  }

  queryParams.push(`page=${page}`);
  queryParams.push(`size=${size}`);

  const queryString = queryParams.join('&');
  const url = `/api/factories?${queryString}`;

  return await axios.get<FactoryResult>(url).then((response) => response.data);
}
  • 파라미터 중 일부는 옵셔널이지만 기본 값으로 빈 문자열('')을 사용하고 있습니다
  • axios.get(url, { params: { ...파라미터 }}) 와 같이 axios get 메서드 옵션의 params 필드를 사용할 수 있지만
    기본값이 그대로 전달되는 경우 /api/factories?companyId=&factoryName= 와 같이 빈 문자열이 그대로 쿼리 스트링에 포함이 되었고 원치않는 응답이 전달되었습니다
  • 따라서 위와 같이 쿼리 스트링을 직접 만들어서 조합하는 코드가 삽입되었습니다

빈 파라미터를 제거하고 우아하게 리팩터링하기

  • PR을 올렸을 때 중첩된 if 문에 대한 수정요청이 있었습니다
  • 그리고 빈 파라미터를 제거하는 유틸함수를 만들고 get 메서드 옵션 중 params 필드로 넘겨서 리팩터링을 해보았습니다
// 빈 파라미터를 제거하는 유틸함수
export const removeEmptyField = <T extends Record<string, unknown>>(obj: T) => {
  return Object.fromEntries(
    Object.entries(obj).filter(([, v]) => {
      if (v === null || v === undefined || v === '') {
        return false;
      }
      if (Array.isArray(v) && v.length === 0) {
        return false;
      }
      return true;
    }),
  ) as T;
};
export async function getFactories(params: FactoryParams) {
  return await axios
    .get<FactoryResult>('/api/factories', {
      params: removeEmptyField(params),
      paramsSerializer: {
        indexes: null,
      },
    })
    .then((response) => response.data);
  • 위와 같이 params를 removeEmptyField함수로 감싸면 if 문을 사용하지 않고 빈문자열 필드 없이 파라미터를 넘길 수 있습니다
  • sort 파라미터의 경우 string[] 과 같이 배열으로 전달될 수 있는데 이 때 paramsSerializer 필드에 위와 같이 indexes: null을 전달해야 올바르게 쿼리스트링이 만들어집니다

Read more

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

들어가며 [시리즈1]에서는 프로세스 내부 메시지 큐를 다뤘습니다. 이번엔 네트워크 메시지 큐인 RabbitMQ를 다룹니다. RabbitMQ 공식 문서나 기술 블로그는 많지만, 실무에서 어떻게 사용하는지에 대한 글은 의외로 적습니다. "Producer가 뭐고 Consumer가 뭔지는 알겠는데, 그래서 실제로는 어떻게 쓰는데?" 이번 글에서는 우리 MES 시스템에서 RabbitMQ를 어떻게 활용하고 있는지 실제 코드와 함께 공유합니다. 우리

By Jeonggil
[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

들어가며 이 글은 "실무로 배우는 메시지 큐" 시리즈의 첫 번째 글입니다. 실무에서 발견한 문제를 해결하는 과정에서, IME 입력 문제와 해결 과정을 공유합니다. 메시지 큐는 RabbitMQ, Kafka 같은 네트워크 레벨만 있는 게 아닙니다. 우리가 매일 쓰는 Windows 애플리케이션도 메시지 큐 기반으로 동작합니다. * 시리즈1 (이 글): 프로세스 내부의 메시지 큐 - Windows

By Jeonggil
[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

이 글은 1편 - 그림으로 풀어낸 SaaS 알림 시스템의 후속편입니다. 들어가며 1편에서는 설비 연속 OFF 알림 기능의 핵심 로직과 어떤식으로 해결했는지 그림으로 알아봤습니다. 이번 글에서는 실무에서 마주한 진짜 고민들을 공유합니다: * 왜 3개의 새로운 테이블이 필요했나? * 어떻게 확장 가능한 구조를 만들었나? * SMS 14원짜리 알림이 왜 무서운가? * 운영 레벨로 나가기까지 무엇을 준비했나?

By Jeonggil
[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

들어가며 제조업 IoT 플랫폼에서 N대 이상의 설비를 실시간으로 모니터링하고, 설비가 연속으로 꺼졌을 때 담당자에게 즉시 알림을 보내는 기능을 개발하게 되었습니다. 데이터는 실시간으로 쌓이지만, 설비이상을 체크하는 스케줄러 주기는 1분으로 설정하였습니다. 시스템 아키텍처 기존 인프라와 Push 기능은 이미 구축되어 있었습니다. 저는 중간에 들어가는 Alert Scheduler만 구현하면 되는 상황이었습니다. ┌──────────────────────────────────────────────────────────┐ │ 설비 IoT 센서 (실시간)

By Jeonggil