jQuery.noop() by 옷장수

jQuery에는 noop()이라는 함수가 있습니다. 말 그대로 no operation, 아무런 동작을 하지 않는 빈 함수인데요. 빈함수는 다음의 용도에서 유용하게 사용할 수 있습니다. 사용자가 레이어에 클릭/마우스오버/마우스아웃의 동작을 옵션으로 정의해서 넘겨주는 경우에 이를 실행한다는 코드를 작성한다고 가정해볼께요.

var options = {click: function() {alert("클릭입니다.");}}
var layer = new Layer(options);

그리고 Layer 내부에서는 click이 발생할 때 옵션 코드를 실행하게 됩니다. 

Layer.prototype = {
   onClick: function() {
      if( this.options.click )  {
         this.options.click();
      }
   }
   ...
}
 
이렇게 코드를 작성하게 되면 클릭/마우스오버/마우스아웃 모두 옵션값이 있는 지 여부를 체크하는 조건문이 들어가게 됩니다. 
이런 경우에는 디폴트 옵션 값을 아무런 동작을 하지 않는 noop 함수로 정의해주고 jQuery.extend()를 사용하여 기본 옵션 값을 사용자 정의 값으로 덮어쓰게 되면 옵션값이 있는 지 여부를 체크하는 조건문을 모두 삭제할 수 있습니다.

var Layer = function(options) {
   this.options = jQuery.extend(this.options, options);
}

Layer.prototype = {
   options: {
      onClick: jQuery.noop, ...
   }
}

그리고, 빈함수를 사용하는 경우 모두 jQuery.noop을 사용하기 때문에 미약하지만 function() {}을 사용하는 비용도 줄이는 효과도 줍니다. 



정해진 규약대로 메소드를 호출하자 by 옷장수

어제 추가한 레이어가 삭제가 되지 않는 버그를 발견했습니다. 
두 시간이 넘는 디버깅 작업 끝에 발견한 원인은 예상치 못했던 버그더군요. 
이년 전에 처음 작성되었던 코드는 투명한 부모 레이어 위에 단순히 추가 되는 엘리먼트 였는데요. 부모 엘리먼트와 자식 엘리먼트는 서비스 로직을 담고 있어서 자바스크립트 코드로 감싸져 있었구요. 추가/삭제는 내부 메시지 처리 프레임웍을 통하여 상호 호출하였습니다.

과정1. (2년전)
프로젝트 완료 시점에 성능 최적화 문제가 나왔었는데요. 프레임웍을 사용하여 호출하는 경우 탐색하는 비용(미약하지만)이 들어서 프레임웍을 사용하지 않고 엘리먼트를 직접 추가하도록 변경하였습니다.
과정2. (1년전)
부모 엘리먼트의 코드가 수정되면서 각 Layer의 id를 관리하는 코드가 추가되었는데요. addLayer()가 호출될 때, ChildLayer에 id를 할당하고 removeLayer할 때, 삭제할 ChildLayer가 ParentLayer에 추가되어 있는지를 확인한 후에 삭제하는 코드가 추가되었는데요. 이슈1에서 HTMLElement에 직접 접근하도록 변경하였기 때문에 'ChildLayer의 엘리먼트가 추가는되나 삭제는 되지 않는' 문제가 발생하였습니다. 

거기다가 문제중 하나는 삭제 후, ChildLayer를 화면에서 보이지 않게 초기화 시키는 작업을 수행하기 때문에 개발자가 과정2를 작업한 개발자가 제대로 동작하는지를 확인 못하는 사태가 발생하였습니다.

문제를 발견하고 드는 생각정리
  1. 아무리 성능을 개선한다고 하더라도 정해진 규약(ParentLayer의 addLayer()를 통하여 추가하기)을 벗어나는 성능개선은 해서는 안되겠네요. 인수인계를 한다고 하여도 잊을 수 있고 검색이 되지 않는다면 변경한 코드에 대한 수정을 잊을 수 있다라는 생각이 드네요.

  2. 단일 클래스에 대한 단위테스트 외에도 클래스들간의 관계를 검증하는 통합테스트도 필요하다.라는 생각도 듭니다.

2년전에 작성하였던 코드가 돌고돌아서 다시 받았을 때 발견한 버그에 대한 감회...... 씁쓸하네요. 

윤바탕과 윤돋움 폰트를 웹페이지에서 폰트로 사용하면 유료입니다. by 옷장수

윤바탕과 윤돋움 폰트라이센스를 보면 '개인 및 기업 사용자를 포함 모든 사용자에게 무료로 제공되며, 인쇄,출판용 출력물 및 웹페이지의 적용을 위한 이미지 제작용도(상업적 목적의 직접 판매 제외)로만 사용이 가능합니다.'라고 되어 있는데요. 세부 약관을 보면 다음과 같이 되어 있습니다. 

저작권자의 사전승인 없이 DTP(1) 용도 혹은 지정된 용도(2) 외에 사용하는 것을 법적으로 금합니다. 
  1. DTP [desktop publishing]: 개인용 컴퓨터를 이용하여, 출판물의 입력과 편집, 인쇄 등의 전 과정을 컴퓨터화 한 전자 편집 인쇄 시스템
  2. 지정된용도: 본 제품은 인쇄, 출판용 출력물 및 웹페이지 적용을 위한 이미지 제작용도(상업적 목적의 직접 판매 제외)로만 사용이 가능합니다.
여기에는 개인 웹페이지에서의 font 속성 설정을 통한 사용에 대한 언급이 없길래 메일로 문의를 해봤는데요.
  1. body 태그에 font-family 속성으로 적용하는 방법
  2. html5에서 지원되는 font-face를 사용하여 폰트를 적용하는 방법
1,2번의 경우 모두 별도의 라이센스를 채결해야한다고 하네요. 
아쉽지만.... 윤바탕과 윤돋움 폰트는 유료라 생각하는게 편할 것 같네요.


1 2 3