업무(domain)에서만 사용하는 공통함수 만들기
mfe-app-boilerplate 프로젝트는 전역 공통 유틸리티 함수들($ui, $utils, $router 등)을 제공합니다. 그러나 이들 외에도, 각 업무에서만 사용되는 JavaScript 공통 함수가 필요한 경우가 발생할 수 있습니다. 이러한 경우, 다음과 같이 공통 함수를 생성하여 활용합니다.
- 여러가지 방법으로 공통함수를 만들 수 있지만, 여기서는 일반적인 Function 방식과 class 방식 두가지로 알려드립니다.
업무(domain) 전용 공통함수 만들기
- 업무(domain)별 공통함수를 만들기 위해서는
domains그룹 폴더 내부에 있는 각 업무 폴더, 그 하위에common이라는 폴더를 생성합니다. - 해당 업무가 account 업무라고 가정했을 때, 다음과 같은 구조를 가질 수 있습니다.
- account 업무 폴더 내부의
common폴더에 카드 관련 공통 함수 모음인 card-utils.ts 파일을 생성해보겠습니다. 업무 상황에 따라 해당 업무에 맞는 공통 함수 파일을 생성하여 이와 같이 작성하면 됩니다. 여기서는 account 업무의 특정 공통 함수 예시로 설명합니다.
mfe-app-main/
├── src
│ ├── domains
│ │ ├── ...
│ │ └── account # account 업무 폴더
│ │ ├── pages
│ │ │ ├── MainIndex.tsx
│ │ │ └── UsageHistory.tsx
│ │ ├── common # 업무 공통 폴더
│ │ │ └── card-utils.ts # 카드 관련 공통 함수 모음
│ │ ├── components
│ │ │ └── List.tsx
│ │ ├── router
│ │ ├── api
│ │ └── types
│ └── ...
└── ...
설명
- 내가 작업하는 업무는 account 라고 가정한다.
- account 업무의 하위에는 api, components, common, pages, router, store, types폴더를 가질 수 있다.
- account 업무용 JavaScript 공통함수를 만들기 위하여 업무폴더 내부에 common 폴더를 생성하고 그 내부에 card-utils.ts 파일을 생성한다.
Function 방식으로 공통함수 만들기
card-utils.ts 파일 작성
- 카드번호를 마스킹 처리하는 공통함수를 만들어 봅니다.
- 필요한 TypeScript 타입을 정의하고, 카드번호를 마스킹 처리하는 공통함수를 만든 후
export합니다.
/**
* 카드번호 마스킹 옵션 인터페이스
*/
export interface CardMaskOptions {
/** 마스킹 문자 (기본값: '*') */
maskChar?: string;
/** 앞에서 보여줄 자릿수 (기본값: 4) */
visibleStart?: number;
/** 뒤에서 보여줄 자릿수 (기본값: 4) */
visibleEnd?: number;
/** 구분자 (기본값: '-') */
separator?: string;
/** 구분자를 사용할지 여부 (기본값: true) */
useSeparator?: boolean;
}
/**
* 카드번호를 마스킹 처리합니다.
*
* @param cardNumber - 마스킹할 카드번호 (숫자 또는 하이픈 포함 문자열)
* @param options - 마스킹 옵션
* @returns 마스킹된 카드번호
*/
export const maskCardNumber = (
cardNumber: string,
options: CardMaskOptions = {}
): string => {
const {
maskChar = '*',
visibleStart = 4,
visibleEnd = 4,
separator = '-',
useSeparator = true,
} = options;
// 카드번호에서 숫자만 추출
const digitsOnly = cardNumber.replace(/\D/g, '');
// 유효성 검사
if (!digitsOnly || digitsOnly.length < 8) {
return cardNumber; // 유효하지 않은 경우 원본 반환
}
const totalLength = digitsOnly.length;
const maskLength = totalLength - visibleStart - visibleEnd;
// 앞부분, 마스킹 부분, 뒷부분 생성
const startPart = digitsOnly.slice(0, visibleStart);
const maskedPart = maskChar.repeat(Math.max(0, maskLength));
const endPart = digitsOnly.slice(totalLength - visibleEnd);
const masked = startPart + maskedPart + endPart;
// 구분자 추가
if (useSeparator && totalLength >= 16) {
// 4자리씩 구분
return masked.match(/.{1,4}/g)?.join(separator) || masked;
}
return masked;
};
card-utils.ts 파일 사용
import { maskCardNumber } from '@/domains/account/common/card-utils';
// 카드번호 마스킹 처리 함수 사용 -------------------------
const cardNumber = '1234-5678-9012-3456';
const maskedCardNumber = maskCardNumber(cardNumber);
console.log(maskedCardNumber); // 1234-****-****-3456
Class 방식으로 공통함수 만들기
- 카드번호를 마스킹 처리하는 공통함수를 JavaScript Class 방식으로 만들어 봅니다.
- Singleton 패턴으로 JavaScript Class로 구현되어 즉시 인스턴스가 생성됩니다.
- 필요한 TypeScript 타입을 정의하고, Class 인스턴스를
export합니다.
card-utils.ts class 파일 작성
// account 업무에서만 사용하는 공통 util을 모아놓은 JavaScript class.
export default new (class CardUtils {
// 만들고자 하는 함수를 만든다.
/**
* 카드번호를 마스킹 처리합니다.
*
* @param cardNumber - 마스킹할 카드번호 (숫자 또는 하이픈 포함 문자열)
* @param options - 마스킹 옵션
* @returns 마스킹된 카드번호
*/
maskCardNumber(
cardNumber: string,
options: CardMaskOptions = {}
): string {
// 만든 공통함수의 로직 구현...(생략)
return `[CardUtils][maskCardNumber]함수:: ${cardNumber}, ${options}`;
}
// ... 다른 함수 계속 추가 ...
})();
// 업무 화면에서 사용할 때는 아래와 같이 import해서 사용한다.
//import CardUtils from '@/domains/account/common/card-utils';
//CardUtils.maskCardNumber('1234567812345678');
card-utils.ts class 파일 사용
import CardUtils from '@/domains/account/common/card-utils';
// 카드번호 마스킹 처리 함수 사용 -------------------------
const cardNumber = '1234-5678-9012-3456';
const maskedCardNumber = CardUtils.maskCardNumber(cardNumber);
console.log(maskedCardNumber); // 1234-****-****-3456