MongoDB에서는 system.js라는 시스템 컬렉션을 활용하여 자바스크립트 함수를 저장하고 재사용할 수 있습니다. 서버 측에서 반복적으로 사용해야 하는 로직이 있다면 이 컬렉션에 함수를 등록해 두고 필요할 때마다 호출하는 방식으로 효율성을 높일 수 있습니다.
1. system.js에 함수 저장하기
먼저 저장할 함수를 만들어 보겠습니다. db.collection.save() 메서드를 사용하면 system.js 컬렉션에 함수를 등록할 수 있습니다. 다음은 간단한 인사말을 반환하는 displayMessage 함수를 저장하는 쿼리입니다.
> db.system.js.save({
_id: "displayMessage",
value: function (data) {
return 'The Name is: ' + data;
}
})위 쿼리를 실행하면 아래와 같은 결과가 출력됩니다. 새로운 문서가 성공적으로 삽입(upsert)되었음을 확인할 수 있습니다.
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : "displayMessage"
})2. 저장된 함수 실행하기
저장한 함수를 실행하려면 db.eval() 메서드를 사용합니다. 함수 이름과 전달할 인자를 문자열 형태로 넘기면 됩니다.
> db.eval("displayMessage('John')")실행 결과는 다음과 같습니다.
The Name is: John
3. 참고 사항: db.eval의 지원 중단(Deprecation)
db.eval()은 MongoDB 3.0 버전부터 공식적으로 지원이 중단(deprecated)된 기능입니다. 실제 운영 환경에서는 보안상 위험과 성능 저하 문제 때문에 사용하지 않는 것이 좋습니다. 대신 최신 버전의 MongoDB에서는 다음과 같은 방법을 권장합니다.
- $where 연산자: 쿼리 조건에서 자바스크립트 표현식을 사용해야 할 경우 활용할 수 있습니다.
- 애플리케이션 측 로직 처리: 함수 로직을 애플리케이션 코드에서 실행하는 것이 가장 안전하고 일반적인 방식입니다.
따라서 학습 목적으로 system.js와 db.eval()의 동작 원리를 이해하는 것은 유용하지만, 실무에서는 위에서 소개한 대체 방법을 우선적으로 고려하시기 바랍니다.