JavaScript에서의 다양한 유틸리티 함수 구현

배열 내포함 여부 확인

하나의 배열이 다른 배열을 완전히 포함하는지 확인하는 방법입니다.


const isSubset = (arr1, arr2) => arr2.every(item => arr1.includes(item));

이벤트 버스 활용

이벤트를 전송하고 수신하는 방법입니다.


// 이벤트 발송
this.$bus.$emit('data-change', { field: 'value', key: 'uniqueKey' });

// 이벤트 수신
this.$bus.$on('data-received', data => {
  this.fieldName = data.field;
});

// 컴포넌트 파괴 시 리스너 해제
this.$bus.$off('data-received');

프록시를 사용한 변경 감지

객체의 속성이 변경될 때 특정 로직을 실행합니다.


const obj = new Proxy({}, {
  set(target, prop, value) {
    if (['type', 'formId', 'approvalId'].includes(prop) && target[prop] !== value) {
      handleUpdate(value, prop).then(() => target[prop] = value);
    } else {
      target[prop] = value;
    }
    return true;
  }
});

전역 컴포넌트 등록

모든 Vue 인스턴스에서 사용할 수 있도록 컴포넌트를 등록합니다.


import Vue from 'vue';
const registerComponents = [require.context('./components', true, /\.vue$/)];
registerComponents.forEach(context => {
  context.keys().forEach(key => Vue.component(context(key).default.name, context(key).default));
});

트리 구조 처리

다층 트리 구조에서 데이터 필터링 및 선택 가능성을 제어합니다.


function filterTree(data, allowedIds, selectedPath) {
  const filteredData = [];
  data.forEach(item => {
    if (allowedIds.some(idList => idList[item.id])) {
      filteredData.push({ ...item, childList: filterTree(item.childList, allowedIds, selectedPath) });
    } else if (selectedPath === item.id) {
      filteredData.push({ ...item, disabled: true });
    }
  });
  return filteredData;
}

드래그 앤 드롭에서 클릭 이벤트 추가

드래그 중 클릭 이벤트가 작동하지 않는 문제를 해결하기 위한 메서드입니다.


function manualAddComponent(component) {
  // 추가 로직 작성
}

숫자 포맷팅

숫자에 콤마를 추가하여 가독성을 높입니다.


function formatNumber(num) {
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}

Blob 관련 변환

Blob과 관련된 다양한 변환 작업을 수행합니다.


// Blob -> File
function convertBlobToFile(blob) {
  return new File([blob], 'example.txt', { type: blob.type });
}

// Base64 -> Blob
function base64ToBlob(base64String) {
  const byteString = atob(base64String.split(',')[1]);
  const mimeString = base64String.split(',')[0].match(/:(.*?);/)[1];
  const intArray = Uint8Array.from(byteString, c => c.charCodeAt(0));
  return new Blob([intArray], { type: mimeString });
}

// Blob -> ArrayBuffer
function blobToArrayBuffer(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = () => reject(reader.error);
    reader.readAsArrayBuffer(blob);
  });
}

// Blob -> Base64
function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result);
    reader.onerror = () => reject(reader.error);
    reader.readAsDataURL(blob);
  });
}

UUID 생성

임의의 UUID를 생성합니다.


function generateUUID() {
  return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  );
}

AES 암호화 관련 작업

AES 키 생성 및导출 작업을 수행합니다.


async function createAesKey() {
  return await crypto.subtle.generateKey(
    { name: 'AES-GCM', length: 256 },
    true,
    ['encrypt', 'decrypt']
  );
}

async function exportAesKey(key) {
  return await crypto.subtle.exportKey('raw', key);
}

이미지 회전

Base64 형식의 이미지를 지정된 각도로 회전시킵니다.


function rotateImage(base64, angle) {
  return new Promise((resolve, reject) => {
    if (angle % 90 !== 0) return reject('각도는 반드시 90의 배수여야 합니다.');

    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const img = new Image();

    img.src = base64;
    img.onload = () => {
      const quadrant = Math.floor(angle / 90) % 4;
      canvas.width = canvas.height = Math.max(img.width, img.height);

      ctx.translate(canvas.width / 2, canvas.height / 2);
      ctx.rotate((angle * Math.PI) / 180);
      ctx.drawImage(img, -img.width / 2, -img.height / 2);

      resolve(canvas.toDataURL());
    };
  });
}

PDF 생성

HTML 노드를 PDF로 변환합니다.


async function htmlToPdf(node) {
  const canvas = await html2canvas(node);
  const pdf = new jsPDF();
  const imgData = canvas.toDataURL('image/jpeg');

  pdf.addImage(imgData, 'JPEG', 0, 0, 210, 297);
  return pdf.output('blob');
}

태그: JavaScript Vue.js AES FileHandling canvas

6월 20일 21:09에 게시됨