@Resource 활용 팁

스프링에서 @Autowired와 @Resource. 이 둘의 가장 큰 차이는 하나는 by-type이고, 하나는 by-name이라는 것. 주로 @Autowired를 사용해서 보통 다음과 같이 코딩합니다.

public class Post {

   @Autowired private Cate cate;
   …
}

그런데 만약에 Cate 타입이 두 종류라면.. MainCate, SubCate. 이렇게 나눴다고 치고 위의 코드를 실행하면 에러가 닙니다. NoSuchBean뭐시기 Exception이 나면서 해당 타입의 빈이 1개가 아니다. 라는 예외가 발생하요. 그럴 때 처방으로 보통..

public class Post {

  @Autowired @Qulifier(“mainCate”)
  private Cate maincate
  …

}

이렇게 @Qulifier를 사용하곤 하는데.. 사실 저걸 @Resource로 바꾸면 굉장히 간단해집니다.

public class Post {

  @Resource private Cate maincate
  …

}

캬~~ 간단하죠. @Resource 애노테이션을 사용하려면 jsr250-api.jar 파일을 추가해주면 됩니다. 메이븐을 사용하고 있다면

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>

이렇게 추가해주면 끝..


출처 - http://whiteship.me/?p=11012#comments




Posted by linuxism
,


■ 이벤트 전파 : 여러 요소가 한번의 클릭에 모두 반응하도록 하는 전략

   ▶ 이벤트 캡처링 :  모든 것을 감싸고 있는 최상위의 요소에게 이벤트가 처음으로 주어지고, 그 후에 연속해서 하위 요소로 전달된다.

   ▶ 이벤트 버블링 :  이벤트가 가장 낮은 자식 요소에 처음으로 전달되고, 해당 요소가 반응한 후에, 그 이벤트는 그 부모 요소로 전파

 

■ 이벤트 버블리의 부작용

   이벤트 버블링은 기대하지 않은 결과를 낳을 수 있는데, 특히 mouseover나 mouseout에 대해 엉뚱한 요소가 응답을 하는 경우 더욱 그렇다.

   mouseout 이벤트 핸들러가 <div> 태그에 연결되었다고 가정한다면, 사용자의 마우스 커서가 <div>위에 존재한다면 mouseout핸들러가 예상한 대로

   잘 실행될 것이다. 왜냐하면 <div>는 계층 구조상 가장 높은 위치에 있기 때문이며 다른요소들에게 이 이벤트가 전달되지 않을 것이기 때문.

   이와 반대로 커서가 <a> 요소에 존재하게 된다면 mouseout 이벤트는 <a>태그로 보내진다. 이 이벤트는 버블업 되어 상위에 있는 <span> 태그로도

   전달될 것이고, 그 후에 <div> 태그로도 전달되어 <div>가 가지고 있는 핸들러가 실행된다.  

   <div >

     <span>

       <a>

       </a>

     </span>

   </div>        

   - 해결책 : 일반적인 경우는 hover() 함수를 사용하여 이벤트 전파 범위를 제한할 수 있다.

                  하지만 이벤트를 공간적으로 제한(다른 요소로 전달되는 것을 막는것) 하거나 시간적으로 제한(특정 시점에서 이벤트를 막는것)해야 할

                  특수한 경우 이벤트 객체를 추가하여 문제를 해결할 수 있다.

ex)

  $(document).ready(function(){

$('# switcher')click(function(event){

$('#switcher button').toggleClass('hidden');

});

  });

 

 

■ 이벤트 대상 (event capturing 해결 방법?)

   event 변수 하나를 추가함에 따라 핸들러에서 이벤트 객체를 사용할 수 있게 되었으며 이벤트 객체의 event.target 프로퍼티를 사용하여 이벤트의

   영향을 제어하는데 도움을 받을 수 있다. 이 프로퍼티는 DOM API의 한 부분이지만, 모든 브라우저에서 구현하고 있지는 않다. jQuery는 모든

   브라우저에서 이 프로퍼티를 사용할 수 있도록 이벤트 객체를 확장하고 있다. .target을 사용함으로써 DOM에서는 어느 요소가 이벤트를 처음으로

   받는 요소인지를 (click이벤트 경우 이벤트 실제 아이템)을 알수 있다.

 

ex)

   $(document).ready(function(){

$('#switcher').click(function(event){

    if(event.target == this){

$('#switcher .button').toggleClass('hidden');

    }

});

   });

 

■ 이벤트 전파 멈추게 하기

   이벤트 객체는 버블링 과정을 중단할 수 있도록 하는 .stopPropagation()메서드를 제공한다.

   이 메소드는 순수 자바스크립트의 기능이긴 하지만 모든 브라우저가 지원하는건 아니다. 하지만 JQuery를 사용해서 이벤트 핸들러들을 등록하여

   사용하기만 하면 모든 브라우저에서 완전한 호환성을 갖도록 할 수 있다.

 

ex)

   $(document).ready(function(){

$('#switcher .button').click(function(event){

$('body').removeClass();

if(this.id == 'switcher-narrow'){

$('body').addClass('narrow');

}else if(this.id == 'switcher-large'){

$('body').addClass('large');

}

$('#switcher .button').removeClass('selected');

$(this).addClass('selected');

event.stopPropagation();

});

   });

출처 - http://blog.naver.com/PostView.nhn?blogId=cowhdgk555&logNo=130109534847



Posted by linuxism
,


JavaScript:
세상에서 가장 오해가 많은 프로그래밍 언어

Douglas Crockford
www.crockford.com

번역: Kwang Yul Seo
skyul.tistory.com

Mocha, LiveScript, JScript, ECMAScript 등으로도 불리는 JavaScript는 세상에서 가장 유명한 프로그래밍 언어 중에 하나입니다. 사실상 세상의 모든 개인 컴퓨터에 최소한 하나 이상의 JavaScript 인터프리터가 설치되어 있고 활발하게 사용되고 있습니다. 이러한 JavaScript는 인지도는 전적으로 월드와이드웹(WWW)의 스크립트 언어라는 역할 덕택입니다.

이런 인지도에도 불구하고, JavaScript가 매우 동적이며 객체지향의 범용 프로그래밍 언어라는 사실을 아는 이는 드뭅니다. 이런 사실이 어떻게 비밀이 될 수 있었을까요? 왜 이 프로그래밍 언어는 잘못 이해된 것일까요?

이름

Java- 접두사를 보면 JavaScript가 Java와 어떤 식으로는 연관 관계가 있을 것처럼 보입니다. 즉, JavaScript는 Java의 서브셋이거나 기능이 부족한 버전의 Java라는 인상을 줍니다. 이 이름은 혼란을 주기 위해 의도적으로 지어진 것으로 보이는데, 이런 오해가 혼란을 야기했습니다. JavaScript는 인터프리트되는 자바가 아닙니다. 자바 자체가 인터프리트되는 언어입니다. JavaScript는 Java와는 다른 언어입니다.

Java가 C와 문법적으로 유사하듯이 JavaScript는 Java와 유사합니다. 하지만 Java가 C의 서브셋이 아닌 것처럼 JavaScript도 Java의 서브셋이 아닙니다. JavaScript는 Java(초기의 Oak)과 원래 의도했던 응용 프로그램 부분에서는 Java보다 더 뛰어납니다.

JavaScript는 Java의 고향인 썬마이크로시스템즈(Sun Microsystems)에서 개발된 것이 아닙니다. JavaScript는 네스케이프(Netscape)에서 개발되었습니다. 원래는 LiveScript라고 불렸는데, 이 이름은 그다지 혼란스럽지 않았지요.

-Script 접미사는 JavaScript가 실제 프로그래밍 언어가 아니라 프로그래밍 언어보다 약한 스크립트 언어라는 인상을 줍니다. 하지만 이는 전문화의 문제입니다. C 언어와 비교해 보면, JavaScript는 표현력과 역동성(dynamism)을 위해 성능을 희생한 것입니다.

C 언어의 옷을 입은 Lisp

JavaScript의 C 언어 같은 문법(중괄호와 투박한 for 문을 포함)은 JavaScript가 일반적인 프로시저형 언어로 보이게 합니다. 이는 잘못된 오해인데, 왜냐하면 JavaScript는 C나 Java보다는 Lisp or Scheme와 같은 함수형 언어와 더 유사점이 많기 때문입니다. JavaScript는 리스트 대신에 배열이 있고, 속성 리스트(역주: 일종의 해시테이블) 대신에 오브젝트가 있습니다. 함수가 제1클래스이고, 클로저도 있습니다. 또한 괄호를 맞출 필요 없이 람다(lamda, 익명 함수)를 사용할 수도 있습니다.

고정역할

JavaScript는 네스케이프 네비게이터에서 동작하도록 설계되었습니다. 네스케이프에서의 성공은 JavaScript가 거의 모든 웹브라우저에서 표준 장치가 되도록 만들었습니다. 이는 JavaSciript가 웹 개발언어라는 이미지를 고정해 버렸습니다. JavaScript는 프로그래밍 언어계의 죠지 리브스(George Reeves), 슈퍼맨을 연기한 배우가 되었습니다. 하지만 JavaScript는 웹과 관련되지 않은 대규모의 응용 프로그램 개발에도 잘 어울리는 언어입니다.

움직이는 목표물

JavaScript는 첫 번째 버전은 매우 빈약했습니다. 예외 처리, 내부 함수, 상속 등의 기능이 없었습니다. 현재의 JavaScript는 완전한 객체지향 프로그래밍 언어입니다. 하지만 언어에 대한 여러 의견들은 여전히 예전의 성숙하지 못한 모습에 바탕을 두고 있습니다.

JavaScript 언어에 대한 관리 책임을 맡고 있는 ECMA 위원회는 비록 그 의도는 좋지만 이미 너무 많은 버전이 존재한다는 JavaScript의 가장 큰 문제점을 악화시키는 확장 작업을 하고 있습니다.

설계 오류

완벽한 프로그래밍 언어는 없습니다. JavaScript도 설계 오류를 포함하고 있습니다. 를 자동 타입 변환과 함께 더하기와 문자열 병합이라는 두 가지 의미로 오버로딩한 것, 실수를 저지르기 쉬워서 사용을 피해야 하는 with 문 등이 여기에 해당합니다. 예약어 정책도 너무 까다롭습니다. 정규 표현식 기술 방법과 세미콜론 삽입은 아주 큰 실수입니다. 이런 실수는 프로그래밍 오류를 야기하고, 언어 설계 자체를 의문스럽게 만들게 됩니다. 다행히도, 이런 문제의 상당수는 lint라는 좋은 프로그램으로 완화가 가능합니다.

전체적인 언어 설계는 매우 안전합니다. 놀랍게도, ECMAScript 위원회는 이런 문제를 수정하는데 별로 관심이 없는 것처럼 보입니다. 아마도 그들은 새로운 것을 만드는데 더 관심이 많은 것 같습니다.

잘못된 구현들

JavaScript 초기 구현의 일부는 매우 버그가 많습니다. 이는 언어에 나쁜 영향을 미치고 있습니다. 설상가상으로 이런 구현들이 끔찍히도 버그가 많은 브라우저에 내장되어 있었습니다.

안 좋은 책들

사실상 JavaScript에 관한 거의 모든 책이 엉망입니다. 이 책들은 오류와 나쁜 예제투성이고, 잘못된 방법을 부추깁니다. 언어의 중요한 기능들이 잘못 설명되거나 아에 빠져있는 경우도 흔합니다. 필자는 십여 권의 JavaScript 책을 검토해보았는데, 다음 단 한 권의 책만 추천합니다. JavaScript: The Definitive Guide (5th Edition) by David Flanagan. (필자들에게: 좋은 책을 쓰셨다면 검토본을 보내주세요.)

불충분한 표준

언어의 공식 명세서는 ECMA가 작성하였습니다. 이 명세서는 품질이 매우 나쁩니다. 읽기도 어렵거니와 이해하기는 훨씬 어렵습니다. 이 제대된 책이 없는 문제와도 연결되는데, 저자들이 언어에 대한 그들의 이해를 높이기 위해 표준 문서를 활용할 수 없기 때문입니다. ECMA와 TC39 위원회는 깊이 반성해야 할 것입니다.

초보자들

JavaScript를 작성하는 대부분의 사람들은 개발자가 아닙니다. 그들은 좋은 프로그램을 쓰는 훈련을 받지 못했고 원칙이 부족합니다. JavaScript는 뛰어난 표현력을 가졌기에 그들은 어쨌건 유용한 프로그램을 작성할 수 있습니다. 이는 JavaScript는 단지 초보자들을 위한 것이지 전문가 용은 아니라는 인상을 주었습니다. 이는 사실이 아닙니다.

객체지향

JavaScript는 객체지향일까요? JavaScript는 데이터와 데이터를 처리할 수 있는 메서드를 담을 수 있는 오브젝트를 제공합니다. 오브젝트는 다른 오브젝트를 저장할 수도 있습니다. 클래스는 없지만, 클래스 변수와 메서드를 담을 수 있는 클래스 역할을 하는 생성자가 있습니다. 클래스 기반의 상속 기능은 없지만, 프로토타입 기반의 상속 기능을 제공합니다.

오브젝트 시스템을 만드는 두 가지 주요 방법은 상속(is-a)과 집합(has-a)이 있습니다. JavaScript는 두 가지 방법을 다 지원하지만, 언어의 동적인 속성은 집합(aggregation)일 때 더 빛을 발합니다.

일부에서는 JavaScript가 정보 은닉을 제공하지 않기 때문에 참된 의미의 객체지향이 아니라고 말합니다. 이는 오브젝트에 private 멤버와 메서드가 없다는 뜻입니다. 모든 멤버는 public입니다.

하지만 JavaScript 오브젝트는 private 변수와 private 메소드를 가질 수 있다.로 밝혀졌습니다. 물론, JavaScript는 세상에서 가장 오해가 많은 언어이기에 이를 이해하는 사람은 많지 않습니다.

또한 일부는 JavaScript가 상속을 지원하지 않기 때문에 진정한 의미의 객체 지향 언어라고 말합니다. 하지만 JavaScript는 전통적인 상속 방식뿐만 아니라 다른 코드 재활용 패턴 또한 제공한다. 라는 사실이 밝혀졌습니다.

Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.


출처 - http://home.postech.ac.kr/~skyul/javascript.html


Posted by linuxism
,