isArray


 자바스크립트를 개발하다가 보면 객체를 반별할 때 넘어온 객체가 일반적인 객체인지 배열인지를 판단하여 다르게 수행해야 할 때가 있다. 다음과 같은 코드로 알아내 보도록 해보자.


[코드1] 잘못된 방법으로 Array 인지 판단


 위 코드를 의도한 바와 다르게 판단하고 있다. 그래서 아래와 같이 Array객체에 추가 프로퍼티를 추가해서 확인하는 코드를 작성 하였다.


[코드2] 프로퍼티에 추가하고 배열여부 판단


 위와 같이 웹 페이지에서 추가하여 실행하면 정상적으로 판단을 할 것이다.


객체 생성시 new를 강제할 수 있는 패턴



 자바 스크립트 라이브러리를 사용할 때 new 키워드를 사용하지 않고 객체로 선언하였다고 생각하고 사용할 때가 있다.  이런 오류 때문에 정상적으로 동작하지 않고 디버깅에 많은 시간을 할 애 할 수 있다. 그렇지만 new를 사용하고 객체를 생성하지 않더라도 자체적으로 새로운 객체를 생성해서 반환해 주는 패턴이 있다. 우선 아래 코드를 보고 이해를 돕고자 한다.

<script type="text/javascript">
    //객체로 사용할 함수
    function NewInstance1() {
        this.name = 'name';
        this.age = 0;
    }
 
    //new를 사용해서 객체 생성
    var newObject1 = new NewInstance1();
    console.log(newObject1.name);
 
    //new를 사용하지 않고 객체 생성
    var newObject2 = NewInstance1();
    console.log(newObject2.name);   //에러 발생
</script>

[코드1] 객체 생성 및 사용 예제


 위 코드에서는 일반적인 객체를 선언하고 두번째 코드에서 new를 사용해서 객체의 인스턴스를 생성하여 값을 정상적으로 사용할 수 있었다. 하지만 두번째 객체의 인스턴스 생성시 new를 사용하지 않고 사용하면 에러가 발생하게 된다. Javascript 엔진이 new 키워드를 만들면 안에서 사용하는 this의 범위가 달라지게 하는 특별한 수행 덕분에 발생하는 이유다. 이와 같은 패턴으로 선언되어 있으면 개발자의 실수로 인해 전체 웹 페이지에 영향을 미칠 수 있는 잠재적인 오류가 내재화 되어 있다. 그렇다면 어떻게 하면 실수를 미연에 방지 할 수 있을까. 아래와 같은 패턴으로 실수를 방지 할 수 있다.  아래 코드를 보자.

//객체로 사용할 함수
function NewInstance2() {
    if (!(this instanceof NewInstance2)) {
        return new NewInstance2();
    }
 
    this.name = 'name';
    this.age = 0;
}
 
//new를 사용해서 객체 생성
var newObject3 = new NewInstance2();
console.log(newObject3.name);
 
//new를 사용하지 않고 객체 생성
var newObject4 = NewInstance2();
console.log(newObject4.name);   //에러 발생

[코드2] self 인스턴스 생성 패턴



 위와 같은 코드로 만들어진 객체는 개발자의 실수를 방지할 수 있게 할 수 있을 것이다. 그리고 prototype을 통해 추가된 프로퍼티들을 사용할 수 있는 장점이 있다.



소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       


이전시간에 이어서 패턴 개론에 대해서 이어가도록 하겠다.

 

주석

- 모든 변수, 모든 행에 주석을 다는 게 아닌 특이하고 흥미로운 알고르즘이나 기법을 사용한 사용한 경우에 주석을 단다.
  주석은 코드를 읽을 미래의 독자에게 주는 힌트

 

API 문서 작성

아래는 JS Doc를 자동으로 생성해 주는 무료 툴이다. 요구하는 형식에 맞게 주석을 달면 툴에서 자동으로 해당 API 문서를 만들어 낸다.
- JSDoc : http://code.google.com/p/jsdoc-toolkit

- YUIDoc : http://yuilibrary.com/projects/yuidoc

독자를 위한 문서 작성

- API 문서를 작성하라는 것은 초안일 뿐인 첫 번째 코딩에 대해서 문석 작성시 한번 더 살펴 독자 입장에서 살펴 보라는 것이다.

코드 또는 API 문서를 작성할 때 다른 누군가가 읽을 것이라고 생각하라는 것이다. 이 사실 자체만으로도 눈 앞의 문제를 해결하는 좀더 나은 방법을 생각해 보게 된다.

 

동료 리뷰

- 애자일에서 코드 품질을 높이는데 사용하는 방안이다.

자신이 작성한 코드를 옆에 있는 동료에게 검토를 부탁이나 설명을 해주는 것만으로도 가능하다. 이런 방법으로 서로의 경험과 개개인의 접근방식을 배우게 된다는 점에서도 장점을 찾을 수 있다.

 

출시 단계(개발완료 단계)의 압축

- 압축이란 자바스크립트 코드에서 공백, 주석 및 기타 중요하지 않은 부분들을 삭제함으로써 서버에서 브라우저로 전송되는 파일 크기를 감소시키는 공정이다.

압축에 관련된 툴로는 YUI컴프레서, 구글의 클로저 컴파일러, Microsoft Ajax Minifier 가 있다. – 대략 절반 정도의 압축을 할 수 있다.
      - http://yui.github.com/yuicompressor/, http://refresh-sf.com/yui/ online에서 압축 시켜 줌.
      - http://closure-compiler.appspot.com/home online 지원, https://developers.google.com/closure/compiler/?hl=ko
      - http://www.asp.net/ajaxlibrary/AjaxMinDocumentation.ashx, http://aspnet.codeplex.com/releases/view/40584 Download

- 압축 시 지역 변수는 임의의 변수로 치환되어 압축 한다.

 

JSLint 실행

- JSLint에서 제공되는 가이드 라인에서 위배되는 사항을 개발자가 알 수 있도록 알려주는 툴이다.

일반적인 개발 사항에서 좀더 가시적이고 오류가 없도록 도와주는 역할을 하는 도구다.

- Visual Studio JSLint를 컴파일 단계에서 점검해 볼 수 있도록 확장 기능을 제공하기도 한다.

유지보수 가능한 코드 작성

- 읽기 쉽게

- 일관적이게

- 예측 가능하도록

- 문서화( 코드 코멘트, 주석, 개발 문서 )

 

전역 변수 최소화

- vGlobal = ‘hello’;

console.log(vGlobal);      //”hello”

console.log(window.vGlobal);      //”hello”

console.log(window.[“vGlobal”]);      //”hello”

console.log(this.vGlobal);      //”hello”

위에서 “vGlobal”은 다 같은 곳을 바라보고 있다. 그렇지 않다면 'undefined’가 출력이 되었을 것이다.

 

전역 변수의 문제점

- 외부 라이브러리가 변경

- 다른 개발자가 변경

의도치 않게 기준 값이 변경되어 버그가 발생할 수 있다.

 

단일 var 패턴

- 함수 상단에서 var를 이용해 모든 변수를 선언 함

- 강제로 선언 시 함수 초기에 ‘use strict’을 사용하면 html5에서는 변수 선언을 강제 할 수 있다.

 

암묵적인 타입 캐스팅 피하기

- “===” 이나 “!==”을 사용한다.

 

eval() 피하기

- var property = “value”;     //안티패턴
  alert(eval(‘obj.’ + property));

  var property = “value”;     //권장
  alert(obj[property]);

- eval은 보안 문제와도 관련이 있다.
만약 네트워크로 가져온 코드를 실행 하는 케이스가 있을 때 잘못된 코드가 온다면 의도되지 않은 실행이나 개인 정보 유출의 위험성이 존재하게 된다.

 

- 위와 같은 패턴으로 실행되는 케이스가 더 있다.

     1. setTimeout(“execute code”, 1000);     //안티패턴

            -> 권장안 setTimeout(function(){ /* execute code */}, 1000);

           2. new Function() 생성자 – eval을 반드시 사용해야 한다면 new Function() 사용을 고려해 볼 수 있다.
              new Function()으로 실행되는 코드는 지역 함수의 유효범위 안에서 실행 – 자동으로 전역 변수로 만들어 주지는 않는다. (ex. var를 실행하면 eval에서는 전역 변수로 선언되지만 new Function()에서는 지역 변수로 선언된다.)

              var str = ‘var temp = 2; console.log(temp);’;
              new Function(str)();           - new Function()으로 실행 - 추천

              (function() {                     - eval로 실행 – 추천(격리되어 실행되게 한다)

                  eval(temp);

              }());

parseInt()를 통한 숫자 변환

- var month = ‘01’, year = ‘2013’
  month = parseInt(month, 10);
  year = parseInt(year, 10);

위와 같이 기수 매개 변수를 꼭 입력해야 한다.
ECMAScript 3에서는 8진수가 기본이고, ECMAScript 5에서는 변경이 되었다.

위에서 문제가 되는 부분은 시작하는 숫자가 ‘0’으로 시작하는 month 변수가 잘못 해석이 될 수 있다.

 

코딩규칙

- 코딩 규칙을 수립하고 준수하는 목적은 이를 통해 코드의 일관성이 유지되고 예측가능해지며 읽고 이해하기 훨씬 더 쉬워지기 때문이다.
  (코딩 규칙을 정하고자 한다면 조직 안에서 반발이 일어 날 수 있고 예외 적인 부분 때문에 막힐 수도 있지만 규칙을 수립하여 일관되게 준수하는 것 자체가 규칙의 세부 사항보다 훨씬 중요하다.)

   들여 쓰기, 중괄호, 여는 중괄호의 위치, 공백에 대해서 기준을 정하고 규칙을 준수하도록 노력해야 하겠다.

 

명명 규칙

- 코드를 좀더 예측 가능하고 유지보수하기 쉽게 만드는 방법이다. 즉 변수와 함수의 이름을 일관된 방식으로 만드는 것이다.

1. 생성자를 대문자로 하기

   var foo = new Person(); – 함수가 대문자로 시작하면 생성자로 사용할 function인지 파악할 수 있다. – 기본적으로 javascript에서는 function 이름을 소문자로 시작한다.

2. 단어 구분

   javascript에서는 단어 조합시 카멜 표기법(camel case)을 사용한다. 이 표기법의 사용은 
      - 생성자는 단어의 첫 부분을 대문자로 시작하고 나머지는 소문자
         ex. MyConstructor()
      - 함수와 메서드는 단어의 첫 부분은 소문자 이어지는 단어의 첫 문자는 대문자를 사용
         ex. myFunction(){…}
      - 변수명은 단어와 단어 사이에 “_”를 넣는 것을 추천한다. – 함수와 변수의 차이점을 금방 알아 볼 수 있다.
        ex. first_name,  company_name, …

3. 그 밖의 명명 규칙
      - 상수 성격의 변수 ( domain 안에서 값이 변경 되어서는 안 되는 변수 )

        ex. PI = 3.14, MAX_WIDTH = 800;
      - 내부에서 사용하는 비 공개 메서드
        ex. _getName()

HTMl에서 Console, Html Element, jQuery Dialog를 통해 로그 보여주는 모듈을 만들었습니다.

(TypeScript 소스 포함)


예제 파일

javascript_Log.rar



Default.html을 실행하면 실행 화면을 볼 수 있습니다.




실행 화면.


값이 인자에 따라 Html Element, Console, jQuery Dialog로 보여 주도록 했으며


마지막 show()를 호출할 때 보여 주도록 되어 있습니다.


<script>
    $(function () {
        var log = new Af.LogWrite.Log('info', 'htmlTag|console|messageDialog', undefined);    //htmlTag|console|messageDialog
        //var log = new Af.LogWrite.Log('error', 'htmlTag');
        log.write('test #1');
        log.write('test #2');
        log.write('test #3');
                
        log.show();
    });
</script>



내부적으로는 

Factory를 만들어서 Console, Element, Dialog를 사용하는 클래스를 반환하도록 하였습니다.



더 추가하거나 개선해야 하는 부분은

Mode(warning, info, error, ..)에 따른 행동과 서버로 로그 정보를 보내주는 기능을 LogWriter를 상속받아 구현하는 것으로 방향을 잡을 수 있습니다.

그리고 RequireJS를 통해서 동적으로 해당 클래스를 불러 오도록 Refactoring 진행하는것도 남았습니다.


'Javascript' 카테고리의 다른 글

[Javascript Pattern] 자바스크립트 패턴 개론 #1  (0) 2013.01.31
AngularJS SF Meetup : Angular UI  (0) 2012.12.02
javascript link  (0) 2012.11.09
RequireJS Optimizer  (0) 2012.11.09
RequireJS를 사용하여 MVC App 만들기  (0) 2012.11.09





Javascript Link를 SkyDrive의 OneNote를 통해서 공유 하도록 하겠습니다.


OneNote Link : Javascript Link 공유(새창 링크)







RequireJS를 사용하여 MVC App 만들기



RequireJS : http://requirejs.org/


원문 : http://verekia.com/requirejs/build-simple-client-side-mvc-app-require-js

한글 : http://zziuni.pe.kr/zziuni/587

'Javascript' 카테고리의 다른 글

AngularJS SF Meetup : Angular UI  (0) 2012.12.02
HTMl에서 Console, Html Element, jQuery Dialog를 통해 로그 보여주기 - TypeScript  (0) 2012.11.19
javascript link  (0) 2012.11.09
RequireJS Optimizer  (0) 2012.11.09
RequireJS란?  (0) 2012.11.09



RequireJS는 


간단하게 한문장으로 설명하자면 "모듈화와 동적 로딩을 지원하는 프레임웍"입니다.


여기에서 모둘화와 동적 로딩은 왜 이슈가 되는 것일까?


  1. 모듈화
    • - 문제점
    1. .서로 호환되는 표준 라이브러리가 없다.
    2. .데이터베이스에 연결할 수 있는 표준 인터페이스가 없다. - Server side
    3. .다른 모듈을 삽입하는 표준적인 방법이 없다.
    4. .코드를 패키징해서 배포하고 설치하는 방법이 필요하다.
    5. .의존성 문제까지 해결하는 공통 패키지 모듈 저장소가 필요하다.

    • - 해결책은?  -> 모듈화가 답
  1. 동적로딩
    • - 문제점
    1. 하나의 HTML 파일에서 용량이 많고 여러가지 Library를 로딩 하는 시간이 많이 갈려 최초 실행 진입이 늦다.

    • - 해결책
    1. 동적으로 필요한 js파일을 로딩하여 최초 실행 진입을 빠르게 한다.
      위 방법은 IE 옛날 버전에서는 상당한 속도 향상을 기대할 수 있지만 최신 브라우저에서는 성능 향상 별로 없다.


위 문제점을 해결하기 위하여 RequireJS 프레임웍이 개발되었다.

그렇지만 RequireJS는 다른 많은 기능들을 함께 제공하고 있다.

(이 기능들에 대해서는 차차 알아 가도록 하겠다.)


RequireJS 링크 : http://requirejs.org/



----------------------------------------------------------------------------------------

위 사항은 RequireJS를 살펴 보면서 개인적으로 알아보고 느꼈던 사항에 대해서 한정됨을 알려 드리며 보다 자세한 사항을 알아 보려면 밑의 "자세한 링크"를 따라가 보시면 보다 많고 정확한 정보를 알 수 있을 것입니다.



자세한 링크

http://helloworld.naver.com/helloworld/12864

http://html5dev.kr/131


+ Recent posts