- 1 1. 소개
- 2 2. Underscore.js란?
- 3 3. 설치 방법
- 4 4. 기본 사용법
- 5 5. 고급 사용법
- 6 6. 객체 작업
- 7 7. 함수 작업
- 8 8. 유틸리티 함수
- 9 9. 결론
- 10 자주 묻는 질문 (FAQ)
- 10.1 Q1: Underscore.js는 무료로 사용할 수 있나요?
- 10.2 Q2: Underscore.js와 Lodash의 차이점은 무엇인가요?
- 10.3 Q3: 현대 JavaScript (ES6+)에서 Underscore.js는 불필요한가요?
- 10.4 Q4: Underscore.js에 가장 적합한 프로젝트 유형은 무엇인가요?
- 10.5 Q5: Underscore.js를 어떻게 설치하나요?
- 10.6 Q6: 공식 문서는 어디에서 찾을 수 있나요?
- 10.7 Q7: Underscore.js를 대규모 프로젝트에서 사용할 수 있나요?
- 10.8 Q8: 함수 실행을 제어하는 다른 방법이 있나요?
- 10.9 Q9: Underscore.js 사용 시 주의할 점이 있나요?
- 10.10 Q10: _.template()을 템플릿 엔진으로 권장하나요?
1. 소개
JavaScript는 웹 개발에 필수적인 프로그래밍 언어이지만, 배열과 객체를 다루다 보면 코드가 복잡해지는 경우가 많습니다. 특히 데이터를 필터링하거나 변환하는 작업에서는 간결하고 효율적인 코드가 매우 필요합니다. 이때 JavaScript 라이브러리 Underscore.js가 도움이 됩니다. 이 라이브러리를 사용하면 복잡한 데이터 조작 코드를 간단하게 작성할 수 있습니다.
Underscore.js의 장점
- 코드가 깔끔해짐
- 전통적인 JavaScript에서는 특정 작업이 장황해지기 쉬우나, Underscore.js를 사용하면 몇 줄만으로 작성할 수 있습니다.
- 다양한 유틸리티 함수 제공
- 배열 조작, 객체 처리, 함수 제어 등 다양한 기능을.
- 경량 및 유연함
- 필요한 함수만 사용하여 성능 오버헤드를 최소화할 수 있습니다.
이 글에서 배울 내용
- Underscore.js 설정 방법
- 기본 함수와 실용 예제
- 실제 개발에서의 활용 사례
2. Underscore.js란?
Underscore.js 개요
Underscore.js는 데이터 조작을 간소화하도록 설계된 경량 JavaScript 라이브러리입니다. 주로 배열과 객체를 효율적으로 다루기 위한 다양한 유틸리티 함수를 제공하며, 흔히 JavaScript 유틸리티 툴킷이라고도 불립니다. JavaScript 자체에도 강력한 내장 기능이 있지만, 코드가 길어지거나 읽기 어려워질 때가 있습니다. Underscore.js를 사용하면 이러한 문제를 해결하고 더 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있습니다.
주요 기능
- 포괄적인 유틸리티 함수
- 배열 조작, 객체 처리, 함수 제어 등을 포함한 다양한 함수를 제공합니다.
- 단순하고 가독성 높은 코드
- 전통적인 JavaScript에 비해 보일러플레이트를 줄이고 가독성을 향상시킵니다.
- 의존성 없음
- 다른 라이브러리에 의존하지 않아 통합이 유연합니다.
- 경량 및 빠름
- 작은 크기와 최소한의 성능 영향을 가지고 있어 최신 웹 애플리케이션에도 적합합니다.
Underscore.js와 Lodash 비교
Underscore.js와 자주 비교되는 라이브러리는 Lodash입니다. Lodash는 Underscore.js를 기반으로 만들어졌으며 기능을 확장했습니다. 다음은 주요 차이점입니다:
| Feature | Underscore.js | Lodash |
|---|---|---|
| Functionality | Provides many basic utility functions | Expanded functionality with more features |
| Modular Support | Partially supported | Fully modular |
| Performance | Fast | Fast and further optimized |
어떤 것을 선택할지는 프로젝트 요구사항에 따라 다릅니다. 간단하고 경량인 라이브러리가 필요하다면 Underscore.js가 더 적합합니다.
Underscore.js가 유용한 경우
Underscore.js는 다음과 같은 상황에서 빛을 발합니다:
- 배열 작업
- 간결한 문법으로 필터링, 매핑 등 다양한 배열 작업을 수행합니다.
- 객체 처리
- 키와 값 조회, 객체 속성 병합 등을 손쉽게 할 수 있습니다.
- 함수 제어
- 한 번만 실행, 지연 실행 등 다양한 함수 제어 패턴을 쉽게 구현합니다.
- 유틸리티 함수
- 정렬, 무작위화, 간단한 템플릿 엔진 등에도 활용할 수 있습니다.
3. 설치 방법
이 섹션에서는 Underscore.js를 프로젝트에 추가하는 구체적인 단계들을 살펴봅니다. CDN 사용, npm 또는 yarn을 통한 설치, 파일 직접 다운로드, 모듈 번들러와의 통합 방법을 다룹니다.
1. CDN 사용
CDN(Content Delivery Network)은 인터넷에 호스팅된 라이브러리를 링크만 추가하여 사용할 수 있게 해줍니다. 다음 코드를 HTML 파일의 <head> 태그 안이나 <body> 태그 끝에 삽입하세요:
예시: HTML 파일에 추가하기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Using Underscore.js</title>
<!-- Underscore.js CDN Link -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.6/underscore-min.js"></script>
</head>
<body>
<h1>Testing Underscore.js</h1>
<script>
// Test code
const data = [1, 2, 3, 4, 5];
const evenNumbers = _.filter(data, function(num) {
return num % 2 === 0;
});
console.log(evenNumbers); // [2, 4]
</script>
</body>
</html>
브라우저에서 열었을 때, 개발자 콘솔에는 짝수만 표시됩니다.
2. npm 또는 yarn을 사용한 설치
로컬 환경이나 Node.js 프로젝트에 Underscore.js를 설치할 수도 있습니다.
npm 사용
npm install underscore
yarn 사용
yarn add underscore
JavaScript에서의 가져오기 예시
import _ from 'underscore';
const data = [10, 20, 30, 40];
const result = _.map(data, (num) => num * 2);
console.log(result); // [20, 40, 60, 80]
3. 파일 다운로드
- 공식 웹사이트로 이동: underscorejs.org
- “Download” 섹션에서 최신 JavaScript 파일을 다운로드합니다.
- 다운로드한 파일을 프로젝트 폴더에 배치합니다 (예:
js/). - script 태그를 사용하여 HTML에 링크합니다.
<script src="js/underscore-min.js"></script>
4. 모듈 번들러 사용
Webpack이나 Parcel을 사용 중이라면, 설치가 매우 간단합니다:
Webpack 예시
- npm을 통해 설치:
npm install underscore
- JavaScript 파일에서 가져오기:
import _ from 'underscore';
- 필요에 따라 번들링하고 사용합니다.
문제 해결
1. “Uncaught ReferenceError: _ is not defined”
- Underscore.js가 올바르게 로드되지 않았을 수 있습니다. CDN 링크나 가져오기 경로를 다시 확인하세요.
2. npm 설치 후 오류
- Node.js와 npm이 최신 버전으로 업데이트되었는지 확인하세요.
4. 기본 사용법
이 섹션에서는 Underscore.js의 핵심 함수를 예시와 함께 소개합니다. 이러한 함수들은 배열과 객체 작업을 단순화하는 데 특히 유용합니다.
1. 배열 반복 – _.each()
_.each()는 배열이나 객체를 반복합니다.
예시
const numbers = [1, 2, 3, 4, 5];
// Print each element to the console
_.each(numbers, function(num) {
console.log(num);
});
출력:
1
2
3
4
5
주요 포인트:
- 배열과 객체 모두에 작동합니다.
- 콜백은 요소, 인덱스, 전체 컬렉션을 받습니다.
2. 배열 매핑 – _.map()
_.map()은 배열의 각 요소에 함수를 적용하여 새 배열을 반환합니다.
예시
const numbers = [1, 2, 3, 4, 5];
// Double each element
const doubled = _.map(numbers, function(num) {
return num * 2;
});
console.log(doubled);
출력:
[2, 4, 6, 8, 10]
3. 첫 번째 일치 요소 찾기 – _.find()
_.find()는 조건에 맞는 첫 번째 요소를 반환합니다.
예시
const numbers = [1, 2, 3, 4, 5];
// Find the first element greater than or equal to 3
const result = _.find(numbers, function(num) {
return num >= 3;
});
console.log(result);
출력:
3
4. 요소 필터링 – _.filter()
_.filter()는 조건에 맞는 모든 요소를 새 배열로 추출합니다.
예시
const numbers = [1, 2, 3, 4, 5];
// Get only even numbers
const evens = _.filter(numbers, function(num) {
return num % 2 === 0;
});
console.log(evens);
출력:
[2, 4]
5. 요소 섞기 – _.shuffle()
_.shuffle()은 배열의 요소 순서를 무작위로 섞습니다.
예시
const numbers = [1, 2, 3, 4, 5];
// Shuffle the array
const shuffled = _.shuffle(numbers);
console.log(shuffled);
출력: (예시)
[3, 5, 1, 4, 2]
6. 중복 제거 – _.uniq()
_.uniq()는 배열에서 중복 요소를 제거합니다.
예시
const numbers = [1, 2, 2, 3, 4, 4, 5];
// Remove duplicates
const uniqueNumbers = _.uniq(numbers);
console.log(uniqueNumbers);
출력:
[1, 2, 3, 4, 5]
요약
지금까지 Underscore.js의 기본 함수 몇 가지를 살펴보았습니다:
- 반복을 위한
_.each() - 새 배열 생성을 위한
_.map() - 조건부 일치를 위한
_.find()및_.filter() - 요소 무작위화를 위한
_.shuffle() - 중복 제거를 위한
_.uniq()
5. 고급 사용법
이 섹션에서는 Underscore.js의 더 고급 함수를 탐구할 것입니다. 이러한 함수들은 더 강력한 데이터 조작과 분석을 가능하게 합니다.
1. 배열 정렬 – _.sortBy()
_.sortBy()는 주어진 키나 조건에 따라 배열을 정렬합니다.
예제
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 20 },
{ name: 'Charlie', age: 30 }
];
// Sort by age
const sortedUsers = _.sortBy(users, 'age');
console.log(sortedUsers);
출력:
[
{ name: 'Bob', age: 20 },
{ name: 'Alice', age: 25 },
{ name: 'Charlie', age: 30 }
]
2. 데이터 그룹화 – _.groupBy()
_.groupBy()는 키나 조건에 따라 배열의 요소를 그룹화합니다.
예제
const numbers = [1.1, 2.3, 2.4, 3.5, 4.7];
// Group by integer part
const grouped = _.groupBy(numbers, function(num) {
return Math.floor(num);
});
console.log(grouped);
출력:
{
1: [1.1],
2: [2.3, 2.4],
3: [3.5],
4: [4.7]
}
3. 데이터 카운팅 – _.countBy()
_.countBy()는 조건에 따라 항목을 쉽게 카운트할 수 있게 합니다.
예제
const words = ['apple', 'banana', 'apricot', 'blueberry'];
// Count by first letter
const counts = _.countBy(words, function(word) {
return word[0];
});
console.log(counts);
출력:
{
a: 2,
b: 2
}
요약
이 섹션에서 Underscore.js의 고급 사용 사례를 다루었습니다:
_.sortBy()배열 정렬을 위해_.groupBy()및_.countBy()데이터 그룹화와 카운팅을 위해
6. 객체 작업
이 섹션에서는 객체를 다루기 위한 유용한 Underscore.js 함수를 다루겠습니다. 이러한 함수들은 키, 값, 객체 속성을 효율적으로 처리하는 것을 더 쉽게 만듭니다.
1. 키와 값 가져오기
키 가져오기 – _.keys()
const person = { name: 'Alice', age: 25, city: 'Tokyo' };
const keys = _.keys(person);
console.log(keys);
출력:
['name', 'age', 'city']
값 가져오기 – _.values()
const values = _.values(person);
console.log(values);
출력:
['Alice', 25, 'Tokyo']
2. 객체 복제 – _.clone()
_.clone()은 객체의 얕은 복사본을 생성합니다.
const original = { name: 'Alice', age: 25 };
const clone = _.clone(original);
clone.age = 30; // Modify the clone
console.log(original.age); // 25
console.log(clone.age); // 30
요약
이 섹션에서 Underscore.js의 객체 관련 함수를 소개했습니다:
_.keys()및_.values()키와 값 가져오기를 위해_.clone()얕은 복사본 생성을 위해
7. 함수 작업
이 섹션에서는 Underscore.js가 함수 동작을 제어하고 최적화하는 방법을 탐구할 것입니다. 이러한 유틸리티는 실행 제어와 성능 튜닝에 특히 유용합니다.
1. 함수 바인딩 – _.bind()
_.bind()는 함수를 특정 객체에 바인딩하여 this가 항상 해당 객체를 가리키도록 합니다.
예제
const person = {
name: 'Alice',
greet: function(greeting) {
return `${greeting}, my name is ${this.name}`;
}
};
const boundGreet = _.bind(person.greet, person);
console.log(boundGreet('Hello')); // Hello, my name is Alice
2. 실행 지연 – _.delay()
_.delay()는 지정된 시간만큼 함수 실행을 지연합니다.
예제
_.delay(function(message) {
console.log(message);
}, 2000, 'Displayed after 2 seconds');
출력: (2초 후)
Displayed after 2 seconds
3. 한 번만 실행 – _.once()
_.once()는 함수가 처음 호출될 때만 실행되도록 합니다.
예제
const initialize = _.once(function() {
console.log('Initialization complete');
});
initialize(); // Runs
initialize(); // Ignored
4. 메모이제이션 – _.memoize()
_.memoize()는 함수의 결과를 캐싱하여 동일한 입력에 대해 재계산을 건너뜁니다.
예제
const factorial = _.memoize(function(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
});
console.log(factorial(5)); // Computed
console.log(factorial(5)); // Retrieved from cache
5. 실행 제한 – _.throttle()
_.throttle()은 주어진 시간 간격 내에서 함수가 최대 한 번만 실행되도록 보장합니다.
예제
const log = _.throttle(function() {
console.log('Processing...');
}, 2000);
// Simulate rapid events
setInterval(log, 500); // Executes only once every 2 seconds
요약
이 섹션에서는 Underscore.js의 함수 관련 유틸리티를 소개했습니다:
_.bind()this고정을 위한_.delay()지연 실행을 위한_.once()일회성 초기화를 위한_.memoize()결과 캐싱을 위한_.throttle()실행 속도 제한을 위한
8. 유틸리티 함수
이 섹션에서는 Underscore.js가 제공하는 유용한 유틸리티 함수들을 다룰 것입니다. 이러한 함수들은 랜덤 값 생성, 데이터 상태 확인, 또는 템플릿 작업과 같은 다양한 상황에 적용할 수 있습니다.
1. 랜덤 숫자 생성 – _.random()
_.random()은 지정된 범위 내에서 랜덤 정수 또는 부동소수점 숫자를 생성합니다.
예제
console.log(_.random(1, 10)); // Integer
console.log(_.random(1, 10, true)); // Floating point
2. 빈 값 확인 – _.isEmpty()
_.isEmpty()는 배열, 객체, 또는 문자열이 비어 있는지 확인합니다.
예제
console.log(_.isEmpty([])); // true
console.log(_.isEmpty({})); // true
console.log(_.isEmpty('')); // true
console.log(_.isEmpty([1, 2, 3])); // false
3. 템플릿 생성 – _.template()
_.template()은 간단한 문자열 템플릿을 생성하는 데 사용됩니다.
예제
const template = _.template('Hello, <%= name %>!');
console.log(template({ name: 'Alice' }));
출력:
Hello, Alice!
요약
우리가 소개한 유틸리티 함수들은 다음과 같습니다:
_.random()랜덤 숫자 생성을 위한_.isEmpty()데이터 구조가 비어 있는지 확인을 위한_.template()간단한 템플릿 생성을 위한
9. 결론
이 기사에서 우리는 Underscore.js를 기본부터 더 고급 사용 사례까지 탐구했습니다. 이 라이브러리는 데이터 조작을 단순화하고 효율적이고 유지보수 가능한 JavaScript 코드를 작성하는 데 매우 효과적입니다.
요약
- 기본 사용 – 배열과 객체 작업을 위한 핵심 함수를 배웠습니다.
- 고급 사용 – 데이터 분류, 정렬, 집계를 다루었습니다.
- 함수 작업 – 실행 제어와 메모이제이션을 통한 최적화를 설명했습니다.
- 유틸리티 함수 – 랜덤화, 빈 값 확인, 템플릿 생성을 소개했습니다.
마무른 생각
Underscore.js는 JavaScript 개발을 더 효율적이고 관리하기 쉽게 만드는 강력한 도구입니다. 이 기사를 프로젝트에 통합하는 가이드로 사용하세요. 기술을 더 날카롭게 하기 위해 계속 연습하세요.
자주 묻는 질문 (FAQ)
Q1: Underscore.js는 무료로 사용할 수 있나요?
A: 네. Underscore.js는 MIT 라이선스 하에 제공되며, 개인 및 상업적 용도로 무료입니다.
Q2: Underscore.js와 Lodash의 차이점은 무엇인가요?
A: Underscore.js는 간단하고 가벼운 유틸리티 라이브러리입니다. Lodash는 Underscore.js를 기반으로 하지만 기능을 확장하여 더 나은 성능과 완전한 모듈성을 제공합니다. 선택은 프로젝트 요구사항에 따라 다릅니다.
Q3: 현대 JavaScript (ES6+)에서 Underscore.js는 불필요한가요?
A: ES6+가 강력한 배열과 객체 메서드를 포함하고 있지만, Underscore.js는 크로스 브라우저 호환성, 간결한 구문, 레거시 코드 작업에 여전히 유용합니다.
Q4: Underscore.js에 가장 적합한 프로젝트 유형은 무엇인가요?
A: 코드 단순성을 우선시하는 소규모에서 중규모 프로젝트 또는 애플리케이션입니다. 특히 빠른 데이터 작업을 위한 가벼운 유틸리티가 필요할 때 유용합니다.
Q5: Underscore.js를 어떻게 설치하나요?
A: 여러 방법으로 설치할 수 있습니다:
- CDN 링크:
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.6/underscore-min.js"></script>
- npm:
npm install underscore
- yarn:
yarn add underscore
Q6: 공식 문서는 어디에서 찾을 수 있나요?
A: 공식 문서는 여기에서 확인할 수 있습니다: Underscore.js Official Website
Q7: Underscore.js를 대규모 프로젝트에서 사용할 수 있나요?
A: 예, 하지만 대규 프로젝트에서는 모듈화와 성능 최적화 때문에 Lodash를 권장하는 경우가 많습니다. 그래도 Underscore.js는 소규모 및 중간 규모 프로젝트에 잘 작동합니다.
Q8: 함수 실행을 제어하는 다른 방법이 있나요?
A: 예. 최신 JavaScript는 setTimeout(), setInterval(), Promise, async/await를 지원합니다. 그러나 Underscore.js는 간결하고 효율적인 구현을 위해 _.throttle()와 _.debounce()를 제공합니다.
Q9: Underscore.js 사용 시 주의할 점이 있나요?
A:
- 네이티브 ES6 기능으로 충분한 경우 과도하게 사용하지 않도록 주의하세요.
- 보안 문제를 피하려면 항상 최신 버전을 사용하세요.
- 대규모 프로젝트에서는 대안으로 Lodash를 고려하세요.
Q10: _.template()을 템플릿 엔진으로 권장하나요?
A: _.template()은 간단한 템플릿에 편리합니다. 고급 요구사항이 있다면 Handlebars.js나 EJS와 같은 전용 라이브러리를 고려하세요.



