“코드를 단순하게, 버그는 적게.”
자바스크립트 개발자라면 한 번쯤 반드시 만나게 되는 유틸리티 라이브러리들을, 기본부터 전문가 수준까지 깊이 있게 다뤄봅니다.
JavaScript는 빠르게 진화하는 언어이지만, 반복적인 데이터 조작·날짜 계산·포맷 처리 등을 효율적으로 다루기 위해 다양한 유틸리티 라이브러리가 등장했습니다.
이 문서는 다음을 다룹니다.
Lodash(_)는 Underscore.js의 개선 버전으로, 배열·객체·문자열·함수 조작을 간결하게 처리할 수 있는 유틸리티 모음입니다.
// Lodash 예제
_.uniq([1, 2, 2, 3]); // [1, 2, 3]
_.flattenDeep([1, [2, [3]]]); // [1, 2, 3]
_.get(obj, 'user.name', 'N/A');ES6 이후 Array.prototype.map, Object.assign, Set 등이 생기면서 일부 기능은 내장으로 대체됩니다.
| Lodash | ES6 대체 | 설명 |
|---|---|---|
_.map(arr, fn) |
arr.map(fn) |
배열 변환 |
_.filter(arr, fn) |
arr.filter(fn) |
조건 필터링 |
_.uniq(arr) |
[...new Set(arr)] |
중복 제거 |
➡️ 그러나 Lodash는 여전히 “깊은 객체 접근”(_.get), “딥 클론”(_.cloneDeep) 등 복잡한 작업에서 유리합니다.
가장 널리 사용된 날짜 라이브러리입니다.
moment().format('YYYY-MM-DD HH:mm');
moment('2025-11-12').fromNow(); // "3 days ago"Moment와 99% 호환되지만 2KB 이하의 경량 버전입니다.
dayjs().add(3, 'day').format('YYYY/MM/DD');Moment처럼 “체이닝”이 아닌 “모듈 함수 호출” 방식입니다.
import { format, addDays } from 'date-fns';
format(addDays(new Date(), 3), 'yyyy-MM-dd');📊 비교 요약
| 항목 | Moment.js | Day.js | date-fns |
|---|---|---|---|
| 크기 | 약 60KB | 2KB | 20KB |
| 체이닝 | 지원 | 지원 | 미지원 |
| 타임존 | moment-timezone 필요 | 플러그인 | 별도 |
| 트렌드 | 유지보수 중단 | 최신 대세 | 함수형 선호 |
숫자 포맷팅 전문 라이브러리.
numeral(12345.6789).format('0,0.00'); // "12,345.68"
numeral(0.25).format('0%'); // "25%"통화 중심 포맷팅.
accounting.formatMoney(1234567.89, "₩"); // "₩1,234,567.89"유저 입력값을 검증할 때 강력합니다.
validator.isEmail('test@example.com'); // true
validator.isURL('https://openai.com'); // true📌 실제로는 폼 검증 로직이나 API 요청 데이터 유효성 검사에 사용됩니다.
URL 쿼리 스트링을 객체로 파싱하거나 문자열로 직렬화할 때 사용합니다.
qs.parse('a=1&b=2'); // { a: '1', b: '2' }
qs.stringify({ a: 1 }); // 'a=1'💡 ES6의
URLSearchParams로도 대체 가능하지만, 중첩 객체나 배열 처리에서는qs가 더 강력합니다.
비동기 제어 플로우를 단순화합니다.
async.parallel([
cb => fetchData(cb),
cb => readFile(cb)
], (err, results) => { ... });Axios는 interceptors, transformResponse, cancelToken 등 비동기 흐름 제어용 유틸리티를 내장하고 있습니다.
반응형 프로그래밍의 정점. Observable 기반으로 이벤트 스트림을 다룹니다.
import { fromEvent } from 'rxjs';
fromEvent(document, 'click').subscribe(() => console.log('Clicked!'));Ramda는 “불변성”과 “함수 조합”에 초점을 맞춘 라이브러리입니다.
import * as R from 'ramda';
const getActiveNames = R.pipe(
R.filter(R.propEq('active', true)),
R.map(R.prop('name'))
);Lodash-fp는 Lodash를 Ramda 스타일의 커링/불변 버전으로 포장한 라이브러리입니다.
| 목적 | 추천 라이브러리 | 비고 |
|---|---|---|
| 배열/객체 조작 | Lodash / Underscore | 유지보수 쉬움 |
| 날짜 처리 | Day.js / date-fns | 경량 & 최신 |
| 숫자/화폐 | Numeral.js / accounting.js | 국제화 대응 |
| 폼 검증 | validator.js | 보안 필수 |
| URL 파싱 | qs | 복잡한 쿼리 대응 |
| 함수형 패턴 | Ramda | 코드 품질 향상 |
현대 JavaScript에서는 많은 유틸리티가 언어 내장 기능으로 대체되고 있습니다.
예시:
// Lodash: _.cloneDeep(obj)
structuredClone(obj);
// Moment.js: moment().add(1, 'day')
const tomorrow = new Date(Date.now() + 24 * 60 * 60 * 1000);그러나 대형 프로젝트, 팀 협업, 레거시 코드 유지보수 환경에서는 여전히 유틸리티 라이브러리가 일관된 코드 품질과 가독성을 제공합니다.
✨ 요약:
JavaScript 유틸리티는 단순한 편의 도구가 아니라, 코드의 구조적 안정성과 유지보수성을 확보하는 핵심 도구입니다.
ES6의 발전으로 일부는 대체되었지만, “명확성”과 “일관성”의 가치를 고려하면, 올바른 유틸리티 선택은 여전히 필수입니다.
