본문 바로가기
개발/개발지식

[개발지식] 몽키 패치(Monkey patch)에 대하여

by 핸디(Handy) 2021. 7. 1.

이펙티브 타입스크립트를 재미나게 있고 있던 중 아래와 같은 글을 보았습니다.

만약 String.prototype을 몽키-패치한다면 앞서 설명한 내부적인 동작들을 관찰할 수 있습니다.

 몽키-패치라니 스파케티코드처럼 뭔가를 비유하는 말인듯 싶어 찾아보았습니다.

Monkey patch

A monkey patch is a way for a program to extend or modify supporting system software locally (affecting only the running instance of the program). - wikipedia

https://en.wikipedia.org/wiki/Monkey_patch

해석해보자면 

프로그램이 시스템 소프트웨어를 개별적으로 확장 또는 수정하는 방법을 의미합니다. ( 실행 중인 인스턴스에만 영향을 준 채)

음 해석이 약간 이상합니다.

요약하자면 "런타임 환경에서 프로그램의 특정 기능을 수정하여 사용하는 기법"이라고 보시면 될 것같습니다.

어원이 특이하다고 하는데 원래는 게릴라패치였다고 합니다. 게릴라란 집단에 속하지 않고 개별적인 행위를 하는 사람 또는 단체라는 의미로 그냥 개인플레이라고 생각하시면 됩니다. 게릴라패치 이름 그대로 특정 기능을 위해 개별적인 행위를 해서 이러한 이름이 붙여졌을 것이라 생각했습니다.

게릴라패치가 몽키패치가 된 건 발음의 유사성에 있습니다.

게릴라(Guerrilla) -> 고릴라(Gorilla) -> 원숭이(Monkey)

게릴라 패치에서 발음의 유사한 고릴라패치로 변했는데 고릴라 패치라고 하면 너무 크고 거대한 패치라고 들리는 문제점이 있었다고 합니다. 실은 런타임에서 돌아가는 상대적으로 자그마한 변화였는데 말입니다. 

그래서 이번에는 발음의 유사성보단 종의 유사성 + 귀여움으로 인해 원숭이로 바뀌게 되었습니다.


이제 이런 몽키 패치가 자바스크립트 환경에서는 어쩔때 발생할수 있는지 생각해보겠습니다.

자바스크립트에서 몽키 패치가 일어나는 때는  프로토 타입에 특정 메소드를 추가할 때, 폴리필 함수를 만들 때 정도일 것으로 생각됩니다.

다만 프로토 타입에 특정 메소드를 추가하는 일이나 폴리필 함수를 별도로 만드는 일은 아직까지 실무에서 겪어보지 못한 일입니다.

1. 프로토 타입에 특정 메소드를 추가할 때

해당 상황의 경우가 발생하는 일은 이전 포스트에서 한번 다뤘습니다.

 

[자바스크립트] 배열의 마지막 요소를 가져오는 방법에 대하여

이번 포스트에서는 배열의 마지막 요소를 가져오는 방법에 대해 알아보도록 하겠다. 파이썬의 경우 배열의 마지막 요소는 array[-1]로 가져올 수 있다. 과연 자바스크립트에서도 동작할까? let array

all-dev-kang.tistory.com

파이썬과 달리 인덱스에 -1로 접근하는 것은 지원하지 않아 별도의 길이를 구하고 해당 길이로 찾는 방법을 많이들 사용합니다.

이런 상황이 빈번해지면 Array 프로토 타입에 last라는 메소드를 추가하는 방법에 대해 언급했었습니다.

if (!Array.prototype.last){
    Array.prototype.last = function(){
        return this[this.length - 1];
    };
};

다만 이러한 일은 해당 프로젝트에 공통으로 사용하는 Array를 건드는 것이기에 사용할때 조심해야하며, 직접 만들지 말고 다른 방법으로 찾길 권고한다고 되어있습니다.

2. 폴리필 함수를 만들 때

여러 버전의 브라우저들을 지원하기 위해 특정 브라우저에서 동작하지 않는 자바스크립트 함수를 만들어야 할때가 있습니다.

단적인 예로 Promise가 있습니다. 크롬에서는 지원하고 있으나 익스폴로러에서는 해당 키워드를 찾지 못합니다.

그래서 Promise를 별도로 구현해야 합니다. 

하지만 우리의 짱짱맨 형님들이 이미 바벨을 통해 CoreJS를 Promise를 가져와 사용하도록 하는 우회방안을 만들어 놓으셨고 우리가 고민해야하는 왠만한 브라우저 폴리필 함수는 커버가 가능하다고 생각합니다. ( 내 생각의 범위 <<<<<<< 형님들 생각의 범위 )

따라서 아직까지 이런 종류의 폴리필 함수를 만들어 본 적이 없습니다.

 

댓글