JSONP를 사용한 도메인 간 통신, Part 1: JSONP와 jQuery의 결합으로 강력한 매시업 빠르게 만들기

http://www.ibm.com/developerworks/kr/l ··· sonp1%2F

소개

Ajax(Asynchronous JavaScript and XML)는 흔히 Web 2.0 사이트라고 하는 새로운 세대의 웹 사이트를 선도하는 핵심 기술이다. Ajax를 사용하면 웹 애플리케이션의 표시 및 동작에 영향을 주지 않고 백그라운드에서 데이터를 검색할 수 있다. 데이터는 클라이언트 측 JavaScript에서 HTTP로 원격 서버에 연결하는 기능을 제공하는 API인 XMLHttpRequest 함수를 사용하여 검색된다. 또한 Ajax는 여러 소스의 컨텐츠를 단일 웹 애플리케이션에 통합하는 많은 매시업에서 기본 기술로 사용되고 있다.

하지만 이 방법을 사용할 경우에는 브라우저의 제한사항으로 인해 도메인 간 통신이 지원되지 않는다. 다른 도메인의 데이터를 요청하려고 하면 보안 오류가 발생한다. 물론 데이터가 있는 원격 서버를 제어하고 동일한 도메인에만 데이터를 요청한다면 이러한 보안 오류를 막을 수 있다. 하지만 웹 애플리케이션이 고유 서버에만 한정되어 있다면 무슨 의미가 있겠는가? 여러 써드파티 서버에 있는 데이터를 수집해야 하는 경우에는 어떻게 할 것인가?

동일 출처 정책 제한 이해

동일 출처 정책은 한 도메인에서 로드된 스크립트가 다른 도메인의 문서 특성을 가져오거나 조작하지 못하도록 한다. 즉, 요청된 URL의 도메인이 현재 웹 페이지의 도메인과 같아야 한다. 이는 기본적으로 브라우저가 다른 출처의 컨텐츠를 조작하는 것을 방지하기 위해 해당 컨텐츠를 분리한다는 것을 의미한다. 이 브라우저 정책은 아주 오래 전인 Netscape Navigator 2.0부터 사용되던 것이다.

비교적 간단하게 이 제한을 해결하려면, 웹 페이지에서 자신의 출처가 되는 웹 서버에 데이터를 요청하고 해당 웹 서버가 실제 써드파티 서버에 요청을 전달하는 프록시 서버 역할을 수행하면 된다. 많이 사용되고 있기는 하지만 이 기술은 확장성이 없다. 또 다른 방법으로는 프레임 요소를 사용하여 현재 웹 페이지 내에 새 영역을 만든 후 GET 요청을 사용하여 써드파티 컨텐츠를 가져오는 방법이 있다. 하지만 컨텐츠를 가져온 이후에 프레임의 컨텐츠가 동일 출처 정책 제한에 걸릴 수 있다.

이 제한을 해결할 수 있는 방법은 웹 페이지에 동적 스크립트 요소를 삽입하는 것이다. 이 스크립트 요소에는 다른 도메인의 서비스 URL을 가리키는 소스가 있기 때문에 스크립트 자체적으로 데이터를 가져올 수 있다. 이 스크립트는 로드되면서 실행된다. 이 방법은 동일 출처 정책에서 동적 스크립트 삽입이 허용되고 스크립트가 웹 페이지의 소스 도메인에서 로드된 스크립트로 간주되기 때문에 정상적으로 작동된다. 하지만 이 스크립트에서 다른 도메인의 문서를 로드하려는 시도는 실패하게 된다. 다행히 JSON(JavaScript Object Notation)을 함께 사용하면 이 기술을 향상시킬 수 있다.

JSON과 JSONP

JSON은 XML에 비해 브라우저와 서버 간의 정보 교환에 사용되는 경량 데이터 형식이다. JSON은 이름에서 알 수 있듯이 JavaScript 오브젝트의 문자열 표현이다. (이 사실을 간과하는 JavaScript 개발자들이 없기를 바란다.) 예를 들어, symbol과 price라는 두 속성을 가진 ticker 오브젝트가 있다고 가정해 보자. JavaScript에서는 다음과 같이 ticker 오브젝트를 정의할 수 있다.

var ticker = {symbol: 'IBM', price: 91.42};

다음은 동일한 정의를 JSON으로 표현한 것이다.

{symbol: 'IBM', price: 91.42}

JSON과 JSON을 데이터 교환 형식으로 사용할 수 있는 가능성에 대한 자세한 정보는 참고자료에서 볼 수 있다. Listing 1에서는 호출되었을 때 IBM 주가를 보여 주는 JavaScript 함수를 정의한다. (이 기사에서는 코드를 웹 페이지에 통합하는 방법에 대한 상세 설명을 제공하지 않는다.)


Listing 1. showPrice 함수 정의하기
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
                

JSON 데이터를 매개변수로 전달하여 이 함수를 호출할 수 있다.

showPrice({symbol: 'IBM', price: 91.42}); // alerts: Symbol: IBM, Price: 91.42
                

이제 Listing 2처럼 이들 두 단계를 웹 페이지에 포함할 수 있는 준비가 완료되었다.


Listing 2. 웹 페이지에 showPrice 함수 및 매개변수 포함하기
<script type="text/javascript">
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
</script>
<script type="text/javascript">showPrice({symbol: 'IBM', price: 91.42});</script>

페이지가 로드되면 그림 1과 같은 경고가 표시된다.


그림 1. IBM 티커
IBM ticker

지금까지 이 기사에서는 정적 JSON 데이터를 매개변수로 사용하여 JavaScript 함수를 호출하는 방법을 살펴보았다. 하지만 함수 호출에서 JSON 데이터를 동적으로 랩핑하여 동적 데이터와 함께 함수를 호출할 수도 있다. 이를 동적 JavaScript 삽입 기술이라고 한다. 이 기술의 작동 방법을 확인하려면 ticker.js라는 독립형 JavaScript 파일에 다음 행을 입력해야 한다.

showPrice({symbol: 'IBM', price: 91.42});

이제 웹 페이지의 스크립트를 Listing 3의 코드처럼 변경한다.


Listing 3. 동적 JavaScript 삽입 코드
<script type="text/javascript">
// This is our function to be called with JSON data
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
var url = “ticker.js”; // URL of the external script
// this shows dynamic script insertion
var script = document.createElement('script');
script.setAttribute('src', url);

// load the script
document.getElementsByTagName('head')[0].appendChild(script); 
</script>
				

Listing 3의 예제에서, ticker.js에 파일에 있는 동적으로 삽입된 JavaScript 코드는 실제 JSON 데이터를 매개변수로 사용하여 showPrice() 함수를 호출한다.

앞에서 설명한 대로 동일 출처 정책은 동적 스크립트 요소의 문서 내 삽입을 허용하기 때문에 다른 도메인의 JavaScript를 동적으로 삽입하여 JSON 데이터를 전달할 수 있다. 이처럼 함수 호출에 랩핑된 JSON 데이터를 JSONP(JSON with Padding)라고 한다. 이 작업을 수행하려면 코드를 삽입하기 전에 콜백 함수가 미리 정의되어 있어야 한다. 이 예제에서는 showPrice()가 콜백 함수이다.

그러나 JSONP 서비스(또는 원격 JSON 서비스)는 사용자 지정 함수 호출에서 리턴된 JSON 데이터에 대한 랩핑을 지원하는 추가 기능을 가진 웹 서비스이다. 따라서 이 방법을 사용하려면 원격 서비스에서 콜백 함수 이름을 요청 매개변수로 받아야 한다. 그런 다음 원격 서비스에서 JSON 데이터를 매개변수로 전달하는 이 함수에 대한 호출이 생성되면 이 함수가 클라이언트 측 웹 페이지에 삽입되어 바로 실행된다.

jQuery의 JSONP 지원

jQuery 버전 1.2부터는 JSONP 호출에 대한 네이티브 지원이 제공되고 있다. JSONP 콜백을 지정한 경우 다른 도메인에 있는 JSON 데이터를 로드할 수 있으며 JSONP 콜백은 url?callback=?라는 구문을 사용하여 지정할 수 있다.

jQuery에서는 ?가 호출할 생성된 함수 이름으로 자동 변환된다. Listing 4에서는 이 코드를 보여 준다.


Listing 4. JSONP 콜백 사용하기
jQuery.getJSON(url+"&callback=?", function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

이를 위해 jQuery는 스크립트가 삽입될 때 호출되는 전역 함수를 창 오브젝트에 추가한다. 이 함수는 완료 후에 제거된다. jQuery는 도메인 내 호출에 대해서도 최적화 기능을 제공한다. 동일한 도메인에 대한 요청이 발생할 경우 jQuery는 해당 요청을 일반적인 Ajax 요청으로 변환한다.

JSONP 지원을 사용하는 예제 서비스

앞의 예제에서는 정적 파일(ticker.js)을 사용하여 JavaScript를 웹 페이지에 동적으로 삽입했다. JSONP 응답을 리턴하기는 하지만 URL에 콜백 함수 이름을 정의할 수 없었기 때문에 JSONP 서비스가 아니었다. 그렇다면 실제 JSONP 서비스로 변환하려면 어떻게 해야 할까? 이 기사에서는 여러 가지 방법 중에서 PHP와 Java를 사용하는 두 가지 예제를 설명한다.

먼저 서비스에서 요청 URL에 포함된 callback 매개변수를 허용한다고 가정하자. (매개변수 이름 자체는 중요하지 않지만 클라이언트와 서버에서 동일한 이름을 사용해야 한다.) 그리고 서비스에 대한 요청이 다음과 같다고 가정하자.

http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=showPrice

여기에서 symbol은 요청된 티커 기호를 나타내는 요청 매개변수이며, callback은 웹 애플리케이션에서 사용하는 콜백 함수의 이름이다. Listing 5의 코드를 사용하여 jQuery의 JSONP 지원이 포함된 이 서비스를 호출할 수 있다.


Listing 5. 콜백 서비스 호출
jQuery.getJSON("http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?", 
function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

이 코드에서는 실제 함수 이름 대신 ? 기호를 콜백 함수 이름으로 입력했다. 이는 jQuery가 ? 기호를 인라인 함수를 호출하는 생성된 함수 이름(예: jsonp1232617941775)으로 바꾸기 때문이다. 이 기능을 활용하면 showPrice()와 같은 함수를 자유롭게 정의할 수 있다.

Listing 6에서는 PHP로 구현한 JSONP 서비스의 일부를 보여 준다.


Listing 6. PHP로 구현한 JSONP 서비스의 일부
$jsonData = getDataAsJson($_GET['symbol']);
echo $_GET['callback'] . '(' . $jsonData . ');';
// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});

Listing 7에서는 동일한 기능을 수행하는 Java™ Servlet 메소드를 보여 준다.


Listing 7. Java Servlet으로 구현한 JSONP 서비스
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
  throws ServletException, IOException {
	String jsonData = getDataAsJson(req.getParameter("symbol"));
	String output = req.getParameter("callback") + "(" + jsonData + ");";

	resp.setContentType("text/javascript");
          
	PrintWriter out = resp.getWriter();
	out.println(output);
	// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});
}

그렇다면 이제 단일 웹 페이지에 표시하기 위해 써드파티 서버의 컨텐츠를 통합하는 매시업을 빌드하려면 어떻게 해야할까? 간단하다. 써드파티 JSONP 서비스를 사용해야 한다. 이 기사에서는 이들 서비스 중 일부를 소개한다.

바로 사용할 수 있는 JSONP 서비스

이제 JSONP를 사용하는 방법을 알고 있으므로 바로 사용할 수 있는 몇몇 JSONP 웹 서비스로 애플리케이션과 매시업을 빌드해 볼 수 있다. 다음은 후속 개발 프로젝트를 위한 출발점이다. (힌트: 지정된 URL을 브라우저의 주소 필드에 붙여 넣으면 결과 JSONP 응답을 확인할 수 있다.)

Digg API: Digg의 최신 스토리

http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript
&callback=?

Geonames API: 우편번호에 해당하는 위치 정보

http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?

Flickr API: Flickr의 최신 고양이 사진

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any
&format=json&jsoncallback=?
                

Yahoo Local Search API: 우편번호 10504 지역의 피자 검색

http://local.yahooapis.com/LocalSearchService/V3/localSearch?appid=YahooDemo&query=pizza
&zip=10504&results=2&output=json&callback=?

주의할 사항

JSONP는 매시업을 빌드하는 데 사용할 수 있는 매우 강력한 기술이기는 하지만 도메인 간 통신에 필요한 모든 요구 사항을 해결할 수 있는 방법은 아니다. 개발 리소스를 확정하기 전에 신중하게 고려해야 하는 단점이 있다. 특히 JSONP 호출에 대한 오류 처리 방법이 없다. 동적 스크립트 삽입이 작동되는 경우에는 함수가 호출되지만 그렇지 않은 경우에는 어떠한 작업도 수행되지 않는다. 즉, 오류도 발생하지 않고 작업만 실패할 뿐이다. 예를 들어, 서버의 404 오류를 받을 수 없다. 요청을 취소하거나 다시 시작할 수도 없다. 그러나 일정 시간이 경과된 후 시간 종료로 요청을 중지할 수 있다. (jQuery의 후속 버전에서는 JSONP 요청에 대한 중단 기능이 지원될 것이다.)

JSONP의 또 다른 주요 단점은 신뢰할 수 없는 서비스와 함께 사용할 경우 매우 위험할 수 있다는 것이다. JSONP 서비스가 함수 호출로 랩핑된 JSON 응답을 리턴하고 브라우저에서 이 응답을 실행하므로 호스트하는 웹 애플리케이션이 다양한 공격에 노출될 수 있다. JSONP 서비스를 사용하려면 내재된 위험 요소를 잘 알고 있어야 한다. 자세한 정보는 참고자료에서 볼 수 있다.



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/28 19:32 2011/04/28 19:32
, , , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6126

웹상에서 Jquery를 테스트 해볼수 있다. - http://jsbin.com/

JS Bin Help

JS Bin is an open source collaborative JavaScript debugging tool.

If you want to get involved to help make JS Bin better (or perhaps fix a bug you've found), please fork JS Bin on github and send me a pull request.

Video tutorials will be coming shortly one day.



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/04 18:14 2011/04/04 18:14
, ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6045

 XML의 내용을 JQuery로 불러와서 Array로 파싱.
.get 으로 xml의 내용을 가져와서 .each 로 루프하면서 출력하는 테스트 .
querystring 으로 넘어오는 값도 받아서 적용한다.
Aptana 로 로컬에서 Javasrcipt 테스트 중. 완전 좋다.

<!DOCTYPE html PUBLIC "-//W3C//  DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>jQuery -> XML -> Array : Parse </title>
        <script src="jquery-latest.min.js" type="text/javascript">
        </script>
        <script type="application/javascript">
            
            
            
            $(function(){
            
                // 원하는 파라키터 호출
                var param01 = querySt("anum");
                //document.write(param01);
                $('#param01').html(param01);
                
                $.get("hello.xml", {}, function(xml){
                    $("item", xml).each(function(i){
                        var title = $(this).find("title");
                        
                        alert("title 의 개수는 총 " + $(this).find("title").size() + " 개 입니다.");
                        
                        $.each(title, function(j){
                        
                            $("#content_xml").append("j = " + j + " , " + $(this).text() + "<br />");
                            
                        });
                        
                        $("#contents").append(title.text());
                    });
                });
                
                $('p').each(function(index){
                    $(this).attr({
                        'id': "para-" + index
                    });
                });
                $('#btn').click(function(){
                    alert($('#para-1').text()); //태그내의 텍스트 읽어오기
                });
                
                
                // QueryString 호출
                function querySt(ji){
                    hu = window.location.search.substring(1);
                    gy = hu.split("&");
                    
                    for (i = 0; i < gy.length; i++) {
                        ft = gy[i].split("=");
                        if (ft[0] == ji) {
                            return ft[1];
                        }
                    }
                }
                
                
            }); //close $(
        </script>
    </head>
    <body>
        <div id='content_xml'>
        </div>
        <br/>
        <div id='param01'>
        </div>
        <br/>
        <div id='contents'>
        </div>
        <p>
            C#
        </p>
        <p>
            ASP.NET
        </p>
        <p>
            SilverLight
        </p>
        <input type="button" id="btn" value="동적으로 생성된 id로 접근" />
    </body>
</html>

hello.xml
<?xml version="1.0" encoding="utf-8"?>
 <item>
     <title>Ezra Pound</title>
     <title>Edward Nom</title>
     <title>Nippon Ds</title>
     <title>Chin</title>
     <title>wani</title>
     <title>金洪完</title>
     <title>上海</title>
     <title>Ngio.co.kr</title>
 </item>

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/03/25 13:51 2011/03/25 13:51
, , , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5994

나는 미처 몰랐네 그대가 나였다는 것을 (양장)  : 무위당 장일순 잠언집, 편저 : 김익록 ㅣ 출판사 : 시골생활 ㅣ 발행일 : 2009년 01월05일
 

[ 목  차 ]
머리말 - 이철수

[둑방길]
삶의 도량에서
너를 보고 나는 부끄러웠네
고백
잘 쓴 글씨
밥 한 그릇
출세
향기
수행
실패
부활

[서화전]
손님
누가 하느님?
똥물
나를 찌른 칼
도둑
화해
지금 이 자리에서
우두머리
선행

[무위당 선생의 집]
화목
어머니
인물
경쟁

내세우지 말라
함께 가는 길
혁명
변화

[겨울나무 아래서]
행복
조 한 알
나의 병
싸우지 말고 모셔라
병상에서
그림값
말씀

[원주가톨릭센터 사무실에서]
종교
구유에서 태어나신 예수
문 열고 세상 속으로
내가 밥이다
겸손한 마음
생명의 나라

[할아버지와 해월]
거룩한 밥상
해월, 겨레의 스승
새알 하나, 풀잎 하나
이천식천
향아설위
상대를 변화시키며 함께

[골목길]
선과 악
내 안에 아버지가 계시고
작은 먼지 하나에 우주가 있다
내가 없어야
무위
하나
그 자리
관계
산은 산, 물은 물
공평하게

[주교관에서]
문제를 풀려면
눈에 보이지 않는 것
기본이 되는 삶
생명의 길
내가 아닌 나
사람의 횡포
자연

[한살림]
동고동락
사람
한살림
생산자와 소비자
가난한 풍요
원래 제 모습
오류
모심
자기 몫

[감옥이 학교]
진실
맨몸
박피
가르친다는 것
그들 속에서
원월드 운동
분단
열린 운동
화이부동
연대
전일성

김경일 신부가 받아 적은 무위당 선생 말씀

엮은이의 말
무위당 장일순 연보


산색 - 죽창수필 선역
저 : 운서주굉 ㅣ 역 : 연관 ㅣ 출판사 : 호미 ㅣ 발행일 : 2005년 03월25일

운서주굉 [저]

중국 항주(현 절강성) 인화현에서 가정(嘉靖) 14년에 태어난 스님은 열일곱 살에 이미 사전이라는 칭호를 들을 정도로 박학하였으며 문장과 덕행이 뛰어났다. 가정 45년에 성천(性天) 화상을 은사로 출가, 제방으로 행각하다가 항주 운서산에 일대총림을 창설하여 크게 종풍을 떨쳤다. 계율의 부흥과 정토법문의 제창, 방생을 권장하는 등 선과 염불과 계율에 두루 관심을 갖고 활약한 대종장이다. 만력 43년(세수 81세, 법랍 50세)에 입적했다. [구계편몽(具戒便夢)], [범망경소발은(梵網經疏發隱)] [사미율의 요략], [아미타경 소초] 등 저서가 30여 종에 달한다.

대나무 창가에서 붓 가는 대로 적은 짧고 아름다운 지혜의 글 142편
죽창수필 선역 '산색'은 명대의 이름난 고승인 운서 주굉이 쓴 수필집 “죽창수필” 3권 450여 편의 이야기 가운데에서 142편을 가려뽑아 엮은 책이다.
지은이가 “때때로 보고 느낀 것을 죽창 아래에서 붓 가는 대로” 적은 이 수필집은 한편 한편의 글들이 모두 짧고 간결한데, 단순한 듯 쉬우면서도 깊은 울림을 지니고 있다. 삶의 본 모습과 인생의 참 뜻에 대한 지은이의 깊은 통찰이 담긴 글이기 때문이다. “붓 가는 대로” 써서 다루는 이야기가 어느 한두 가지에 매여 있지 않으니, 역사 속의 인물이나 당대의 사람들에 관한 재미있는 일화와 기담들에서부터, 지은이 스스로 겪은 경험담, 깨달음이 담긴 단상들, 관행으로 여겨 온 구습에 대한 비판, 수행자들에 대한 따끔한 경책, 올바른 수행법을 밝힌 이야기에 이르기까지, 퍽 다채롭게 넘나든다. 어느 글이나 한결같이 생활 속에서 절실히 느낀 것들, 진지한 고민과 성찰에서 나온, 진실한 글이라서, 마지막 장을 넘길 때까지 독자의 마음을 붙들어매는 힘을 갖는다. 바로 그런 점 때문에 수필집 '산색'은 오늘의 우리에게도 시간적 간극이 느껴지지 않을 만큼 생생하게 다가온다. 좋은 글, 좋은 생각은 세월이 흘러도 바래지 않는 생명력을 지닌다는 사실을 다시 한번 실감하게 하는 책이다. 이 수필집에서 느껴지는 지은이 운서 주굉의 면모는 참으로 크고 깊어서 감히 따라잡기 어렵다. 인간의 어리석음과 덧없는 탐욕, 수행자들의 안이함에 대해서 가파르다 싶을 만큼 통렬히 나무라면서도, 자기 자신에게는 엄격하면서도, 사람살이의 인지상정에 대해서 한편으로는 사려 깊은 이해심으로 바라보는 넉넉함도 놓치지 않는다. 생명을 존중할 줄 모르는 세태, 한갓 지식이나 떠벌리는 사람들의 어리석음에 대해서 질타하는 글에서도, 가슴 깊은 연민과 애정과 관용으로 세상을 바라봄을 느낄 수 있다. 이 책 곳곳에서 공자나 안회 같은 성인에 대한 찬탄도 서슴지 않았듯이, 지은이 운서 주굉은 밖으로는 유불선의 조화로운 통합을 주창함으로써 통합불교의 기틀을 세웠는데, 안으로는 대립하고 경합하기 일쑤이던 선禪과 염불을 두루 함께 인정하고 권장하였다. 그의 이러한 원융한 태도와 균형 잡힌 시각은 여러 편의 글에서 거침없고 명쾌한 논리로 밝혀져 있다. “아름다운 문장이 마음을 맑히고, 청정한 삶을 살려는 이들을 위한 지혜의 책”(판화가 이철수)이라는 평이 결코 과하지 않다.
'산색'의 원전인 '죽창수필' 완역본이 국내에 처음 소개된 것은 1991년이었다. '죽창수필'은 쇄를 거듭하여 찍으면서 불교계에서 드물게 스테디셀러의 반열에 오를 만큼 승과 속의 많은 사람들로부터 사랑을 받아 왔다. 그러나 옮긴이는 처음 번역하여 책을 낸 뒤로, 더러 눈에 띄는 번역의 오류와 한문투의 글을 발견할 때마다 “가슴에 밤송이가 들앉은 듯이 마음이 편치 않았다.” 이에, 작정하고 다시 글을 살피며 고치고 가다듬는 작업을 시작하였는데, 그러던 중에 이 좋은 글을 수행자나 불교인들뿐만 아니라 일반 사람들도 널리 쉽게 접할 수 있기를 바라서, 선역본을 염두에 두게 되었다. “격류를 건너는 듯한 세상살이에 튼튼한 징검돌이 되고, 저물어 가는 듯한 세상의 정의를 바로 세우는 데 남은 햇살이나마 되고자 함”에서였다. 그리하여 '죽창수필' 가운데에서 세상 사는 이치에 대해 이야기한 글을 중심으로 142편의 글을 가려뽑고 나서, 잘못된 번역은 바로잡고 한문투의 어휘나 어법을 쉽고 자연스러운 우리말로 가다듬으며 원고를 정성스럽게 다듬었다. “원숙하면서도 날카로운 필봉”이 돋보이는 본디의 글이 지닌 문채미와 격조는 손상되지 않게 하려는 노력도 십분 기울였다. 옮긴이의 그런 노력 덕분에, 죽창수필 선역 '산색'은 일반 독자들에게 한결 친근하게 다가선 책이 되었다.


실전 jQuery 쿡북
저 : jQuery 코어 커뮤니티 ㅣ 역 : 김경균, 최지훈 ㅣ 감수 : 김태영 ㅣ 출판사 : 비제이퍼블릭 ㅣ 발행일 : 2010년 06월24일

[목   차]
머리말
도움주신 분들
서문
역자의 글
편역/감수의 글

0 jQuery 1.4에 대한 소개
0.0 개요
0.1 jQuery 1.4의 새로운 기능
0.2 기본 기능
0.3 어트리뷰트 관련 기능들
0.4 CSS 관련 기능들
0.5 DATA 관련 기능
0.6 탐색 관련 기능 추가
0.7 조작 관련 기능 추가
0.8 이벤트 관련 기능들
0.9 Queue 관련 기능
0.10 Ajax 관련 기능
0.11 유틸리티 메서드 관련
0.12 기타 알아두면 좋을 만한 변경사항들

1 jQuery 기초
1.0 소개
1.1 HTML 페이지에 jQuery 라이브러리 코드 넣기
1.2 DOM은 로드되었지만 페이지가 로드되기 전에 jQuery/자바스크립트 실행하기
1.3 셀렉터와 jQuery 함수를 사용하여 DOM 요소 선택하기
1.4 특정 컨텍스트 안에서 DOM 요소 선택하기
1.5 DOM 요소의 래퍼집합 필터링하기
1.6 현재 선택된 래퍼집합에서 자손 요소 찾기
1.7 파괴적인 변경 이전의 선택상황으로 돌아가기
1.8 현재 셀렉션에 이전 셀렉션 추가하기
1.9 컨텍스트를 기반으로 DOM 탐색하기
1.10 DOM 요소를 생성하고, 추가하고 다루기
1.11 DOM 요소 제거하기
1.12 DOM 요소 교체하기
1.13 DOM 요소 복제하기
1.14 DOM 요소 어트리뷰트를 가져오고, 설정하고, 제거하기
1.15 HTML 컨텐츠 가져오기 및 설정하기
1.16 텍스트 컨텐츠를 가져오고 설정하기
1.17 전역적인 충돌 없이 $ 별칭 사용하기

2 jQuery로 요소 선택하기
2.0 소개
2.1 직속 자식 요소 찾기
2.2 특정 형제들 선택하기
2.3 인덱스 순서로 요소 선택하기
2.4 현재 애니메이션 중인 요소 선택하기
2.5 무엇을 포함하고 있는지에 따라 요소 선택하기
2.6 일치되지 않는 요소 선택하기
2.7 가시성을 기반으로 요소 선택하기
2.8 어트리뷰트 기반으로 요소 선택하기
2.9 형식에 따라 폼 요소 선택하기
2.10 특성을 갖는 요소 선택하기
2.11 컨텍스트 매개변수 사용하기
2.12 사용자 정의 필터 셀렉터 만들기

3. 기초를 넘어서
3.0 소개
3.1 선택된 결과의 집합을 루프 돌면서 처리하기
3.2 선택집합을 특정 항목들로 줄이기
3.3 선택된 jQuery 개체를 원래의 DOM 개체로 변환하기
3.4 선택집합에서 항목의 인덱스 얻기
3.5 기존 배열로부터 고유한 배열 만들기
3.6 선택된 집합의 일부에 대해 동작 수행하기
3.7 jQuery가 다른 아이브러리와 충돌하지 않도록 설정하기
3.8 플러그인을 통해 기능 추가하기
3.9 사용된 질의 알아내기

4. jQuery 유틸리티
4.0 소개
4.1 jQuery.support로 기능 찾기
4.2 jQuery.each를 사용하여 배열과 개체를 반복하여 처리하기
4.3 jQuery.grep을 사용하여 배열 필터링하기
4.4 jQuery.map을 사용하여 배열 항목을 반복하며 수정하기
4.5 jQuery.merge로 두 개의 배열을 결합하기
4.6 jQuery.unique를 사용하여 중복된 배열 항목 필터링하기
4.7 jQuery.isFunction을 사용하여 콜백 함수 확인하기
4.8 jQuery.trim을 사용하여 폼 값 또는 문자열에서 공백 제거하기
4.9 jQuery.data를 사용하여 DOM에 개체와 데이터 첨부하기
4.10 jQuery.extend를 사용하여 개체 확장하기

5. 빠르게, 간단하게, 더욱 재미있게
5.0 소개
5.1 사실 이건 jQuery가 아니라 자바스크립트다!
5.2 $(this)에 무슨 문제가 있을까?
5.3 장황한 중복 제거하기
5.4 jQuery 체인 가독성 높이기
5.5 다른 라이브러리에서 코드 빌려 쓰기
5.6 사용자 정의 반복기 작성하기
5.7 어트리뷰트 토글하기
5.8 병목현상 파악하기
5.9 jQuery 개체 캐시하기
5.10 보다 빠른 셀렉터 작성하기
5.11 빠르게 테이블 로딩하기
5.12 순수 루프 작성하기
5.13 이름 조회 줄이기
5.14 .innerHTML을 사용하여 DOM을 빠르게 업데이트하기
5.15 체인이 끊어진 부분을 알아내기
5.16 이건 jQuery의 버그인가?
5.17 jQuery 추적하기
5.18 서버 요청을 최대한 줄이기
5.19 튀지 않는 자바스크립트 작성하기
5.20 점진적인 향상을 위해 jQuery 사용하기
5.21 페이지를 접근 가능하게 만들기

6. 영역(Dimensions)
6.0 소개
6.1 Window와 Document의 영역 알아내기
6.2 요소의 영역 찾기
6.3 요소의 오프셋(Offset) 알아내기
6.4 요소가 보이도록 스크롤하기
6.5 요소가 표시영역(Viewport) 안에 있는지 알아내기
6.6 표시영역 안에서 요소를 가운데로 정렬하기
6.7 현재 위치에서 요소를 절대적으로 위치시키기
6.8 또 다른 요소에 상대적으로 요소를 위치시키기
6.9 브라우저의 너비에 따라 스타일시트 바꾸기

7. 효과
7.0 소개
7.1 요소를 슬라이딩 및 페이딩하기
7.2 위쪽으로 슬라이드하면서 요소를 보이게 하기
7.3 수평 아코디언 만들기
7.4 동시에 요소를 슬라이딩하고 페이딩하기
7.5 순차적인 효과 적용하기
7.6 요소들이 현재 애니메이션 중인지 알아내기
7.7 애니메이션 종료 및 리셋하기
7.8 효과에 사용자 정의 이징(Easing) 메서드 사용하기
7.9 모든 효과를 동작하지 않게 하기
7.10 고급 효과를 위해 jQuery UI 사용하기

8. 이벤트
8.0 소개
8.1 이벤트에 처리기 연결하기
8.2 별개의 데이터를 갖는 처리기 함수 재사용하기
8.3 이벤트 처리기 전체를 제거하기
8.4 특정 이벤트 처리기 동작 시키기
8.5 이벤트 처리기에 동적 데이터 전달하기
8.6 document.ready 이전에 가능한 한 빨리 요소에 접근하기
8.7 처리기 실행 루프 중단하기
8.8 event.target을 사용하여 정확한 요소 얻기
8.9 동시에 여러 개의 hover() 애니메이션이 수행되지 못하도록 하기
8.10 새롭게 추가된 요소에서도 동작하는 이벤트 처리기 만들기

9. 고급 이벤트
9.0 소개
9.1 jQuery를 동적으로 로드하는 경우 올바로 동작하게 만들기
9.2 전역 이벤트 빠르게 발생시키기
9.3 자체 이벤트 만들기
9.4 이벤트 처리기가 필요한 데이터를 제공하게 하기
9.5 이벤트 주도적인 플러그인 만들기
9.6 jQuery 메서드가 호출되었을 때 통지받기
9.7 개체의 메서드를 이벤트 리스너처럼 사용하기

10. HTML 폼의 기능 강화하기(직접 개발)
10.0 서문
10.1 페이지 로드 시에 input 요소에 포커스 주기
10.2 폼 요소들을 활성/비활성화하기
10.3 Radiobutton 요소를 자동으로 선택하기
10.4 전용 링크를 사용하여 모든 Checkbox 요소들을 활성/비활성화하기
10.5 단일 토글을 사용하여 모든 Checkbox 요소들을 선택/선택 해제하기
10.6 Select 요소에 옵션 추가 및 제거하기
10.7 문자의 개수에 의한 자동 택 기능 구현하기
10.8 남아 있는 글자의 개수를 표시하기
10.9 텍스트 input 요소에 특정 글자만을 수용하기
10.10 Ajax를 사용하여 폼을 전송하기
10.11 폼 유효성 검사하기

11. HTML 폼의 기능 강화하기(플러그인 사용)
11.0 서문
11.1 폼 유효성 검사하기
11.2 마스크 기능을 제공하는 input 필드 만들기
11.3 텍스트 필드 자동 완성하기
11.4 값의 범위 선택하기
11.5 범위가 제한된 값 입력하기
11.6 백그라운드에서 파일 업로드하기
11.7 텍스트 입력 길이를 제한하기
11.8 input 필드 위에 라벨 나타내기
11.9 컨텐츠에 따라 input 요소 크게 만들기
11.10 날짜 선택하기

12. jQuery 플러그인들
12.0 서문
12.1 jQuery 플러그인은 어디에서 찾아야 하는가?
12.2 언제 jQuery 플러그인을 작성해야 하는가?
12.3 첫 jQuery 플러그인 작성하기
12.4 여러분의 플러그인으로 옵션 전달하기
12.5 플러그인에서 $ 단축표현 사용하기
12.6 플러그인에 전용(private) 함수 포함하기
12.7 Metadata 플러그인 지원하기
12.8 플러그인에 정적(static) 함수 추가하기
12.9 QUnit을 사용하여 플러그인 단위 테스트하기

13. 인터페이스 컴포넌트 사용하기
13.0 서문
13.1 사용자 정의 툴팁 만들기
13.2 파일 트리를 사용하여 탐색하기
13.3 어코디언(Accordion) 확장하기
13.4 문서에 탭 기능 추가하기
13.5 간단한 모달 창 나타내기
13.6 도롭다운 메뉴 만들기
13.7 순환 이미지들을 번갈아 가며 페이드하기
13.8 패널 슬라이딩

14. jQuery UI를 이용한 사용자 인터페이스
14.0 서문
14.1 전체 jQuery UI 제품군 포함하기
14.2 1, 2개의 jQuery UI 플러그인 포함하기
14.3 기본 옵션을 사용하여 jQuery UI 플러그인 초기화하기
14.4 사용자 정의 옵션을 사용하여 jQuery UI 플러그인을 초기화하기
14.5 자신만의 jQuery UI 플러그인 기본값 만들기
14.6 jQuery UI 플러그인 옵션들을 가져오거나 설정하기
14.7 jQuery UI 플러그인 메서드를 호출하기
14.8 jQuery UI 플러그인 이벤트 다루기
14.9 jQeury UI 플러그인을 무효화하기
14.10 jQuery UI 음악 플레이어 만들기

15. jQuery UI 테마 설정
15.0 서문
15.1 ThemeRoller를 사용하여 jQuery UI 위젯에 스타일 적용하기
15.2 jQuery UI 레이아웃과 테마 스타일을 재 정의하기
15.3 비 jQuery UI 구성요소에 테마 적용하기
15.4 단일 페이지에서 다중 테마 참조하기
15.5 부록: 추가적인 CSS 자원들

16. jQuery, Ajax, Data 형식들: HTML, XML, JSON, JSONP
16.0 서문
16.1 jQuery와 Ajax
16.2 사이트 전체에서 Ajax 사용하기
16.3 사용자 피드백과 함께 Ajax 사용하기
16.4 Ajax 단축 메서드와 데이터 형식 사용하기
16.5 HTML 조각과 jQuery 사용하기
16.6 XML을 DOM으로 변환하기
16.7 JSON 만들기
16.8 JSON 해석하기
16.9 jQuery와 JSONP를 사용하기

17. 대형 프로젝트에서 jQuery 사용하기
17.0 서문
17.1 클라이언트 측 저장소 사용하기
17.2 단일 세션에 응용 프로그램 상태 저장하기
17.3 세션 사이에 응용 프로그램 상태 저장하기
17.4 자바스크립트 템플릿 엔진 사용하기
17.5 Ajax 요청들을 큐에 넣기
17.6 Ajax와 뒤로가기 버튼 다루기
17.7 페이지의 끝부분에 자바스크립트 위치시키기

18. 단위 테스트
18.0 소개
18.1 단위 테스트 자동화하기
18.2 결과 어설션하기
18.3 동기 콜백 테스트하기
18.4 비동기 콜백 테스트하기
18.5 사용자 행동 테스트하기
18.6 테스트 원자성 유지하기
18.7 테스트들을 그룹화하기
18.8 실행할 테스트 선택하기

찾아보기




크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/03/24 16:20 2011/03/24 16:20
Response
No Trackback , 2 Comments
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5989

[jQuery] jQuery란 무엇인가?

What is jQuery?

jQuery is a library of JavaScript Functions.

jQuery is a lightweight "write less, do more" JavaScript library.

The jQuery library contains the following features:

    * HTML element selections
    * HTML element manipulation
    * CSS manipulation
    * HTML event functions
    * JavaScript Effects and animations
    * HTML DOM traversal and modification
    * AJAX
    * Utilities
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/03/16 17:15 2011/03/16 17:15
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5941

jQuery   is a new kind of JavaScript Library.
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.

gitHub : https://github.com/  github social coding

Sencha . touch : http://www.sencha.com/products/touch/Sencha

jQTouch : http://www.jqtouch.com/

jQuery Mobile | http://jquerymobile.com/

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/03/15 16:00 2011/03/15 16:00
, , , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5933

[jQuery] jQuery - innerHtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
 
  <script>
  $(document).ready(function(){
 
    var str = $("span:first").html();
    $("span:last").html(str);
 
  });
  </script>
  <style>
  span { color:blue; margin:8px; }
  b { color:red; }
  </style>
</head>
<body>
  <span><b>Test</b> Paragraph.</span><br />
  <span></span>
</body>
</html>
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/30 20:07 2010/11/30 20:07
,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5692

페이지 슬라이드 기능.
 : 페이지 내에서 이벤트 작동시 숨겨진 페이지가 나오게 하는 효과

http://srobbin.com/blog/jquery-pageslide/
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2010/11/16 18:34 2010/11/16 18:34
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5652

웹 페이지에 속해 있는 모든 <a> Tag 들의 "href" 의 경로를 원하는 텍스트만 변경하는 구문.
모바일 기기로 웹페이지 접근시 <a> Tag 경로를 변경해야 하거나 할때 사용.

* jQuery  파일이 인클루드 되어야 합니다.

* .replace() 는 일반 자바스크립트
     (페이지내 다른 스크립트로 인해 간혹 실행되지 않는 페이지 있음. )


                var android_url = "";

                $('a').each(function (index) {

                    android_url = $(this).attr("href");
                    android_url = android_url.replace("/mobile/","/mobile_a/");
                    $(this).attr("href", android_url);
                    //alert($(this).attr("href"));
                });


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/04 18:56 2010/11/04 18:56
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5617

자바스크립트는 현재 점점 빨라지고 있고 또한 강력해지고 있다. 특히 각종 모바일 디바이스가 보급되면서 모바일 웹에 대한 관심이 커졌고, 이에 따라 자바스크립트 엔진의 성능 역시 발전하고 있다. 팜프리는 이미 모든 애플리케이션을 자바스크립트를 사용해 만들 수 있도록 했고, 아이폰 및 안드로이드에서도 여러 가지 프레임워크를 통해 네이티브 애플리케이션과 같은 UI 및 성능을 보이는 웹 애플리케이션 개발이 가능해졌다. 하지만 이는 모드 클라이언트 사이트에서의 자바스크립트, 쉽게 얘기해서 브라우저에서 동작하는 자바 스크립트를 말한다.

jQuery.js 등의 스크립트 라이브러리를 요즘 많이 사용하고 있는데, node.js 는 서버사이드에서 강력한 성능을 발휘할 수 있는 서버사이드 자바스크립트 라이브러리라고 할 수 있다. 우리는 node.js 를 통해서 자바스크립트의 미래를 짐작해 볼수 있을 것이다.

기존에는 서버사이드에서 스크립트를 돌려서 모든 연산을 수행하고 그 결과값으로 HTML을 만들어서 클라이언트에게 전송했다. 클라이언트는 HTML을 랜더링해서 사용자에게 보여주는 역활을 했고,  자바스크립트는 클라이언트측에서  자잘한 UI기능을 수행하며 감초역활을 했는데, 현재는 서버와 클라이언트의 역활이 상당히 많이 달라졌다.

과거 서버에서의 역활들이 클라이언트로 만히 이동을했다. jQuery등을 사용해서 UI플로우 및 여러 인터렉션과 각종 로직의 상당 부분을 클라이언트 사이드에서 처리한다. 그리고, 요즘 흔히 오픈API라고 불리는 API를 제공하여 서버의 데이터에 대한 접관과 처리를 클라이언트가 제오할수 있도록 했다.

node.js는 구글이 개발해서 현재 크롬 브라우저에 탑재되어 있는 자바스크립트 엔진인 V8을 기반으로 만들어진 서버사이트 스크립트 이다. 오히려 V8의 기능을 자바스크립트를 통해 사용 할수 있도록 만들어진 wrapper라고 말하는 것이 더 정확한 표현일 것이다.
node.js 는 V8이 내부적으로 특정 기능을 수행하는 과정에서 유저가 등록한 callback function 을 호출해 주도록 한다.

창시자 Ryan Dahl이 발표한 design goal을 정리하면,
- Function은 직접 I/O에 연결되지 않는다.
- 저수준(low-level)을 지향하며, 스트리밍으로 모든 것을 처리하되, 데이터 버퍼일을 강제하지 않는다.
- TCP, DNS, HTTP 등의 중요한 프로토콜에 대해 빌트인 된 형대로 지원된다.
- 다양한 HTTP 기능들을 지원한다.
- 클라이언트 사이트 자바스크립트 프로그래밍과 비슷하며, 동시에 과거의 유닉스 시스템 프로그래밍과도 친숙하다.
 
*  프레젠테이션 : http://www.scribd.com/doc/23801896/Node-js-JSConf-2009

사용자 삽입 이미지사용자 삽입 이미지

Home : http://www.nodejs.org/
API : http://www.nodejs.org/api.html




크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/02 22:32 2010/11/02 22:32
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5611


블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2024/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Statistics Graph

Site Stats

Total hits:
235903
Today:
372
Yesterday:
195