eval은 JavaScript 코드에서 문자열을 실행할 수 있는 기능을 제공하지만, 보안상 위험과 디버깅 어려움, 성능 저하 등의 이유로 사용을 피하는 것이 좋습니다. 대신 new Function()을 사용하여 문자열을 함수로 실행하는 방법을 사용하면 보다 안전하게 코드를 실행할 수 있습니다. 이 문서는 eval을 new Function()으로 변경하는 방법을 안내합니다.


eval 사용 예시

let x = 10;
let code = "x + 5";
let result = eval(code);
console.log(result);  // 15

위 예시에서 eval은 문자열로 제공된 JavaScript 코드를 실행하여 결과를 반환합니다. 그러나 eval은 다양한 보안 위험을 초래할 수 있습니다.


new Function() 사용 예시

new Function()은 문자열을 함수로 감싸서 실행하는 방법입니다. eval보다 상대적으로 더 안전한 방법으로 코드 실행을 제공합니다. new Function()은 다음과 같이 사용할 수 있습니다.

let x = 10;
let code = "x + 5";
let func = new Function('return ' + code);
let result = func();
console.log(result);  // 15

new Function()은 실행할 코드 문자열을 함수로 감싸며, 이 경우에는 return을 명시적으로 추가해야 합니다.


eval을 new Function()으로 변경하는 단계

단계 1: eval로 실행하려는 코드 문자열 추출

먼저 eval에서 사용되는 코드 문자열을 new Function()에서 사용할 수 있는 형태로 변환합니다. 예를 들어, eval에서 x + 5처럼 계산하는 코드가 있다면, 이 코드 문자열을 그대로 new Function()으로 넘길 수 있습니다.

단계 2: eval에서 실행되는 코드에 return 추가

new Function()은 실행하는 코드에서 값을 반환하려면 return 키워드를 사용해야 합니다. 따라서 eval에서 계산된 값을 new Function()으로 변환할 때는 반환값을 명시적으로 지정해야 합니다.

단계 3: 변수 접근 방식 변경

eval은 해당 코드가 실행되는 범위에서 변수를 직접 참조할 수 있지만, new Function()은 별도의 함수 범위 내에서 실행됩니다. 필요한 변수는 new Function()에 인자로 넘겨줘야 합니다.

예시:

eval 사용:

let x = 10;
let code = "x + 5";
let result = eval(code);
console.log(result);  // 15

new Function()으로 변경:

let x = 10;
let code = "x + 5";
let func = new Function('x', 'return ' + code);  // 'x'를 매개변수로 추가
let result = func(x);  // x 값을 전달
console.log(result);  // 15

위와 같이 new Function()은 코드 내에서 외부 변수를 참조하지 않기 때문에, 필요한 변수를 함수의 매개변수로 전달해야 합니다.


변경 시 고려사항

  • 보안: eval은 실행되는 코드가 악의적일 경우 심각한 보안 문제를 초래할 수 있습니다. new Function() 역시 외부 입력을 사용하기 전에 반드시 검증해야 합니다.
  • 디버깅: eval은 디버깅이 어려운 특성이 있습니다. new Function()은 함수로 변환되기 때문에 디버깅이 조금 더 용이할 수 있습니다.
  • 성능: eval은 실행 시에 파싱 및 컴파일 작업이 필요하므로 성능에 영향을 줄 수 있습니다. new Function()은 상대적으로 성능에 영향을 덜 미칩니다.

예외 처리

new Function()을 사용할 때 코드가 잘못된 경우 예외가 발생할 수 있습니다. 이를 처리하기 위해 try-catch 문을 사용할 수 있습니다.

let code = "x + 5";
try {
  let func = new Function('x', 'return ' + code);
  let result = func(10);
  console.log(result);
} catch (e) {
  console.error('Error executing code:', e);
}

결론

  • eval을 사용할 필요가 있을 때 new Function()을 사용하면 보안성과 성능 측면에서 더 안전한 대안을 제공합니다.
  • 코드를 new Function()으로 변경할 때는 변수를 매개변수로 전달하는 점에 유의해야 합니다.
  • eval 사용을 최소화하고, 필요하다면 new Function()을 통해 동적으로 코드를 실행할 수 있는 방법을 적용하는 것이 바람직합니다.

+ Recent posts