1. JDK 설치
http://java.sun.com/javase/downloads/widget/jdk6.jsp
Java SE Development Kit (JDK) 6 를 다운 받아 설치한다.


2. 이클립스 설치

http://www.eclipse.org/downloads/
Eclipse 3.5 (Galileo)
Eclipse IDE for Java Developers 버전 다운로드 후 설치할 디렉토리에 압축을 푼다.
안드로이드에서 WST를 사용하는데 기본으로 WST가 포함되어 있다.
JEE 개발용은 안드로이드 개발에 굳이 사용할 필요는 없다.


3. 이클립스 플러그인(ADT) 인스톨

Eclipse 3.5 (Galileo) 기준
  1. Help/Install New Software
  2. Available Software
  3. Add : https://dl-ssl.google.com/android/eclipse/
  4. Developer Tools 아래 Android Development Tools와 Android Editors가 체크되어있는지 확인
   (https가 안될경우 http로 연결해본다.)


4. 안드로이드 SDK 설치
http://developer.android.com/sdk/index.html(SDK 다운로드)
http://developer.android.com/sdk/installing.html(설치 방법 안내)
현재 최신 릴리즈 버전은 Android 2.1 Platform 이며 다운받아 특정 디렉토리에 압축을 풀고
'SDK Setup.exe'
를 실행한다.
Available Packages 메뉴에서 설치하고자 하는 버전의 패키지 항목들을 설치한다.

- Documentation for Android SDK, API 7, revision 1
- SDK Platform Android 2.1, API 7, revision 1
- Google APIs by Google Inc., Android API 7 revision 1
- Usb Driver package, revision 3

안드로이드 2.0 SDK 부터 새로 생긴 방식으로  각 버전별 에뮬레이터 및 SDK를 별도로 다운로드 받아 사용할 수 있다.
1. Window / Android SDK and AVD Manager 실행
2. Available 패키지에서 설치를 원하는 API 버전 선택 

  (만약 자동 연결, 설치에 실패하는 경우 Settings 메뉴의 Force https://... 체크한 후 다시 설치한다.)

3. Install Selected

도스창 명령행의 사용을 위해 시스템 Path 'C:\Java\android-sdk-windows\tools\' 추가한다.


5. 안드로이드 SDK 이클립스  설정
  1. Eclipse의 메뉴 Windows/Preference 실행
  2. 왼쪽 탭에서 Android 선택
  3. Browse를 한후 SDK를 설치한 디렉토리 선택




'Android' 카테고리의 다른 글

[Android] Intent  (0) 2010.03.25
[Android] Data Storage  (0) 2010.02.25
[Android] 안드로이드 개발자 가이드 한글누리집  (1) 2010.02.22
[Android] 안드로이드란?  (1) 2010.02.02
[Android] 안드로이드 개발 관련 링크  (1) 2010.02.01
Posted by finewoo
,

iBatis에서 Dynamic 기능중 iterate 노드가 있다.
예를 들어
"select * from tableName where idx in ('3','6','9')"
와 같이 조건절에 or절이 아닌 in 으로 쿼리를 구성할때 iBatis에서는 iterate 구문으로 구현이 가능하다.

먼저 파라메터클래스로 넘겨줄 값을 배열형식의 맵으로 생성한다.


ArrayList<String> idxList = new ArrayList<String>();
idxList.add("3");
idxList.add("6");
idxList.add("9");
....
HashMap<String, ArrayList<String>> idxMap = new HashMap<String, ArrayList<String>>() ;
idxMap.put("idxArr", idxList);


그리고 iBatis query.xml 파일에 아래처럼 작성한다.


<select id="getList" parameterClass="idxMap" resultClass="dataVO">
   select * from table
  <dynamic prepend="where">
    <isNotEmpty prepend="and" property="idxArr">
      <iterate prepend=" idx in " property="idxArr" open="(" close=")" conjunction=",">
        #idxArr[]#
      </iterate>
    </isNotEmpty>
  </dynamic>
</select>


그러면 iBatis에서 내부적으로
select * from table where idx='3' or idx='6' or idx='9'
이런 쿼리로 만들어서 실행하게 된다.
위에서 dynamic 의 prepend 속성으로 "where" 가 지정되어 있지만 하위 요소의 조건이 하나라도 만족하지 않으면 sql 문에 추가되지 않는다. 그리고 하위 요소로 isNotNull 태그에 prepend="and" 는 처음 true 가 되는 조건의 prepend 는 parent 인 dynamic 의 prepend 인 "where" 로 덮어진다.


$property명$ 로 작성된 영역은 #property명# 와 같이 prepared statement 의 바인드 변수로 처리되는 것이 아니라
SQL 문 자체에 텍스트가 replace 되어 처리됨에 유의한다.





Posted by finewoo
,

이클립스에서 *.properties 파일을 생성하면 기본 인코딩이 ISO-8859-1 형식으로 설정된다.
이는 규약때문이다. *.properties 파일은 원래 ISO-8859-1 로 저장되어야 한다.

따라서 한글 같은 경우에 유니코드 이스케이프 시퀀스를 이용해서 기록해야 한다.
그렇지 않으면 java.util.Properties 객체로 읽어올때 제대로 읽혀지지 않는다. 자바의 Properties 클래스를 이용하는 한
무조건 ISO-8859-1 인코딩으로만 인식하고 읽기 때문에 이문제는 피할 수는 없을것 같다.

모든 작업파일들의 기본 문자인코딩 설정에 대해 확인하고자 하면
이클립스의 Window -> Preferences
Content Types -> Text  트리 메뉴를 확인해 보면 Java, JSP 혹은 JavaScript 등 여러 파일형식을 확인할 수 있다.

위에서 한글같은 경우 유니코드 이스케이프 시퀀스를 이용해야 한다고 했는데
native2ascii 명령으로 iso-8859-1로 변환할 수 있다. 아래와 같은 방식이다.

개발 원본 파일 : example.properties-in 의
example.message       = 잘못된 값을 입력하셨습니다.

native2ascii example.properties-in >example.properties 실행하면

실제 설정 파일 : example.properties
example.message       = \si734\ubaf7 \ub53c\ubwr3\ub678\uc318\ub1b4 \.......................................


위의 방식도 가능하지만 매번 번거로운 작업이므로 실제 개발에서는 사실상 이클립스의 플러그인을 사용한다.
properties 파일 작성시, 변환을 자동으로 해주는 플러그인이 몇가지 있다.
eclipse properties 검색하면 여러 정보를 찾을 수 있을 것이다.

그중에 Propedit(http://propedit.sourceforge.jp/)가 비교적 많이 알려지고 사용되는 파일 인코딩 관련 플러그인이 있다.

- 플러그인 설치(Eclipse Galileo 기준)

1. Eclipse > Help > Install New Software 메뉴 선택
2. Add 클릭 > 주소창에 http://propedit.sourceforge.jp/eclipse/updates/ 를 입력 후 추가.
3. 목록에서 PropertiesEditor를 선택하고 설치.

설치가 완료되고 Properties 파일을 열면 파일탭에 P라는 아이콘이 나타난다.
이제 Properties 파일에 한글을 입력할수가 있게된다.
파일 저장시 자동으로 변환해 주는데 사용자에게는 한글로 변환해서 보여주며. 실제 소스에는 iso-8859형식으로 저장된다.



Posted by finewoo
,


What is Android?

Android is a software stack for mobile devices that includes an operating system, middleware and key applications. The Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
[출처]http://developer.android.com/guide/basics/what-is-android.html


안드로이드는 오퍼레이팅 시스템, 미들웨어와 키 애플리케이션을 포함한 모바일 장치를 위한 소프트웨어 스택이다.
안드로이드 SDK는 자바 프로그래밍 언어를 사용하는 안드로이드 플랫폼에서 애플리케이션 개발을 시작하기 위한 필요한 도구와 API들을 제공한다.

단순하게 본다면 PC에서의 리눅스나 윈도우와 같은 운영체제라고 생각해도 된다.
즉, 안드로이드 플랫폼은 운영체제, 미들웨어, 키(Key)애플리케이션들을 포함한 모바일 디바이스를 위한 소프트웨어 집합이다.

안드로이드를 개발의 입장에서 본다면 애플리케이션 개발과 플랫폼 개발로 나눌 수 있다.
애플리케이션 개발에 있어서 안드로이드는 JAVA를 기반으로 한 소프트웨어 프레임워크이며 플랫폼 개발에서는 휴대폰의 새로운 서비스, 기능을 창출해 내는 OPEN SOURCE 프로젝트라고 할 수 있다.
안드로이드는 Linux를 OS로 채택하고 있으며 Google사가 중심으로 수많은 단체로 결성된 OHA(Open Handset Alliance)에 의해 개발되고 있다.

여담으로  '안드로이드'의 희랍 어원적인 의미는 '인간을 닮은 것'이라는 뜻인데,19세기의 작가 빌리에드릴라당이 처음으로 과학소설에 사용했다. <미래의 이브> 이곳에서 등장하는 여성 로봇의 이름이 '안드로이드'이다.
그래서 구글의 안드로이드 로고에도 이 로봇 형상이 들어가게 된다.



Posted by finewoo
,

Android.com
http://www.android.com/
안드로이드 공식 웹사이트.
개발자 웹사이트 및 안드로이드 마켓 링크

Android Developers
http://developer.android.com/index.html
안드로이드 개발자 웹사이트
SDK 다운로드, 리소스, 리퍼런스, 가이드등 제공

Android Market
http://www.android.com/market/
안드로이드 마켓. 무료 및 유료 안드로이드 애플리케이션 장터.

구글 안드로이드
http://code.google.com/android/
구글의 안드로이드 코드사이트

안드로이드펍 커뮤니티
http://www.androidpub.com/
안드로이드관련 사용자 및 개발자등 커뮤니티 사이트
개발과 관련하여 비교적 많은 자료가 등록.

안드로이드 클럽
http://www.androidclub.co.kr/

안드로이드 사이드
http://www.androidside.com/

코리아 안드로이드
http://www.kandroid.org/
Posted by finewoo
,

Java Exception handling

자바는 try catch 구문을 사용하여 예외 처리(exception handling)을 하게 되어 있다. 예외가 발생할 수 있는곳에는 모두 예외처리를 하는 것이 좋긴하지만, 개발자들이 잘 알지 못하고 사용한다면 오히려 시스템 성능을 떨어뜨리는 독이 될 수도 있다.

예외처리를 하는데 있어서 몇가지 고려해야 할 점을 알아보자.

예외 처리(exception handling)시에 지켜주어야할 순서가 있고, 순서가 잘못되면 정확한 예외 메시지를 얻을 수 없게 되고, 또한 코드도 복잡해 진다.
일반적으로 예외를 처리에 있어 어떤 메소드를 호출하고 실행할 때, 그 메소드가 어떤 결과값을 반환하고, 어떠한 경우에 예외가 발생하는지를 정확히 알고 있어야 한다. 
즉, 어떤 위치에서 예외가 발생했는지를 정확하게 알 수 있어야 한다.
따라서 다중으로 예외를 선언한 경우에 주의가 필요하다. 만약 어떤 예외를 상속 받아서 새로운 Exception 들을 만들었다면, 상속 받았던 에외들을 먼저 선언해 주어야 한다. 그렇지 않다면, 원하지 안은 결과를 얻을 수도 있다.

아래와 같은 예외처리 코드가 있다고 하자.
JVM 에서는 첫번째 Catch블록에서 부터 호출된 예외를 처리한 Catch블럭을 찾아 내려온다. 만약 처리 가능한 예외 블록이 있다면, 비교를 멈추고 catch블록에 정의된 예외처리 코드들을 실행하게 된다.
따라서 만약에 첫번째 catch블록이 catch(Exception e)라고 정의되어 있다면, 컴파일러는 다른 catch블록이 전혀 필요 없다고 여기고 그 아래 ArrayIndexOutOfBoundsExceptionn e1을 처리하지 않을 것이다.

try {
      code...;
} catch (Exception e) {
     exception handling...;
} catch (ArrayIndexOutOfBoundsExceptionn e1) {
     exception handling...;
}

이런 순서를 모르고서 코드를 작성한다면 의미없는 코드가 되고 결국은 나중에 코드의 문제점을 찾는데 시간이 많이 소요된다.


자바를 개발시에 IDE툴을 많이 사용하게 된다. IDE툴에서는 자동으로 예외처리 코드를 생성해준다

java.io.File file = new java.io.File("c:\\file.txt");
try{
    file.getCanonicalFile();
catch (IOException e) {
    e.printStackTrace();
}

한가지 주위해야 하는 것은 위와 같이 "e.pringStackTrace()"를 툴에서 자동으로 생성해 주었다고, 예외 처리가 모두 끝나는 것이 아니다. 
처리해야할 예외에 대한 후 작업이 있다면 별도 코드를 작성해야 하며 예외를 Log에 남기는 부분도 필요하다. 
Logging또한 "e.printStackTrace()"등의 IDE에서 만들어주는 코드를 그대로 남기는데, 어떤 경우에 예외가 호출되었는지에 대한 정확한 정보를 남기기 위해서 개발자가 나중에 알수 있는 형태의 메시지 형태로 재정의 해서 남겨야 한다.

 예외가 발생했을 경우 가장 판단하기 어려운 때는 try-catch문을 잘못 중첩해서 사용하는 경우인데, 이 경우는 가독성도 떨어지지만, 예외 처리 코드를 분석하기 매우 어렵기 때무에 되도록이면 피하는 것이 좋다.




Posted by finewoo
,

이클립스에서 패키지명이나 클래스 파일을 Refactor시에 경고창에 아래 문구가 포함되는 경우

... class file name must end with .class


에러 메시지와 위의 경고창이 뜨는 경우 해결법

이클립스가 열려있는 경우 먼저 이클립스를 닫는다.
작업디렉토리의 workspace\.metadata\.plugins\org.eclipse.jdt.core 경로로 이동한다.
디렉토리내 모든 *.index 파일과 savedIndexNames.txt 파일을 삭제한다.
이클립스를 재시작 한다.

리팩토링 작업이 정상적으로 이루어진다. --;






Posted by finewoo
,

jQuery

기타/jQuery 2009. 12. 29. 17:59

[출처] http://www.ibm.com/developerworks/kr/library/x-ajaxjquery.html
[원문] Jesse Skinner, Web Developer, Freelance



jQuery는 JavaScript 라이브러리로서 JavaScript™와 Asynchronous JavaScript + XML (Ajax) 프로그래밍을 단순화 하는데 도움이 됩니다. JavaScript 라이브러리와는 달리, jQuery는 복잡한 코드를 간결하게 표현할 수 있는 독특한 철학이 있습니다. jQuery 원리, 기능과 특징을 배우고, 일반적인 Ajax 태스크도 수행하며, 플러그인으로 jQuery를 확장하는 방법도 알아봅니다.




jQuery란 무엇인가?

2006년 초, John Resig가 만든 jQuery는 JavaScript 코드로 작업하는 사람들에게는 훌륭한 라이브러리이다. 여러분이 JavaScript 언어 초보자라서 라이브러리가 Document Object Model (DOM) 스크립팅과 Ajax의 복잡성을 다루어주기를 원하든지, 숙련된 JavaScript 구루로서 DOM 스크립팅과 Ajax의 반복성에 지루해졌다면, jQuery가 제격이다.

jQuery는 코드를 단순하고 간결하게 유지한다. 많은 반복 루프와 DOM 스크립팅 라이브러리 호출을 작성할 필요가 없다. jQuery를 사용하면 매우 적은 문자로 표현할 수 있다.

jQuery 철학은 매우 독특하다. 무엇이든 단순하고 재사용 가능한 것으로 유지하기 위해 디자인 되었다. 여러분이 이러한 철학을 이해하고 여기에 편안함을 느낀다면, jQuery가 여러분의 프로그래밍 방식을 충분히 향상시킬 수 있다.




위로


단순화

다음은 jQuery가 여러분의 코드에 어떤 영향을 미치는지를 보여주는 예제이다. 페이지의 모든 링크에 클릭 이벤트를 붙이는 것 같이 단순하고 일반적인 것을 수행하려면, 플레인 JavaScript 코드와 DOM 스크립팅을 사용하는 것이 낫다. (Listing 1)


Listing 1. jQuery 없는 DOM 스크립팅
                
var external_links = document.getElementById('external_links');
var links = external_links.getElementsByTagName('a');
for (var i=0;i < links.length;i++) {
    var link = links.item(i);
    link.onclick = function() {
        return confirm('You are going to visit: ' + this.href);
    };
}

Listing 2는 같은 기능에 jQuery를 사용한 모습이다.


Listing 2. jQuery를 사용한 DOM 스크립팅 
                
$('#external_links a').click(function() {
    return confirm('You are going to visit: ' + this.href);
});

놀랍지 않은가? jQuery를 사용하면 복잡하지 않게 코드로 표현하고자 하는 것만 나타낼 수 있다. 엘리먼트를 반복할 필요가 없다. click() 함수가 이 모든 것을 관리한다. 또한, 다중 DOM 스크립팅 호출도 필요 없다. 여기에서 필요한 것은 엘리먼트가 어떻게 작동하는지를 설명하는 짧은 스트링이다.

이 코드로 어떻게 작업이 수행되는지를 이해하기는 조금 어렵다. 우선, $() 함수가 있어야 한다. 이것은 jQuery에서 가장 강력한 함수이다. 대게, 이 함수를 사용하여 문서에서 엘리먼트를 선택한다. 이 예제에서, 이 함수는 Cascading Style Sheets (CSS) 신택스를 포함하고 있는 스트링으로 전달되고, jQuery는 효율적으로 이 엘리먼트를 찾는다.

CSS 셀렉터의 기본을 이해하고 있다면, 이 신택스가 익숙할 것이다. Listing 2에서, #external_links는 external_links의 id를 가진 엘리먼트를 찾는다. a 앞에 있는 공간은 jQuery에게 external_links 엘리먼트 내의 모든 <a> 엘리먼트를 찾도록 명령한다. 영어와 DOM은 장황하지만, CSS에서는 매우 간단하다.

$() 함수는 CSS 셀렉터와 매치하는 모든 엘리먼트를 포함하고 있는 jQuery 객체를 리턴한다. jQuery 객체는 어레이와 비슷하지만, 수 많은 특별한 jQuery 함수들이 포함된다. 예를 들어, click 함수를 호출함으로써 클릭 핸들러 함수를 jQuery 객체의 각 엘리먼트에 할당할 수 있다.

또한, 엘리먼트나 엘리먼트의 어레이를 $() 함수로 전달하면, 이것은 엘리먼트 주위에 jQuery 객체를 래핑할 것이다. 이 기능을 사용하여 window 객체 같은 것에 jQuery 함수를 적용하고 싶을 것이다. 일반적으로 이 함수를 다음과 같이 로드 이벤트에 할당한다.

window.onload = function() {
    // do this stuff when the page is done loading
};

jQuery를 사용하면, 같은 코드도 다음과 같이 된다.

$(window).load(function() {
    // run this when the whole page has been downloaded
});

이미 알고 있었겠지만, 윈도우가 로딩하기를 기다리는 일은 매우 지루한 일이다. 전체 페이지가 로딩을 끝마쳐야 하기 때문이다. 여기에는 페이지의 모든 이미지들도 포함된다. 가끔, 이미지 로딩을 먼저 끝내고 싶지만, 대부분의 경우 Hypertext Markup Language (HTML)만 로딩해야 한다. jQuery는 문서에 특별한 ready 이벤트를 만듦으로써 이 문제를 해결한다.

$(document).ready(function() {
    // do this stuff when the HTML is all ready
});

이 코드는 document 엘리먼트 주위에 jQuery 객체를 만들고, HTML DOM 문서가 준비될 때 함수를 설정하여 인스턴스를 호출한다. 이 함수를 필요한 만큼 호출할 수 있다. 진정한 jQuery 스타일에서, 지름길은 이 함수를 호출하는 것이다. 함수를 $() 함수로 전달한다.

$(function() {
    // run this when the HTML is done downloading
});

지금까지, $() 함수를 사용하는 세 가지 방법을 설명했다. 네 번째 방법은, 스트링을 사용하여 엘리먼트를 만드는 것이다. 결과는, 그 엘리먼트를 포함하고 있는 jQuery 객체가 된다. Listing 3은 문단을 페이지에 추가하는 예제이다.


Listing 3. 간단한 문단을 생성하여 붙이기 
                
$('<p></p>')
    .html('Hey World!')
    .css('background', 'yellow')
    .appendTo("body");

이전 예제에서 파악했겠지만, jQuery의 또 다른 강력한 기능은 메소드 체인(method chaining.)이다. jQuery 객체에 대해 메소드를 호출할 때마다, 이 메소드는 같은 jQuery 객체를 리턴한다. jQuery 객체에 다중 메소드를 호출하고 싶다면 셀렉터를 다시 입력하지 않고 이를 수행할 수 있다.

$('#message').css('background', 'yellow').html('Hello!').show();




위로



HTML 애니메이션

jQuery를 사용하여 기본적인 애니메이션과 효과를 다룰 수 있다. 애니메이션 코드의 중심에는 animate() 함수가 있는데, 이는 숫자로 된 CSS 스타일 값을 바꾼다. 예를 들어, 높이, 넓이, 폭, 위치를 움직일 수 있다. 또한, 애니메이션의 속도를 밀리초 또는 사전 정의된 속도(느림, 보통, 빠름)로 지정할 수 있다.

다음은, 엘리먼트의 높이와 넓이를 동시에 움직이게 하는 예제이다. 시작 값은 없고 종료 값만 있다. 시작 값은 엘리먼트의 현재 크기에서 가져온다. 여기에도 콜백 함수를 첨부했다.

$('#grow').animate({ height: 500, width: 500 }, "slow", function(){
    alert('The element is done growing!');
});

jQuery는 빌트인 함수를 사용하여 일반적인 애니메이션도 더욱 쉽게 만든다. show()와 hide() 엘리먼트를 즉각적으로 또는 지정된 속도로 사용할 수 있다. fadeIn()과 fadeOut() 또는 slideDown()slideUp()을 사용하여 엘리먼트를 나타나게 하거나 사라지게 할 수 있다. 다음은 네비게이션의 slidedown 예제이다.

$('#nav').slideDown('slow');




위로


DOM 스크립팅과 이벤트 핸들링

jQuery는 DOM 스크립팅과 이벤트 핸들링을 단순화하는데 제격이다. DOM의 트래버스와 조작이 쉽고, 이벤트의 첨부, 제거, 호출은 매우 자연스러운 일이며, 직접 수행하는 것보다 에러도 적게 발생한다.

기본적으로 jQuery는 DOM 스크립팅으로 수행하는 일들을 더욱 쉽게 수행할 수 있도록 해준다. 엘리먼트를 생성하고 append() 함수를 사용하여 이들을 다른 엘리먼트로 연결할 수 있고, clone()을 사용하여 엘리먼트를 중복시키고, 콘텐트를 html()로 설정하고, empty() 함수로 콘텐트를 삭제하고, remove() 함수로 엘리먼트를 삭제하고, wrap() 함수를 사용하여 또 다른 엘리먼트로 엘리먼트를 래핑한다.

DOM을 트래버스 함으로써 jQuery 객체의 콘텐트를 변경할 때 여러 함수들을 사용할 수 있다. 엘리먼트의 siblings()parents()children()을 사용할 수 있다. 또한, next() 또는 prev() sibling 엘리먼트도 선택할 수 있다. 아마도 가장 강력한 것은 find() 함수일 것이다. jQuery 셀렉터를 사용하여 jQuery 객체의 엘리먼트 종속 관계들을 통해 검색할 수 있다.

이 함수는 end() 함수와 사용될 때 더욱 강력해진다. 이 함수는 실행 취소 함수와 비슷하고, find() 또는 parents() 또는 다른 트래버싱 함수들을 호출하기 전에 가졌던 jQuery 객체로 돌아간다.

메소드 체인과 함께 사용되면, 복잡한 연산도 단순하게 보이게 할 수 있다. Listing 7은 로그인 폼을 찾고 이와 관련한 여러 엘리먼트를 조작하는 예제이다.


Listing 7. DOM의 트래버스와 조작 
                
$('form#login')
    // hide all the labels inside the form with the 'optional' class
    .find('label.optional').hide().end()

    // add a red border to any password fields in the form
    .find('input:password').css('border', '1px solid red').end()

    // add a submit handler to the form
    .submit(function(){
        return confirm('Are you sure you want to submit?');
    });

믿을 수 있는지 모르겠지만, 이 예제는, 공백을 사용한 하나의 연결된 코드 라인일 뿐이다. 우선, 로그인 폼을 선택했다. 그리고 나서, 이 안에 선택 레이블을 찾고, 이들을 숨긴 다음, end()를 호출하여 폼으로 돌아가게 하였다. 패스워드 필드를 찾았고, 보더를 빨간색으로 한 다음, 다시 end()를 호출하여 폼으로 돌아갔다. 마지막으로, 제출 이벤트 핸들러를 폼에 추가했다. 여기에서 특히 재미있는 부분은 jQuery가 모든 쿼리 연산들을 최적화 하기 때문에, 여러분은 모든 것이 서로 잘 연결될 때 엘리먼트를 두 번 찾을 필요가 없다.

공통 이벤트 핸들링은 click()submit()mouseover() 같은 함수를 호출하고 여기에 이벤트 핸들러 함수를 전달하는 것만큼 단순하다. 게다가, bind('eventname', function(){})을 사용하여 커스텀 이벤트 핸들러를 할당하는 옵션도 있다. unbind('eventname')를 사용하여 특정 이벤트를 제거하거나, unbind()를 사용하여 모든 이벤트를 제거할 수 있다. 이것과 기타 함수들을 사용하는 다른 방법들은, jQuery 애플리케이션 프로그램 인터페이스(API) 문서를 참조하라. (참고자료)




위로


jQuery 셀렉터의 힘 활용하기

#myid 같은 아이디 또는 div.myclass 같은 클래스 이름으로 엘리먼트를 선택한다. 하지만, jQuery는 하나의 셀렉터에서 거의 모든 엘리먼트 조합을 선택할 수 있도록 하는 복잡하고도 완벽한 셀렉터 신택스를 갖고 있다.

jQuery의 셀렉터 신택스는 CSS3과 XPath에 기반하고 있다. CSS3과 XPath 신택스를 더욱 잘 안다면, jQuery 사용이 더욱 수월해진다. CSS와 XPath를 포함하여 jQuery 셀렉터의 전체 리스트를 보려면 참고자료 섹션을 참조하라.

CSS3에는 모든 브라우저가 지원하지 않는 신택스가 포함되어 있기 때문에, 이를 자주 볼 수 없다. 하지만, jQuery에서 CSS3을 사용하여 엘리먼트를 선택한다. jQuery는 고유의 커스텀 셀렉터 엔진을 갖고 있다. 예를 들어, 테이블의 모든 빈 컬럼 안에 대시(dash)를 추가하려면, :empty pseudo-selector를 사용한다.

$('td:empty').html('-');

특정 클래스를 갖고 있지 않은 모든 엘리먼트를 찾는다면? CSS3은 이를 위한 신택스도 있다. :not pseudo-selector를 사용하는 것이다. 다음은 required의 클래스를 갖고 있지 않은 모든 인풋을 숨기는 방법이다.

$('input:not(.required)').hide();

또한, CSS에서처럼 다중 셀렉터를 콤마를 사용하여 하나로 연결시킬 수 있다. 다음은 이 페이지에서 모든 리스트 유형들을 동시에 숨기는 예제이다.

$('ul, ol, dl').hide();

XPath는 하나의 문서에서 엘리먼트를 찾는 강력한 신택스이다. CSS와는 다르며, CSS로 수행할 수 없는 몇 가지 일을 수행할 수 있다. 보더를 모든 체크 박스의 부모 엘리먼트에 추가하려면, XPath의 /.. 신택스를 사용할 수 있다.

$("input:checkbox/..").css('border', '1px solid #777');

가독성 있는 테이블을 만들려면, 다른 클래스 이름을 테이블의 모든 짝수 또는 홀수 행에 붙인다. 이를 다른 말로 테이블의 스트라이핑(striping)이라고 한다. jQuery를 사용하면 :odd pseudo-selector 덕택에 쉽게 수행할 수 있다. 아래 예제는 테이블의 모든 홀수 행의 백그라운드를 striped 클래스를 사용하여 변경한다.

$('table.striped > tr:odd').css('background', '#999999');

jQuery 셀렉터로 코드를 어느 정도 단순화 할 수 있는지를 보았다. 어떤 엘리먼트를 선택하든지 간에, 하나의 jQuery 셀렉터를 사용하여 이를 정의하는 방법도 찾을 수 있다.




위로


플러그인으로 jQuery 확장하기

대부분의 소프트웨어와는 달리, jQuery용 플러그인 작성은 복잡한 API를 사용해야 하는 힘든 일이 아니다. 사실, jQuery 플러그인은 작성하기가 쉬워서 몇 가지만 작성하면 코드를 더욱 단순하게 유지할 수 있다. 다음은 여러분이 작성할 수 있는 가장 기본적인 jQuery 플러그인이다.

$.fn.donothing = function(){
    return this;
};

단순하지만, 이 플러그인은 약간의 설명이 필요하다. 우선, 함수를 모든 jQuery 객체에 추가하려면, 여기에 $.fn을 할당하고, 이 함수는 this (jQuery 객체)를 리턴하여 이것이 메소드 체인을 깨트리지 않도록 해야 한다.

이 예제를 기반으로 쉽게 구현할 수 있다. css('background')를 사용하는 대신 플러그인을 작성하여 백그라운드를 바꾸려면, 다음을 사용한다.

$.fn.background = function(bg){
    return this.css('background', bg);
};

css()에서 값을 리턴할 뿐이다. 이것은 이미 jQuery 객체를 리턴하기 때문이다. 따라서, 메소드 체인은 여전이 잘 작동한다.

여러분은 반복 작업이 있을 경우에 jQuery 플러그인을 사용하기 바란다. 예를 들어, 같은 일을 여러 번 수행하기 위해 each() 함수를 사용하고 있다면 플러그인을 사용해도 된다.

jQuery 플러그인을 작성이 쉽기 때문에, 여러분이 사용할 수 있는 것도 수백 가지나 존재한다. jQuery는 탭, 곡선형 코너, 슬라이드 쇼, 툴 팁, 날짜 셀렉터, 기타 여러분이 상상하고 있는 모든 것을 위한 플러그인이 있다. 플러그인 리스트는 참고자료 섹션을 참조하기 바란다.

가장 복잡하고 광범위하게 사용되는 플러그인은 Interface이다. 이것은 정렬, 드래그&드롭 기능, 복합 효과, 기타 복잡한 사용자 인터페이스(UI)를 핸들하는 애니메이션 플러그인이다. Interface가 jQuery를 위한 것이라면 Prototype에는 Scriptaculous가 있다.

또한 Form 플러그인도 대중적이고 유용하다. 이것으로 Ajax를 사용하여 백그라운드에서 폼을 쉽게 제출할 수 있다. 이 플러그인은 폼의 제출 이벤트를 하이재킹 하고, 다른 인풋 필드를 찾고, 이들을 사용하여 Ajax 호출을 구현하는 상황에 사용된다.



Posted by finewoo
,


[출처] http://www.ibm.com/developerworks/kr/library/x-ajaxjquery.html


Ajax로 단순하게!

Ajax는 jQuery를 사용하면 더 단순해 질 수 있다. jQuery에는 쉬운 것도 쉽게 복잡한 것도 가능한 단순하게 만드는 유용한 함수들이 많이 있다.

Ajax에서 사용되는 방식은 HTML 청크를 페이지 영역에 로딩하는 것이다. 여러분이 필요로 하는 엘리먼트를 선택하고 load() 함수를 사용하는 것이다. 다음은 통계를 업데이트 하는 예제이다.

$('#stats').load('stats.html');

일부 매개변수들을 서버 상의 페이지로 전달해야 할 경우가 종종 있다. jQuery를 사용하면 이는 매우 간단하다. 필요한 메소드가 어떤 것인지에 따라서 $.post()와 $.get() 중 선택한다. 선택적 데이터 객체와 콜백 함수를 전달할 수도 있다. Listing 4는 데이터를 보내고 콜백을 사용하는 예제이다.


Listing 4. Ajax를 사용하여 데이터를 페이지로 보내기 
                
$.post('save.cgi', {
    text: 'my string',
    number: 23
}, function() {
    alert('Your data has been saved.');
});

복잡한 Ajax 스크립팅을 해야 한다면, $.ajax() 함수가 필요하다. xmlhtmlscriptjson을 지정할 수 있고, 여러분이 바로 사용할 수 있도록 jQuery가 자동으로 콜백 함수에 대한 결과를 준비한다. 또한,beforeSenderrorsuccesscomplete 콜백을 지정하여 사용자에게 Ajax에 대한 더 많은 피드백을 제공할 수 있다. 게다가, Ajax 요청의 타임아웃이나 페이지의 "최종 변경" 상태를 설정하는 매개변수들도 있다.Listing 5는 필자가 언급했던 매개변수를 사용하여 XML 문서를 검색하는 예제이다.


Listing 5. $.ajax()를 사용하여 복잡한 Ajax를 단순하게
                
$.ajax({
    url: 'document.xml',
    type: 'GET',
    dataType: 'xml',
    timeout: 1000,
    error: function(){
        alert('Error loading XML document');
    },
    success: function(xml){
        // do something with xml
    }
});

콜백 성공으로 XML을 받으면, jQuery를 사용하여 HTML에서 했던 것과 같은 방식으로 XML을 볼 수 있다. 이는 XML 문서 작업을 쉽게 하며 콘텐트와 데이터를 웹 사이트로 쉽게 통합시킨다. Listing 6은 리스트 아이템을 XML의 <item> 엘리먼트용 웹 페이지에 추가하는 success 함수에 대한 확장 모습이다.


Listing 6. jQuery를 사용하여 XML 작업하기 
                
success: function(xml){
    $(xml).find('item').each(function(){
        var item_text = $(this).text();

        $('<li></li>')
            .html(item_text)
            .appendTo('ol');
    });
}






'Language > JavaScript' 카테고리의 다른 글

[Ajax] iframe 과의 요소 접근  (0) 2012.09.17
[텍스트 에디터] notepad++  (0) 2010.11.30
[JavaScript] Class 정의  (0) 2010.11.26
[JavaScript] 이미지 미리보기  (2) 2010.04.27
javascript minifier  (0) 2009.12.03
Posted by finewoo
,

위키백과(우리 모두의 백과사전)  -- 인용

아파치 log4j

 개발자  아파치 소프트웨어 재단
 최근 버전  1.2.15 / 2007년 9월 29일
 운영체제  크로스 플랫폼
 라이선스  아파치 2.0 라이선스
 웹사이트  http://logging.apache.org/log4j


log4j는  자바기반 로깅 유틸리티이다. 디버그용 도구로 주로 사용되고 있다.
log4j의 최근 버전에 의하면 높은 등급에서 낮은 등급으로의 6개 로그 레벨을 가지고 있다. 
설정 파일에 대상별(자바에서는 패키지)로 레벨을 지정이 가능하고 그 등급 이상의 로그만 저장하는 방식이다.

6개의 로그 레벨

FATAL
ERROR
WARN
INFO
DEBUG
TRACE



Log4J의 구조

[출처]http://kjunine.net/tag/log4j.properties


Logger

Log Message를 출력하는 방식을 분류하는 단위
Class 혹은 Package 단위로 Logger를 나눌 수 있어요.
그리고 출력할 Log Message의 Level을 지정할 수 있어요.

Appender

Log Message를 실제로 출력하는 녀석
Console, File, DB 등에 Log Message를 출력할 수 있어요.
각 Logger마다 다른 Appender를 설정해서
Class 혹은 Package 별로 다른 출력 방식을 적용할 수 있어요.

Layout

Log Message의 형태
Text, HTML 등의 형태로 Log Message를 출력할 수 있어요.


log4j.properties 설정

# Root Logger
log4j.rootLogger=INFO
# 바로 위처럼 Root Logger에 어떤 Appender도 설정하지 않으면 Root Logger는 Log Message를 출력하지 않아요.
# Console에서조차 다른 Package의 Log Message에는 관심이 없다면 위와 같이 해요. ^^/

# Custom Logger
log4j.logger.kjunine.test=INFO, console
# kjunine.test Package 하위의 Class에서만 Log Message를 출력해요.
log4j.logger.kjunine.test.sample_1=INFO, file-1
log4j.logger.kjunine.test.sample_2=INFO, file-2
# 각 Package 마다 다른 Appender를 적용시켜서 Package 별로 다른 파일에 Log Message를 출력해요.

# Console Appender 
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n

# File Appender
log4j.appender.file-1=org.apache.log4j.RollingFileAppender
log4j.appender.file-1.File=test-1.log
log4j.appender.file-1.MaxFileSize=10MB
log4j.appender.file-1.MaxBackupIndex=10
log4j.appender.file-1.layout=org.apache.log4j.PatternLayout
log4j.appender.file-1.layout.ConversionPattern=%d %p [%c] - %m%n

# File Appender
log4j.appender.file-2=org.apache.log4j.RollingFileAppender
log4j.appender.file-2.File=test-2.log
log4j.appender.file-2.MaxFileSize=10MB
log4j.appender.file-2.MaxBackupIndex=10
log4j.appender.file-2.layout=org.apache.log4j.PatternLayout
log4j.appender.file-2.layout.ConversionPattern=%d %p [%c] - %m%n





Posted by finewoo
,