자바스크립트 패턴 설계

안티패턴

패턴이 '좋은 실천법'을 의미한다면, 안티 패턴은 '반면교사를 통해 얻은 교훈' 정도를 의미합니다. 안티 패턴이라는 말은 1995년 앤드류 쾌닉이 C++ 레포트에서 처음으로 사용하였습니다. GoF의 설계 패턴에 대한 책에 영감을 받아서 쓴 레포트였습니다. 이 레포트에 보면 안티 패턴에 대한 두 가지 주장이 나옵니다. 

  • 안티패턴은 안좋은 해결책에 대해 기술합니다. 이 안좋은 해결책은 현재의 안좋은 상황을 야기한 문제에 대한 해결책입니다.
  • 안티패턴은 위에서 언급한 상황에서 어떻게 빠져나올 수 있는지 기술합니다. 그리고 그 상태에서 좋은 해결책으로 가는 방법은 무엇인지 기술합니다.

이 주제에 대해 알렉산더는 "좋은 설계 구조와 좋은 문맥 사이에 조화로운 균형을 이루기기 어렵다"고 했습니다.

"설계의 과정은 새로운 원리나 조직, 형태나 함수에 대한 반응... 등을 방법을 발명하는 과정입니다. 모든 설계의 문제는 두 개념 사이에 맞는 것을 찾기 위해 노력하기 때문에 나타납니다. 방식적으로 올바른 것과 문맥적으로 올바른 것 즉, 방식은 문제에 대한 해결책을 의미하며 문맥은 문제를 정의하는 것입니다."

설계패턴에 대해 아는 것도 중요한 반면 그만큼 안티패턴에 대해 아는 것도 중요합니다. 이것 뒤에 있는 의미를 함께 알아봅시다. 어플리케이션을 만들 때 설계부터 프로젝트의 생명주기가 시작되며 지속적으로 유지되어야 하지만 최초의 릴리즈로 완료되기도 합니다. 최종 솔루션은 기술적 숙련도와 팀이 이것을 개발할 때 주어진 시간이 어느 정도인가에 따라 질적으로 좋기도 하고 나쁘기도 합니다. 좋고 나쁨은 문맥적으로 고려되어야 하는데 ‘완벽한' 설계가 사실은 잘못된 문맥으로 만들어진 안티패턴 일 수 있습니다.

어플리케이션이 생산에 들어가면서, 그리고 유지보수 하는 상태가 되면서 더욱 큰 도전이 나타납니다. 어플리케이션을 만들 당시에 일하지 않았던 시스템 개발자는 잘못된 설계로 나타나는 문제를 설명해야 할지도 모릅니다. 나쁜 예시가 안티패턴을 만든다면 그들은 개발자에게 안티패턴을 통해 문제를 인지하고 흔히 발생하는 일반적인 실수를 회피할 수 있도록 합니다. 이와 같이 설계패턴은 일반적인 기술들을 유용하게 하며 일률적인 방법을 제공합니다.

요약해보면, 안티패턴이란, 문서화해둘만한 가치가 있는 잘못된 설계입니다. 자바스크립트에서 안티패턴의 예는 다음과 같습니다 : 

자바스크립트에서 안티패턴의 예

 

  • 전역의 성격을 갖는 네임스페이스 안에다가 변수를 많이 정의하는 것. 이렇게 하면 네임스페이스가 지저분해진다. (역자주 : MAX=100; 처럼 최대값을 global 하게 대신 var myModule = {MAX:100} alert(myModule.MAX); 형태로 사용하는게 좋다는 의미; 네임스페이스를 쓴다는 것은 물건들을 사물함처럼 니껏 내껏 구분을 지어준다는 의미이고, global 하게 쓴다는것은 사물함 물건들을 다 꺼내서 바닥에 다 펼쳐놔서 니껏 내껏 구분없이 바닥에 흩어진 상태라 생각해도 될 듯 합니다)
     
  • setTimeout나 setInterval에 인자를 넘겨줄 때, 함수로 넘겨주지 않고 문자열로 넘겨주는 것. 이렇게 하면 내부적으로 eval()을 호출하게 된다. (역자주 - 이 부분에 기술적인 부분을 첨언하면 eval()을 사용하면 넘겨주는 값에 대한 검증이 없이 바로 자바스크립트 소스로 적용되기 때문에 상당히 보안에 취약합니다. setTimeout과 setInterval에 문자열로 넘겨주면 내부적으로 그렇게 처리를 하나봐요.
     
  • 프로토타입을 통하지 않고 객체를 객체화 하는것 (이것은 특히 나쁜 안티패턴이다)
     
  • 자바스크립트를 인라인 폼에 융통성 없게 적용하는 것(역자주 : onclick 등을 쓰는 걸 얘기하는 듯합니다. 참고Unobtrusive JavaScript - http://en.wikipedia.org/wiki/Unobtrusive_JavaScript)
     
  • document.createElement 같은 더 나은 것이 있는데도 네이티브 DOM의 대안으로 document.write를 사용하는 것. document.write 는 수년에 걸쳐 잘못 사용되어 왔다. 게다가 단점도 있는데 페이지가 로딩이 된 후 document.write로 페이지를 덮어쓰면 그 이후로는 document.createElement를 사용하지 못한다는 점이다. 이러한 문제는 이 페이지를 통해 직접 확인할 수 있다. 이것은 또한 XHTML에서 동작하지 않으며 이러한 이유 때문에 document.createElement 와 같이 DOM에 더욱 적절한 메소드를 선택해야 한다.

프로그램을 잘 개발하려면 안티 패턴에 대해 잘 아는 것이 매우 중요합니다. 일단, 안티 패턴을 알아볼 수 있으면, 안티 패턴에 해당하지 않도록 코드를 리팩토링할 수 있습니다. 결국 여러분이 개발하는 솔루션의 품질도 전반적으로 향상시킬 것입니다.

댓글

댓글 본문
버전 관리
김나솔
현재 버전
선택 버전
graphittie 자세히 보기