분류 전체.. (129)
Personal P.. (10)
Projects (2)
Programming (68)
Tools & Li.. (4)
News (5)
Strategy P.. (1)
Software E.. (5)
Something.. (19)
Toronto (6)
S/W Engine.. (1)
S/W 성능.. (2)
봄 이야기 (2)
토론토에서.. (0)
전문가시스템  추론엔진 
«   2019/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
+ Total : 115,511
+ Today : 0
+ Yesterday : 2
  

 

 

 

분류 전체보기 _해당되는 글 129건
2008.10.21   캐나다, e-Commerce 전망 
2008.10.20   Ajax 기반 영속 객체 매핑 
2008.10.13   알아두면 유용한 XML 스키마 열 가지 
2008.10.06   에딘버러 여행 - 로얄마일 
2008.10.06   Resume - Software Programmer 
2008.09.26   Android #2 - Hello World 
2008.09.26   Android #1 - Install 
2008.09.16   IT투자결정과 성과관리를 위한 IT Portfolio와 IT ROI 
2008.09.16   Click Price 제안서 
2008.09.16   What is Information Extraction ? 

 

캐나다, e-Commerce 전망
+   [News]   |  2008.10.21 11:55  
o IT시장조사업체인 이마케터(e-Marketer) 캐나다 전자상거래(e-Commerce) 현황
   보고서인 " Canada B2C E-Commerce: The Barriers Melt" 발표 (2008.4.30)
o 동보고서에 따르면, 2007년에 온라인 판매는 6년 연속 두 자리 수로 증가하였으며,
   민간 및 공공부문의 인터넷 판매는 586억 달러이며 이는 2006년 대비 26% 증가 한
   것으로 조사
 - B2C e-commerce 판매는 222억 달러로 전체 e-commerce 시장의 38%수준인 것
   으로 나타남
o eMarketer의 제프리 그라우 Jeffrey Grau 선임 애널리스트는 캐나다 B2C e-
   commerce시장은 2011년에 347억 만 달러 수준이 될 것으로 전망
 
                           < 캐나다 B2C e-Commerce, 2006~2011년 전망>
                                                                 (단위: 백만 캐나다 달러, 증가율 %)

참고자료 : emarketer, 2008.4.30

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

Ajax 기반 영속 객체 매핑
+   [Programming]   |  2008.10.20 09:45  

Ajax 기반 영속 객체 매핑

Persevere에서 Ajax를 사용하여 JavaScript 객체와 서버 데이터를 매핑하기

Persevere 영속 객체 프레임웍은 영속 객체 매핑을 브라우저 JavaScript 환경으로 가져왔습니다. 객체 영속성은 자바™ 프로그래밍과 Ruby 세계에서는 매우 유명하며, 동적 JavaScript 언어는 영속 데이터로 매핑된 객체에 기본적으로 잘 맞습니다. Persevere는 Asynchronous JavaScript + XML (Ajax) 기반 웹 애플리케이션의 매핑과 통신을 자동화 하며, 관리성 있는 데이터 모델, 투명한 클라이언트-서버 Ajax 교환, 자동 상태 변경 스토리지, 트랜잭션 관리를 제공함으로써 개발의 많은 문제들을 해결하고 있습니다.

이상적으로는, 모든 애플리케이션들은 특정 형태의 영속성을 사용한다. 다시 말해서, 미래에 실행할 것을 대비하여 정보를 저장한다는 의미이다. 일반적으로, 향후 검색을 위해 정보를 영속시키는 기능은 애플리케이션의 중요한 측면이고, 애플리케이션이 사용자 인터랙션과 기여를 통합해 가면서, 영속성은 더욱 중요해 지고 있다. 하지만, 영속성은 프로그램 실행 시 데이터가 존재하던 방식과는 개념상 다른 방식으로 상태 정보를 저장해야 한다.

프로그램 실행 시, 상태 정보는 일반적으로 객체에 저장되고(적어도, 객체 지향 프로그램에서는), 데이터베이스 또는 텍스트 또는 문자 기반 포맷으로 유지된다. 이러한 두 패러다임 간 상태 정보를 변형하려면 상당한 개발 작업이 필요하고, 에러의 가능성이 매우 크다. 영속 객체-매핑 전략은 객체를 영속 데이터에 매핑함으로써 상태 스토리지와 검색에 있어서 자동화를 제공한다. 이와 같은 매핑은 영속 상태에 액세스 하고 그 상태를 저장하는 간단한 메커니즘도 제공한다.


정보 영속
나중에 사용할 목적으로 정보를 저장할 수 있는 기능이 있다는 것은 Web 2.0 애플리케이션에 있어 중요한 문제이다. Persevere 영속 객체 프레임웍에 대해 배우고, 이것이 Ajax 기반 웹 애플리케이션에서 매핑과 통신을 어떻게 자동화 하는지를 배워보자.

영속성 매핑은 다른 언어들(예들 들어, Ruby on Rails의 Active Record와 자바의 Hibernate) 사이에서 매우 유명하다. 영속 객체로 작업할 때의 향상된 관리성 때문이다. Ajax 기반 애플리케이션에서, 브라우저에 있는 데이터에서 정보를 저장하는 프로세스는 훨씬 더 복잡하다. 데이터를 직렬화 하여 서버로 다시 보내야 하기 때문이다. 서버는 데이터를 가져오고, 영속 스토어에 저장 프로세스를 수행해야 한다.

Orthogonal persistence는 전체적인 스토리지 프로세스를 자동화 함으로써 영속성을 더욱 더 단순화 한다. 영속 매핑 객체에 생긴 변화는 영속 스토리지로 자동 전파된다: 수동으로 저장 할 필요가 없다.

이 글에서는 orthogonal persistence 지원이 되는 JavaScript 언어를 위한 원격 영속 객체 매핑 프레임웍인 Persevere JavaScript 프레임웍을 사용하는 방법을 설명한다. Persevere는 JavaScript Object Notation (JSON)과 JSON for persistence (JSPON) 스팩을 따르는 표준 Representational State Transfer (REST) HTTP 메소드를 사용하여 JavaScript 객체를 원격 영속 데이터 스토어로 매핑한다. 여러분은 또한 Persevere 서버와 연결된 Persevere JavaScript 클라이언트를 사용하는 방법을 배우게 될 것이다. 이것은 데이터베이스와 다른 영속 스토어를 JSON REST 서비스로 노출하는 프로세스를 자동화 한다. Persevere를 사용하게 되면, 브라우저에 있는 JavaScript 객체에 액세스 하여 수정함으로써, 서버 상에 있는 데이터에 액세스 하여 수정할 수 있다. Persevere는 필요한 직렬화, Ajax 호출, 비직렬화를 자동화 한다.


이 글에서는 JavaScript 코드의 영속 객체 매핑을 사용하여 간단한 블로그를 구현하는 방법을 설명한다. 블로그를 만들기 위해서, Persevere 클라이언트 프레임웍과 함께 Persevere 서버를 사용한다. Persevere에서, 일반 JavaScript 객체와 프로퍼티를 사용하여 영속 데이터에 액세스 하여 조작할 수 있다. 영속 데이터 소스는 Persevere 서버가 제공하는 기본 객체 데이터베이스 스토리지이다. Persevere 서버 역시 서버에서 JSON으로 데이터베이스 매핑을 제공한다. JSON은 Persevere 클라이언트와 서버가 통신하는 포맷이다. 여러분은 간단한 JavaScript 코드와 API 사용하여 영속 객체 매핑을 통해 대부분의 객체 액세스와 수정을 수행할 수 있다.그림 1 은 영속 서비스 지향 아키텍처(SOA)이다:


그림 1. Persevere 영속 JSON SOA

주: Persevere는 persistentjavascript.org에 정의된 JavaScript에 영속성을 위한 오픈 API 구현한다.

시작하기

시작하려면, Persevere를 다운로드 하여 설치한다. Persevere 서버에는 클라이언트가 제공되기 때문에, Persevere 서버만 다운로드 하면 된다. Persevere 서버와 실행할 준비가 된 Apache Tomcat을 다운로드 하거나, Java 2 Platform, Enterprise Edition (J2EE) 웹 애플리케이션을 다운로드 한다. Tomcat을 다운로드 하면, bin 폴더로 가서 startup 을 실행하여 서버를 시작한다.

영속 객체 그래프에서, 객체에 액세스 하여 수정할 수 있고, 변경 사항들이 유지된다. Persevere에는 영속 객체 브라우저(JSPON 브라우저)가 포함된다. 또한, Persevere 서버는 동적으로 확장 가능한 객체 영속 스토리지를 지원하기 때문에, 블로그를 만들기 위해 어떤 테이블도 만들 필요가 없다. 블로그 구현을 시작하기 위해, 브라우저(기본 Tomcat을 사용한다면, http://localhost:8080/browser.html)를 열고, 블로그 어레이 객체를 만든다. (그림 2) (필자는 블로그 객체를 root 객체의 프로퍼티로 만들 것이다.):


그림 2. 블로그 어레이 객체 만들기

Persevere의 영속성 기능에 액세스 하기

Persevere의 영속성 기능에 액세스 할 수 있는 여러 대안 방식들이 있다. 사전 프로세싱(preprocessing)은 표준 JavaScript 프로퍼티 신택스를 통한 프로퍼티의 레이지 로딩(lazy loading)을 지원하고 프로퍼티 변경 사항들의 자동 저장에만 필요하다 하지만, 명확한 저장 및 레이지 로딩 기능을 가진 영속성 객체 매핑은 Persistent JavaScript API 를 사용하여 사전 프로세싱 없이도 사용할 수 있다. 또한 서버에서 또는 빌드 동안 사전 프로세싱을 수행할 수 있는데, 최상의 성능을 위해서는 실제 애플리케이션에 대해 수행되어야 한다. 또한, Persevere는 JavaScript V1.7 (Firefox V2.0 및 이후 버전)에서 (사전 프로세싱 없이) 모든 기능들을 실행할 수 있고, JavaScript V1.7 지원을 갖고 있지 않은 브라우저를 위해 사전 프로세싱을 사용할 수 있다. 개발 방법과 빌드 프로세스에 대한 자세한 내용은 Persevere 문서를 참조하라.

root 객체는 고정된 객체로서, 동적인 객체 데이터베이스의 모든 영속 객체 그래프에 다가갈 수 있다. 이를 수행하려면:

  1. 브라우저에서 http://localhost:8080/browser.html?id=root를 연다. (또는 http://localhost:8080/browser.html을 열 수 있는데, Load New Object 를 클릭하고 root 를 입력한다.)
  2. New Property 를 클릭하여 프로퍼티를 root 객체에 추가한다. 필드 이름 blog 를 사용하고, 어레이 객체를 만든다. 이 객체는 블로그 포스트 리스트를 나타낸다.
  3. 블로그 객체를 클릭하고, New Property 를 클릭한다; 프로퍼티 이름으로 name 을 선택하고, 블로그 이름을 입력한다.
  4. 변경 사항을 저장한다.

영속성 인식 JavaScript 코드

Persevere 프레임웍을 사용하여 영속 객체에 액세스 한다. Persevere 프레임웍에서, JavaScript 코드를 사전 처리하여 레이지 로딩과 orthogonal persistence 지원을 추가해야 한다. JavaScript 파일을 로딩하는 persevere.loadScript 를 호출함으로써 이를 쉽게 수행한다. (대안 방식으로, 사이드 바의 Persevere의 영속성 기능에 액세스 하기 참조) Persevere에서, (.js가 아닌) .pjs 확장을 사용하여 이 파일이 전체 영속성 지원을 갖고 이는 JavaScript 파일이란 것을 나타낸다. loadScript() 함수는 필요한 프로세싱을 수행한다.

이 예제에서, 기본 loadScript 기능을 사용하는데, 이것은 클라이언트 상에서 사전 프로세싱을 수행한다. orthogonal persistence 기능을 설명하기 위해, 블로그의 이름을 바꾸는 함수를 작성해 본다. ( Listing 1 ):


Listing 1. 단일 블로그 포스트에 대한 HTML 코드 만들기
function changeBlogName(blog) { blog.name = prompt("Enter a new name for our blog"); }

블로그 생성하기


그런 다음, 블로그에 새 포스트를 생성하기 위한 HTML/JavaScript 인터페이스를 만든다. 먼저, blog.html 이라는 파일을 만들고, 이것을 웹 애플리케이션의 루트 디렉토리에 놓는다. (기본 Tomcat의 webapps/ROOT/). 그리고 나서, 모든 영속성 기능을 하는 JavaScript 코드를 사용하여 blog.pjs 라고 하는 파일을 만든다. Listing 2는 블로그 애플리케이션용 HTML 코드이다.


Listing 2. blog.html
<html> <head> <!--include the persistence framework --> <link rel="stylesheet" type="text/css" href="blog.css"/> </head> <body> <a href="#" onclick="renderBlog()">Home</a> <!-- we render the blog in this div later --> <div id="newPost"> <h3>Enter a new post</h3> <div> Content:<textarea id="newPostContent">new post</textarea> </div> <button onclick="addBlogPost()">Post</button> </div> <script> persevere.loadScript("blog.pjs"); </script> <script type="text/javascript"> var _tiq = 'undefined' !== typeof _tiq ? _tiq : []; _tiq.push(['__setConfig', {enableScroll:true, enableClick:true, enableButton:true}]); _tiq.push(["__setParam", "svcdomain", "user.tistory.com"]); (function(d) { var se = d.createElement('script'); se.type = 'text/javascript'; se.async = true; se.src = location.protocol + '//m2.daumcdn.net/tiara/js/td.min.js'; var s = d.getElementsByTagName('head')[0]; s.appendChild(se); })(document); _tiq.push(['__setParam', 'param_ex', JSON.stringify({"userId":"225242","blogId":"226095","role":"guest","filterTarget":false})]); _tiq.push(['__trackPageview']); var addEvent = function (evt, fn) { window.addEventListener ? window.addEventListener(evt, fn, false) : window.attachEvent('on' + evt, fn); }; var removeEvent = function(evt, fn) { window.removeEventListener ? window.removeEventListener(evt, fn, false) : window.detachEvent('on' + evt, fn);}; var ua = navigator.userAgent.toLowerCase(); var isIOS = /iP[ao]d|iPhone/i.test(ua); var contentExStat = function() { _tiq.push(['__content', 't_content_ex', { 'data_type':'usage' }]); removeEvent(isIOS ? 'pagehide' : 'beforeunload', contentExStat); }; addEvent(isIOS ? 'pagehide' : 'beforeunload', contentExStat); </script> <script type="text/javascript">window.roosevelt_params_queue = window.roosevelt_params_queue || []; window.roosevelt_params_queue.push({channel_id: "dk", channel_label: 'tistory'});</script> <script type="text/javascript" src="//t1.daumcdn.net/midas/rt/dk_bt/roosevelt_dk_bt.js" async></script><script type="text/javascript">if(window.console!=undefined){setTimeout(console.log.bind(console,"%cTISTORY","font:8em Arial;color:#EC6521;font-weight:bold"),0);setTimeout(console.log.bind(console,"%c 나를 표현하는 블로그","font:2em sans-serif;color:#333;"),0);}</script><iframe style="position:absolute;width:1px;height:1px;left:-100px;top:-100px" src="//springand.tistory.com/api" id="editEntry"></iframe><div id="tistoryEtcLayer" class="layer_post"></div><div id="tistorySnsLayer" class="layer_post"></div></body> </html>

이제, blog.pjs에 JavaScript 함수를 작성하여 새로운 포스트를 추가할 수 있다. 새로운 포스트를 추가한다는 것은 새로운 포스트를 나타내는 새로운 JavaScript 객체를 만드는 것이다. 새로운 포스트를 영속 블로그 어레이 객체에 추가한다. 대부분의 작업이 표준 JavaScript 코드를 사용하여 수행되지만, root 객체가 블로그 객체에 액세스 하도록 해야 한다. pjs.load("root") 를 호출함으로써 이를 수행한다. load() 함수는 Persistent JavaScript API에 의해 정의되어 ID 별로 객체를 로딩한다. root 는 객체 데이터베이스의 root 객체에 대한 앨리어스 ID이다. Listing 3은 새로운 블로그 포스트를 추가하는 함수이다.


Listing 3. addBlogPost() 함수
function addBlogPost() { var blog = pjs.load("root").blog; var newPost = { title : "new post", content : document.getElementById('newPostContent').value, created : new Date(), comments : [] // an empty array of comments }; blog.push(newPost); // blog is an array, so we can add a new post to the top // of the array using standard array functions newPost.title = prompt("What would you like to title the new post?",newPost.title); }

addBlogPost() 가 호출되면, 새로운 포스트가 블로그에 추가된다; Persevere 프레임웍은 하나의 트랜잭션에 전체 연산을 자동으로 래핑하고, 이것을 영속시킬 서버로 보낸다. orthogonal persistence를 사용할 때 저장 또는 영속 메소드를 호출할 필요가 없다. 프로퍼티와 어레이 변경은 자동으로 저장된다.


그런 다음, 블로그에 포스트를 디스플레이 하는 함수를 작성한다. 코드를 모듈화 하려면 두 개의 함수를 작성해야 한다. 하나는 전체 블로그를 렌더링 하는 것이고, 다른 하나는 단순한 단일 포스트를 렌더링 하는 것이다. Listing 4는 이러한 포스트를 디스플레이 하는 JavaScript 코드이다:


Listing 4. 블로그용 HTML 코드 생성하기
function renderBlog() { var blog = pjs.load("root").blog; // get the blog object, the list of the postings blogElement = document.getElementById("blogDiv"); blogElement.innerHTML = ""; // clear it out for (var i =0; i < blog.length;i++) // iterate through blog posts, render each one renderPost(blog[i],blogElement.appendChild(document.createElement('div'))); }

간단한 for 루프를 사용하여 블로그의 포스트를 반복한다. Persevere는 레이지 로딩을 수행하기 때문에, 필요한 데이터만 다운로드 된다. 초기화 되지 않은 프로퍼티에 액세스 될 때, Persevere는 자동으로 서버에서 정확한 데이터를 요청하고, 실행을 시작한다. Persevere는 continuation을 사용하여 실행을 중지 및 재시작 하여 비동기식 요청을 통해 서버에서 데이터를 가져온다. (따라서, 브라우저는 동기식 요청 때문에 고정되지 않는다.)

이제, 각 포스트를 실행하기 위해, Listing 5처럼 코드를 타이핑 한다:


Listing 5. 단일 블로그 포스트용 HTML 코드 생성하기
function renderPost(post,postDiv) { var html = "<h2>" + post.title + "</h2>" + "<h4>" + post.created + "</h4><p>" + post.content + "</p>"; postDiv.innerHTML = html; }

새로운 포스트가 즉각 나타나게 하려면, 페이지가 로딩될 때 그리고 addBlogPost 를 호출할 때, addBlogPost() 함수의 끝에 그리고 blog.pjs의 끝에 renderBlog() 로의 호출을 추가한다. 또한, push() 메소드 대신 unshift() 어레이 메소드를 사용하여 포스트를 리스트 위에 추가한다.

이제, 새로운 블로그 인터페이스를 사용하여, 포스트를 블로그에 추가하고 기능을 수행하는 블로그를 갖추었다. 두 개의 포스트를 추가한 후에, 여러분의 블로그 모습은 그림 3과 같이 된다:


그림 3. 새로운 블로그


영속 객체 브라우저로 가서 저장되었던 데이터를 본다. 그림 4는 포스트에 이은 브라우저이다:


그림 4. 블로그 포스트를 따르는 영속 데이터


 블로그 엔트리에 코멘트 달기

블로그 포스트에 코멘트를 다는 기능을 추가할 수 있다. 블로그 포스트를 클릭하는 onclick 이벤트를 추가하는데, 이것은 코멘트가 달린 단일 블로그 포스팅을 만든다. 그리고 나서, 단일 포스트 뷰를 위한 코멘트 폼을 추가한다. 다음에는, 하나의 포스트를 블로그 객체에 추가했던 방법과 비슷하게 블로그 포스트에 코멘트를 추가한다. 다운로드 섹션에 코멘트 기능을 추가하는 코드가 있다. 보다 자세한 내용은 Persevere 문서를 참조하라.

Persevere에 영속 객체 매핑 기능과 Persevere 서버의 동적 객체 생성 기능을 사용함으로써, 블로그에 필요한 영속성을 쉽게 만들 수 있다. 블로그를 생성하기 위해 수행할 필요가 없었던 모든 단계들에 대해 생각해 보라: 데이터베이스 테이블을 생성하거나, Ajax 호출을 작성하거나, Structured Query Language (SQL) 코드를 작성하거나, 설정 파일 수정하거나, 컨트롤러를 생성할 필요가 없었다. 간단한 HTML과 JavaScript 코드를 사용하여 블로그를 구현했다.

보안

여러분이 구현했던 블로그에는 아직 보안이 확립되지 않았다: 게시할 수 있는 모든 사람들에게 완전히 개방되어 있다. 대부분의 웹 애플리케이션에서, 포스팅 액세스와 데이터 수정을 제한한다. 여러분 블로그의 로직은 클라이언트 측 JavaScript 스크립트이고, 보안은 클라이언트에서만 실행되어서는 안된다.

Persevere 서버는 서버에서 실행되는 빌트인, 데이터 중심의 보안 기능을 갖고 있다. 대부분의 웹 애플리케이션 개발 시나리오에서, 개발자들은 애플리케이션 로직에 보안을 구현한다. 하지만, 이것은 대형 웹 애플리케이션에는 위험한 접근 방식이다. 애플리케이션 로직이 커지면서, 공격 요소도 높아지기 때문이다. 애플리케이션 로직이 복잡해 질수록, 공격자가 허점을 찾을 수 있는 기회도 더 많아진다. 데이터 중심 보안을 사용함으로써, 보안을 애플리케이션 로직과 분리한다. 이를 통해 보안 관리는 더욱 용이해 진다.

Persevere 서버가 처음 설치되면, 비보안 모드에서 시작된다. 보안을 실행하려면, 영속 객체 브라우저(http://localhost:8080/browser.html)를 열고 Sign in 을 클릭하여 새로운 사용자를 생성한다. 새로운 사용자가 생성되면, 보안이 실행되고, 새로운 사용자는 수퍼 유저로 임명된다. 보안이 실행된 상태에서, 기본 보안 레벨은 영속 객체들이 일반인에게는 읽을 수 있는 것으로, 수퍼 유저(새롭게 생성된 사용자)에게는 쓸 수 있는 것으로 된다. 자세한 내용은 Persevere 서버 문서를 참조하라.

관계형 데이터베이스

아마도 가장 일반적인 영속 객체 매핑의 형태는 객체 관계형 매핑일 것이다. 이 글에서는 클라이언트에서 생성된 데이터 구조에서의 영속 객체 매핑에 대해 배웠지만, Persevere 서버는 전통적인 관계형 데이터베이스를 지원하고, Persevere에서 영속 객체 매핑을 위해 JSON REST 서비스를 통해 SQL 데이터베이스 테이블 데이터를 노출한다. SQL 데이터베이스 테이블 예제를 보려면, 영속 객체 브라우저를 열고, exampledatabasetable/ 객체를 로딩한다. load() 함수로 JavaScript 파일에서 이 데이터를 로딩할 수 있고, 테이블은 일반 JavaScript 어레이로서 액세스 가능하다. Listing 6의 JavaScript 코드를 사용하여 테이블에 있는 데이터를 쉽게 수정할 수 있다:


Listing 6. 관계형 데이터베이스와의 JavaScript 인터랙션
function changeNameForFirstRow() { pjs.load("exampledatabasetable/")[0].name="New name"; }

이 문은 테이블에서 데이터를 로딩하고, 첫 번째 행의 이름 컬럼의 값을 새로운 값으로 바꾼다. 또한, 블로그 예제에 사용된 객체 데이터베이스 스토리지를 관계형 데이터베이스 스토리지로 대체할 수 있다. 객체 추상화 대문에, 관계형 데이터베이스 스토리지가 정확히 설정되면, 블로그 프로퍼티를 수정하여 관계형 데이터베이스 스토리지를 참조할 수 있고, 블로그 애플리케이션은 단 한 줄의 코드도 바꾸지 않고 똑같이 작동한다.

추가 Persevere 기능들

Persevere에는 JSON Schemas를 정의하는 것을 지원한다. JSON Schemas 는 프로퍼티 값으로 허용할 수 있는 유형을 정의한다. 예를 들어, title 프로퍼티는 스트링이어야 한다거나, 코멘트 아이템은 author , created , content 를 갖고 있어야 한다는 식이다. 이것은 XML의 Document Type Definitions (DTD) 또는 객체 지향 언어의 클래스와 같다. 구조 역시 프로퍼티가 영속적인지 아니면 일시적(변경될 때 저장되지 않음)인 것인지 여부를 정의할 수 있다. Persevere가 프로퍼티를 영속시킬 때 사용하는 규칙을 이해하는 것은 중요한 문제이므로, Persevere 문서를 참조하라.


Persevere에서 크로스-도메인 데이터에 액세스 하기

Persevere에서는 다른 서버에서 영속 객체 그래프들로 확장될 수 있는 크로스-도메인 그래프를 구현할 수 있다. 영속 객체 브라우저에서, 새로운 프로퍼티를 만들고, Existing by ID 를 선택한 다음, JSON 객체용 URL을 입력한다.

트랜잭션


Persevere는 수정 사항들을 트랜잭션으로 그룹핑 한다. 한 개의 이벤트 핸들링에서 발생한 모든 수정 사항(예, onclick 이벤트로 인한 addBlogPost() 에 생긴 변경 사항)은 하나의 트랜잭션으로 그룹핑 된다. 브라우저 내 모든 JavaScript 프로세싱이 이벤트 정황에서 발생하기 때문에, 이 작동은 트랜잭션 핸들링에 편리한 방식을 제공한다.


하지만, 트랜잭션에 더 심도 깊은 컨트롤이 필요할 때가 있다: Persistent JavaScript API는 트랜잭션을 제어하는 두 개의 메소드, pjs.commit() 과 pjs.rollback() 을 정의한다. commit() 메소드는 변경 사항을 즉각적으로 실행한다. rollback() 메소드는 이벤트 시작 이후 생긴 모든 변경 사항 또는 마지막 실행 후에 생긴 모든 변경 사항들을 실행 취소 한다. 예를 들어, addBlog() 함수의 끝에 확인을 추가하면, 취소할 경우 포스팅을 실행 취소 할 것이다. (Listing 7):


Listing 7. 트랜잭션 제어
function addBlogPost() { ... if (!confirm("Are you sure you want to create this post?")) pjs.rollback(); }

대안 서버


Persevere JavaScript 클라이언트는 Persevere 서버에 의존하지 않는다. 서버와의 모든 통신이 표준 HTTP 메소드와 JSON 포맷에 의존하기 때문에, Persevere를 사용하여 PHP, Ruby, 기타 기술과 영속 객체 매핑을 수행하는 것은 어렵지 않다. 이 글에서는 HTTP와 JSPON 스팩을 다루지 않지만, 서버는 JSON을 제공해야 하고, 표준 HTTP(PUT, POST, DELETE) 수정 요청을 JSPON 스팩에 따라 핸들 해야 한다.


영속 함수와 분산 컴퓨팅


Persevere는 함수 또는 메소드를 동적 영속 객체에 존속시킨다. 이 블로그 애플리케이션에서, 여러분이 작성했던 모든 함수들을 블로그 영속 객체의 메소드로서 생성할 수 있다. 이러한 방식을 사용하여, 전체 애플리케이션 로직은 데이터와 같은 영속 스토리지에 저장될 수 있다. Persevere 서버는 내부 JavaScript 환경을 사용하여 영속 객체를 매핑하기 때문에( 그림 1 ), 영속 함수들은 클라이언트에서처럼 서버에서 실행될 수 있다.


Persevere 서버는 Persistent JavaScript를 구현하기 때문에, 이 함수는 클라이언트에서와 같은 방식으로 영속 데이터에 액세스 할 수 있고, JSON-RPC를 사용함으로써, 일반적인 JavaScript 호출 신택스로 원격 환경에서 함수를 보다 투명하게 호출할 수 있다. 이러한 기능은 애플리케이션에 더욱 일관된 환경을 제공한다. 하나의 스토리지 장치가 로직과 데이터에 사용되기 때문이다. 또한, 프로그래밍에 실시간을 제공한다. 함수들은 영속 객체 브라우저에서 작성, 테스트, 저장될 수 있다.


Ajax 리소스 센터
developerWorks Ajax 리소스 센터 에서는 Ajax 애플리케이션을 개발할 때 참조할 수 있는 무료 툴, 코드, 정보를 제공한다. 디스커션 포럼 에서 여러분이 궁금해 했던 질문에 대한 답을 얻으실 수 있다.

결론


orthogonal persistence 객체 매핑을 사용함으로써, 간단하고 친숙한 JavaScript 코드를 사용하여 강력한 Ajax 애플리케이션을 신속하게 개발할 수 있다. Ajax 요청, 직렬화, 데이터베이스 인터랙션을 작성할 때의 복잡함은, 신속한 애플리케이션 개발을 위해 영속 데이터로 객체 지향 방식의 액세스를 제공하는 Persevere에서 쉽게 처리될 수 있다.

다운로드 하십시오

설명
이름
크기
다운로드 방식
블로그 애플리케이션 예제 wa-aj-objmap.zip 2KB HTTP

필자소개

Kris Zyp

Kris Zyp은 소프트웨어 개발자, 컨설턴트 겸 Xucia 의 창립자이다. JavaScript 영속성, co-routine, 기타 언어 기능을 집중적으로 다루고 있다. Persevere (JavaScript 영속 객체 매핑 프레임웍), Strands (JavaScript co-routine 및 쓰레드 지원), Authenteo (Ajax 기반 웹 콘텐트 관리 시스템), JSPON 스팩과 함께 JSPON 소스에 액세스 하는 오픈 소스 툴을 개발했다.

wa-aj-objmap.zip

wa-aj-objmap.zip


 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

알아두면 유용한 XML 스키마 열 가지
+   [Programming]   |  2008.10.13 10:03  

원문 링크 : http://www.dbguide.net/know/know102001.jsp?mode=view&pg=1&idx=3632


알아두면 유용한 XML 스키마 열 가지

다양한 플랫폼과 환경에서 정보를 공유하는 방법을 소개한다


이 기사에서는 웹 서비스 기초에서 정보 설명에 이르기까지 다양한 문제에 대한 해결책을 제공하는 XML 스키마 중 가장 많이 쓰이는 스키마 열 개를 살펴봅니다. 이 과정에서 연락처(contact)나 송장(invoice) 등 데이터베이스와 비슷한 해결책도 알아봅니다. 이 기사에서 선택한 스키마 열 개는 XML 형식으로 정보를 공유하고 교환한다는 관점에서 유용성, 실용성, XML 공동체에 미치는 영향을 토대로 선별했습니다.

자주 사용하는 약어
  • Ajax: Asynchronous JavaScript + XML
  • CPU: Central Processing Unit
  • CSS: Cascading Stylesheets
  • HTML: Hypertext Markup Language
  • OASIS: Organization for the Advancement of Structured Information Standards.
  • PDF: Portable Document Format
  • W3C: World Wide Web Consortium
  • XHTML: Extensible HyperText Markup Language
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations










 






 


 

SOAP



SOAP(Simple Object Access Protocol)은 사실상 웹 서비스 기술이다. 구체적으로는 웹 서비스에서 클라이언트와 서버 사이에서 정보를 교환하는 자료 형식으로, 유연성이 좋은 XML 스키마 중 하나다.


웹 서비스가 제공하는 장점 중 하나는 고도의 상호운용성(interoperability)이다. 웹 서비스를 제공하는 서버와 웹 서비스를 사용하는 클라이언트는 네트워크 상에서 다양한 정보와 자료를 주고 받는다. SOAP 표준은 XML을 사용하여 아키텍처에 중립적인 형식으로 자료 유형과 정보 구조를 정의한다.

흔히 웹 서비스 사용자는 (자신이 선택한 프로그래밍 언어로) 호출하려는 원격 함수 이름과 인수만 제공하면 충분하다. 그러면 SOAP 라이브러리가 함수 이름과 인수 정보를 XML 메시지로 변환한다.


SOAP 구조가 궁금하다면 W3 콘소시엄에서 제공하는 예제를 살펴본다. 원격 SOAP 함수 GetEndorsingBoarder() 를 호출하면 SOAP 라이브러리는 Listing 1과 같은 XML 메시지를 생성한다.



Listing 1. 원격 SOAP 함수 GetEndorsingBoarder() 호출

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetEndorsingBoarder xmlns:m="http://namespaces.snowboard-info.com"> <manufacturer>K2</manufacturer> <model>Fatbob</model> </m:GetEndorsingBoarder> </SOAP-ENV:Body> </SOAP-ENV:Envelope>


 

SOAP 클라이언트가 보내는 전체 메시지는 SOAP 인벨롭(Envelope)이라는 형식으로 인코딩된다. 실제 메시지 내용은 SOAP 인벨롭 내용으로 들어간다.


Listing 1을 보면, SOAP 클라이언트가 호출하는 원격 함수는 GetEndorsingBoarder 이며, 함수가 받는 인수는 manufacturer와 model이라는 사실이 명백히 드러난다. 즉, 원래 프로그래밍 언어에서는 십중팔구 이진 형식이었을 정보가 XML 형식으로 분명히 표현된다. XML은 플랫폼에 독립적이므로 각 호스트는 (복잡한 이진 정보를 인코딩하거나 디코딩할 필요 없이) SOAP 시스템을 사용하여 XML 메시지를 쉽게 주고 받을 수 있다.


서버가 보내는 응답 역시 XML 형식의 SOAP 인벨롭이다. 이번에는 함수 반환값이 SOAP 인벨롭 내용으로 들어간다. SOAP 응답은 상응하는 SOAP 요청과 항상 똑같은 형식이다. 단, 상세 정보에 Response 가 덧붙는다. 자세한 내용은 Listing 2를 참조한다.


Listing 2. SOAP 요청을 보낸 후 받은 응답
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetEndorsingBoarderResponse xmlns:m="http://namespaces.snowboard-info.com"> <endorsingBoarder>Chris Englesmann</endorsingBoarder> </m:GetEndorsingBoarderResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>


 

일반적으로는 사용자가 SOAP 메시지를 직접 작성하지 않는다. SOAP 라이브러리가 알아서 만들어 준다. 하지만 SOAP 인벨롭 구조 자체는 아주 간단하므로 SOAP 표준을 사용하여 정보를 공유하기는 어렵지 않다.


SOAP 표준을 사용하면 원격 함수를 호출하고 원격 함수와 정보를 교환하기가 매우 쉬워진다. RPC(Remote Procedure Call) 표준을 사용하려면 이진 자료를 직렬화하는 복잡한 메서드가 필요하며, 좀 더 구조화된 정보를 전송하므로 원본 자료를 상세히 선언하고 변환해야 한다.

SOAP을 사용하면, XML로 직렬화하는 과정이 간단해지고, 플랫폼과 언어에 독립적이며, 자료 교환이 훨씬 쉬워진다.


 




 

WSDL


WSDL(Web Services Description Language)은 웹 서비스를 기술하는 편리한 방법이다(대부분 SOAP을 사용한다). WSDL을 사용하면 SOAP 표준을 사용하는 서비스와 인터페이스를 기술할 수 있다.

예를 들어, 개별 서버가 제공하는 웹 서비스를 WSDL 파일로 기술한 후 웹 서비스를 사용하려는 소비자에게 이 파일을 배포한다. 그러면 소비자는 WSDL 파일을 읽어서 해석하는 방식으로 웹 서비스 사용법을 파악하게 된다. WSDL 파일은 웹 서비스와 주고 받을 자료 유형과 인수, 웹 서비스가 반환하는 오류나 기타 정보 등을 포함한다.


W3가 제공하는 예제를 다시 살펴보자. Listing 3에서 보듯이, 서버와 클라이언트가 주고 받을 자료와 클라이언트가 호출할 원격 함수가 XML 형식으로 정의되어 있다.


Listing 3. 다양한 원격 함수와 교환 대상 자료가 정의된 XML 파일
<?xml version="1.0"?> <!-- root element wsdl:definitions defines set of related services --> <wsdl:definitions name="EndorsementSearch" targetNamespace="http://namespaces.snowboard-info.com" xmlns:es="http://www.snowboard-info.com/EndorsementSearch.wsdl" xmlns:esxsd="http://schemas.snowboard-info.com/EndorsementSearch.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <!-- wsdl:types encapsulates schema definitions of communication types; here using xsd --> <wsdl:types> <!-- all type declarations are in a chunk of xsd --> <xsd:schema targetNamespace="http://namespaces.snowboard-info.com" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <!-- xsd definition: GetEndorsingBoarder [manufacturer string, model string] --> <xsd:element name="GetEndorsingBoarder"> <xsd:complexType> <xsd:sequence> <xsd:element name="manufacturer" type="string"/> <xsd:element name="model" type="string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- xsd definition: GetEndorsingBoarderResponse [... endorsingBoarder string ...] --> <xsd:element name="GetEndorsingBoarderResponse"> <xsd:complexType> <xsd:all> <xsd:element name="endorsingBoarder" type="string"/> </xsd:all> </xsd:complexType> </xsd:element> <!-- xsd definition: GetEndorsingBoarderFault [... errorMessage string ...] --> <xsd:element name="GetEndorsingBoarderFault"> <xsd:complexType> <xsd:all> <xsd:element name="errorMessage" type="string"/> </xsd:all> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <!-- wsdl:message elements describe potential transactions --> <!-- request GetEndorsingBoarderRequest is of type GetEndorsingBoarder --> <wsdl:message name="GetEndorsingBoarderRequest"> <wsdl:part name="body" element="esxsd:GetEndorsingBoarder"/> </wsdl:message> <!-- response GetEndorsingBoarderResponse is of type GetEndorsingBoarderResponse --> <wsdl:message name="GetEndorsingBoarderResponse"> <wsdl:part name="body" element="esxsd:GetEndorsingBoarderResponse"/> </wsdl:message> <!-- wsdl:portType describes messages in an operation --> <wsdl:portType name="GetEndorsingBoarderPortType"> <!-- the value of wsdl:operation eludes me --> <wsdl:operation name="GetEndorsingBoarder"> <wsdl:input message="es:GetEndorsingBoarderRequest"/> <wsdl:output message="es:GetEndorsingBoarderResponse"/> <wsdl:fault message="es:GetEndorsingBoarderFault"/> </wsdl:operation> </wsdl:portType> <!-- wsdl:binding states a serialization protocol for this service --> <wsdl:binding name="EndorsementSearchSoapBinding" type="es:GetEndorsingBoarderPortType"> <!-- leverage off soap:binding document style ...(no wsdl:foo pointing at the soap binding) --> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <!-- semi-opaque container of network transport details classed by soap:binding above ... --> <wsdl:operation name="GetEndorsingBoarder"> <!-- again bind to SOAP? ... --> <soap:operation soapAction="http://www.snowboard-info.com/ EndorsementSearch"/> <!-- further specify that the messages in the wsdl:operation "GetEndorsingBoarder" use SOAP? ... --> <wsdl:input> <soap:body use="literal" namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/> </wsdl:output> <wsdl:fault> <soap:body use="literal" namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <!-- wsdl:service names a new service "EndorsementSearchService" --> <wsdl:service name="EndorsementSearchService"> <wsdl:documentation>snowboarding-info.com Endorsement Service</ wsdl:documentation> <!-- connect it to the binding "EndorsementSearchSoapBinding" above --> <wsdl:port name="GetEndorsingBoarderPort" binding="es:EndorsementSearchSoapBinding"> <!-- give the binding an network address --> <soap:address location="http://www.snowboard-info.com/EndorsementSearch"/> </wsdl:port> </wsdl:service> </wsdl:definitions>


 

WSDL은 메시지 유형, 폴트 유형과 내용, 교환할 자료 구조를 선언한다.

WSDL은 클라이언트가 SOAP 인터페이스로 웹 서비스를 사용할 때 필요한 모든 정보를 제공한다. 대다수 언어와 환경은 WSDL을 읽고 해석하여 함수와 자료를 추출하는 메커니즘을 제공한다.


WSDL은 정보 교환 시 클라이언트가 사용할 SOAP 인터페이스를 정의할 뿐만 아니라, 적당한 WSDL 생성기(generator)가 있다면, 요청을 전송하고 응답을 인식하는 코드를 생성할 때도 사용할 수 있다.

WSDL과 SOAP을 함께 사용하면 강력한 원격 프로시저 호출 시스템을 만든다.





 

RDF


시맨틱 웹(Semantic Web)과 시맨틱 그리드(Semantic Grid)는 둘 다 RDF(Resource Description Framework)가 제공하는 기술 언어(description language)를 사용한다. 사실 RDF 형식은 여러 표준을 묶어놓은 집합이다. RDF를 사용하면 여러 곳에 흩어진 정보와 자원을 연결하고 연관짓는 방법으로 정보와 자료를 묘사한다.


RDF는 W3가 인정하는 표준이며 정보와 자원을 정의한다. XML만이 RDF를 표현하는 유일한 방법은 아니다. 하지만 직렬화 형식 중 하나가 XML로 정보를 기술한다.


자원은 주어-술어-목적어(Subject-Predicate-Object) 형식으로 정의한다. 예를 들어, 웹 사이트 내용을 정의할 때 주어는 ‘웹 사이트(web site)', 술어는 ‘포함한다(contains)', 목적어는 내용 유형(content type)이 된다. 웹 사이트와 다른 자원 간에 관계를 생성하려면 FOAF(Friend of a Friend) 표기법을 사용하여 두 자원 사이에 링크를 생성한다.


RDF를 사용하는 목적은 정보와 자원을 기술하는 자연 언어를 컴퓨터가 이해하는 형식으로 표현하기 위해서다. 예를 들어, The MCSLP.com Website is authored by Martin C Brown 이라는 문장을 RDF XML 형식으로 기술하면 Listing 4와 같다.



Listing 4. RDF XML로 다시 표현한 문장
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:si="http://www.recshop.fake/siteinfo#"> <rdf:Description rdf:about="http://www.mcslp.com/ "> <si:author>Martin C Brown</si:author> </rdf:Description> </rdf:RDF>


 

RDF를 사용하는 또 다른 예제는 초창기 신디케이션 시스템이다. 초창기 뉴스 사이트와 블로그는 RDF 명세를 사용하여 피드 내용과 개별 포스팅을 정의했다. 예제는 Listing 5를 참조한다.


Listing 5. RDF 명세로 정의한 피드 내용과 개별 포스팅
<?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/"> <channel> <title>MCslp</title> <link>http://www.mcslp.com</link> <description>MCslp Projects</description> </channel> <item> <title>Voice enabling XMLtitle> <link>http://mcslp.com/?p=295link> </item> ... </rdf:RDF>


 

원래 RDF 표준은 웹 상에서 자원, 내용, 관계를 기술하려는 구체적인 목적으로 설계되었다. 그러나 지금은 일반적인 정보, 자원, 관계를 기술하는 표준으로 사용된다.


시맨틱 웹과 시맨틱 그리드에서 응용 프로그램이 다양한 정보를 활용하고 자료를 서로 연관지으려면 자원과 관계를 정의하는 표준이 필수적이다.




 

vCard


모든 비즈니스 응용 프로그램에서 연락처 정보 관리는 필수다. 이 때 정보 획득에 효과적인 XML 구조를 사용하면 정보를 관리하기가 훨씬 수월해진다.


연락처 정보는 가변성이 많아서 XML이 가장 적합한 방법으로 꼽힌다. 예를 들어, 어떤 회사나 개인은 주소, 전화번호, 전자편지 주소가 여러 개다. XML 구조를 사용하면 무리 없이 이런 다중 정보 조각을 관리할 수 있다.


vCard는 인터넷에서 자주 사용되며, 플랫폼에 독립적인 방식으로 연락처 정보를 표현하므로, 다양한 응용 프로그램에서 연락처 정보를 생성하거나 교환하기 편리하다. vCard는 XML 구조의 유연성을 어느 정도 지원하지만, 사실은 필드와 확장자가 정해진 간단한 텍스트 파일이다. XML과는 달리 vCard 형식은 1차원 파일이다. 즉, 다른 엘리먼트에 정보를 곧바로 첨부하지 못한다는 뜻이다. 전화번호가 좋은 예로, 전화번호는 명시적인 주소에 연결하지 못한다. 단지 또 다른 전화번호로만 추가할 수 있다.


W3C는 RDF XML에 기반을 둔 vCard XML 형식을 제안한다. 이 형식을 사용하면 연락처 정보를 생성하고 교환하기가 더욱 쉬워진다. RDF를 프레임워크로 사용하면 선언 과정에서 구조 정보 일부를 보존할 수 있다. 예를 들어, RDF 표준은 자료 기술 방법으로 백(bag), 순서(sequence), 대체물(alternative)을 지원한다. 백(bag)은 개체를 여러 번 선언할 때 사용하며 순서는 없다. 역할이 여러 개인 경우처럼 순서가 중요하지 않을 때 사용한다. 순서(sequence)는 개체 순서를 정의할 때 사용한다. 예를 들어, 조직 내에서 역할 계층을 정의할 때 사용하면 적합하다. 대체물(alternative)을 사용하면 목록에서 한 항목을 선택할 수 있다. 예를 들어, 여러 전자편지 주소에서 하나를 선택할 수 있다.


Listing 6은 Charles Perston이라는 가상 인물을 위한 전형적인 vCard다.


Listing 6. Charles Perston이라는 가상 인물을 위한 전형적인 vCard
BEGIN:VCARD VERSION:3.0 N:Perston;Charles;;; FN:Charles Perston ORG:Perston Technology; EMAIL;type=INTERNET;type=WORK;type=pref:null@perston.co.uk TEL;type=WORK;type=pref:01234 567890 item1.ADR;type=WORK;type=pref:;;Perston House;Perston;Perstonshire;P1 0NS;UK item1.X-ABADR:gb X-ABUID:5AE47BB6-4E0F-4558-980C-BD3066FA6154\:ABPerson END:VCARD


 

Listing 7은 vCard XML 표준을 사용하여 Listing 6을 표현한 결과다.


Listing 7. vCard XML 표준을 사용하여 Charles Perston이라는 가상 인물을 표현한 결과
<vCard:vCard xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:foaf="http://xmlns.com/foaf/0.1/" vCard:version="3.0" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" vCard:class="PUBLIC" xmlns:vCard="x-urn:cpan:ascope:xml-generator-vcard#"> <vCard:fn>Charles Perston</vCard:fn> <vCard:n> <vCard:family>Perston</vCard:family> <vCard:given>Charles</vCard:given> </vCard:n> <vCard:adr vCard:del.type="pref;work"> <vCard:street>Perston House</vCard:street> <vCard:locality>Perston</vCard:locality> <vCard:region>Perstonshire</vCard:region> <vCard:pcode>P1 0NS</vCard:pcode> <vCard:country>UK</vCard:country> </vCard:adr> <vCard:email vCard:email.type="internet;pref;work">null@perston.co.uk </vCard:email> <vCard:org> <vCard:orgnam>Perston Technology</vCard:orgnam> </vCard:org> </vCard:vCard>


 

Listing 7이 Listing 6보다 길이는 길지만 가독성은 더 높다. 각 구성요소가 서로 연관되는 모습을 파악하고, 필요한 구체적인 정보를 찾아내기가 쉽다. 예를 들어, 상대적으로 꼭꼭 숨겨진 표준 vCard 출력을 담은 Listing 6보다 Listing 7에서 국가 정보를 찾아내기가 훨씬 쉽다.

또한 XPath나 SAX 이벤트를 사용하여 (연락처 분포를 파악할 목적으로) 국가 목록을 출력하는 등 정보를 검색하고 조작하기도 쉽다.





 

DocBook XML


문서를 한 번만 작성한 후 필요한 형식으로 다양하게 출력하는 기능은 많은 조직에서 오랫동안 바라던 것이다. DocBook XML이 바로 이런 목적에 쓰인다. DocBook XML을 사용하면 의미적 마크업(semantic markup)을 보존하면서 동시에 결과물에 대한 출력 형식도 제어할 수 있다.

의미적 마크업은 문서를 구성하는 장(chapter), 절(section), 단락(paragraph)을 지정한다. 단락에 들어가는 항목도 구체적으로 지정할 수 있다. 예를 들어, Listing 8에서 보듯이, 명령 이름과 함수 이름을 각자 정해진 태그로 감쌀 수 있다.


Listing 8. 명령과 함수를 각자 정해진 태그로 감싸기
<para>The <command>compile</command> takes the source code of the material and builds a new class based on the filename. For example, if the filename is <filename>HelloWorld</filename> then the name of the class generated will be <classname>HelloWorld</classname>.


 

문서를 출력할 때는 요소마다 다른 스타일과 형식을 지정해도 좋고 모든 요소에 같은 스타일과 형식을 지정해도 좋다. 좀 더 중요하게는, 의미적 정보를 다양한 방법으로 활용할 수 있다. 예를 들어, 문서에서 여러 클래스 이름을 사용한다면, 나중에 문서에서 사용하는 전체 클래스 이름 목록을 추출할 수 있다.

이러한 의미적 마크업 외에도 각 절이나 문단에 구체적인 ID를 부여한 후 문서 내 다른 곳에서 이런 ID를 사용해 링크를 생성해도 된다. 장이나 절 등 최종적으로 목차에 들어가는 구성요소는 자동으로 ID가 부여되고 링크가 생성된다. 이 외에는 작성자가 직접 ID를 부여한 후 링크를 생성하면 된다.


문서를 특정한 형식으로 변환하면, 링크는 자동으로 적절한 형식으로 변환된다. 예를 들어, 문서를 HTML로 변환하면, 링크는 다른 페이지나 페이지 내 특정 위치를 가리키는 HTML 링크가 된다. PDF를 생성할 때는 대상 절의 페이지 번호를 포함시킬 수 있다.


이런 변환은 XSLT 스타일시트가 처리한다. 표준 DocBook XSLT 스타일시트는 XML 문서를 표준 HTML, XHTML, PDF(FO 표준을 통해), Texinfo, 자바(Java™) 도움말, 매뉴얼 페이지 중 하나로 변환한다. 표준 스타일시트를 사용하면 출력 결과물에 대한 크기나 스타일을 책 형식에서 A4, 슬라이드까지 다양하게 지원한다.


이렇듯 다양한 출력 형식과 마크업을 지원하므로 문서 하나만 작성한 후 종이 매뉴얼, 소프트웨어 도움말, 매뉴얼 페이지, 문맥 감지 온라인 도움말 등 다양한 형식으로 변환할 수 있다. 전통적인 방식에서라면 모든 문서를 별도로 작성해야 할 것이다.


DocBook XML은 기술 문서 작성에 광범위하게 쓰인다. 현재 많은 회사가 DocBook XML 표준을 (혹은 DocBook에서 파생한 표준을) 이용하여 문서를 작성한다.





 

FIXML


FIXML은 B2B(Business-to-Business) 정보 교환 형식 중 하나로, 금융 기관이 정보를 교환할 때 사용한다. 구체적으로, 계좌 이체 정보에서 간단한 주식 가격과 무역 정보에 이르기까지 다양하고도 중요한 정보를 다룬다.


이런 금융 정보는 상대적으로 작은 패킷에서 종종 훨씬 큰 자료 블록에 이르기까지 다양한 크기로 전송된다. 예전에는 전통적인 형식인 간단한 키/값 쌍으로 이런 정보를 전송했으나, 이와 같은 방식에서는 교환하는 정보 크기가 효율적이지 못했다. 하지만 XML을 도입하면서 특히 복잡한 정보를 간단한 구조로 표현할 수 있게 되었다.


FIXML 표준 중에서도 최적화된 버전을 정보 교환 형식으로 채택한 이후로 자료 파일 크기는 크게 줄어들었고 파일 가독성은 크게 높아졌다. 주가 정보를 교환하는 파일 크기는 예전 형식보다 거의 1/4로 감소했다.


금융 기관을 제외하면 FIXML은 거의 쓰이지 않는다. 하지만 FIXML이 금융 정보를 효율적으로 전송함으로써 궁극적으로는 모두에게 이익이 돌아온다.





 

SVG


SVG(Scalable Vector Graphics)는 일러스트레이션을 기술하는 XML 표준이다. SVG를 사용하면 선, 형상, 형상의 위치와 관계를 기술할 수 있다. 가장 큰 장점은 이러한 정보를 (크기 조정이 가능한 도표, 고정된 그래픽 등) 원하는 형식으로 출력할 수 있다는 점이다.


SVG는 일러스트레이션을 생성하던 전통적인 방식을 크게 개선한다. 기존 방식은 몇 가지 심각한 문제가 있었다. 우선, 예전에는 특수한 일러스트레이션 프로그램을 사용했다. 따라서 다양한 프로그램이 일러스트레이션을 공유하기란 매우 어려웠다. 하지만 이제 파일을 SVG 형식으로 저장하면 SVG를 인식하는 프로그램 어디서나 파일을 인식해 작업할 수 있다.


또한 일러스터레이션을 문서에 (특히 웹 페이지에) 넣으려면 (JPEG, PNG 등과 같은) 비트맵 형식으로 변환해야 한다. 이런 전통적인 방식에는 몇 가지 문제가 있다. 첫째, 원래 일러스트레이션을 명시적으로 (흔히 수동으로) 비트맵 형식으로 변환해야 한다.


둘째, 비트맵 형식은 원본 그림을 픽셀로 표현하므로 출력 목표에 맞춰 이미지 크기와 해상도를 주의깊게 정해야 최종 이미지 품질이 떨어지지 않는다. 예를 들어, 일반 모니터용이라면 화면 해상도를 대다수 모니터 표준에 맞춰 72dpi 또는 96dpi로 잡아야 한다. 인쇄용으로는 300dpi에서 2400dpi 정도가 필요하다. 즉, 원본 일러스트레이션 크기에 비해 이미지 파일 크기가 상대적으로 매우 커진다.


PostScript와 Encapsulated PostScript가 나오기 전에도 벡터 그래픽 형식이 존재했지만, CPU를 많이 사용하는 탓에 화면 표현용으로는 부적합했다.


SVG는 여느 벡터 그래픽 형식처럼 픽셀 단위 표현이 아니라 형상 목록으로 이미지를 기술한다. 예를 들어, 직사각형은 상단 왼쪽 꼭지점을 지정한 후 높이와 너비를 지정한다. 이미지를 기술하는 파일 형식은 XML이다. 선, 직사각형, 다각형, 원 등을 기술하는 태그가 별도로 존재하여, 각 요소의 모양새와 다양한 구성 요소의 형식을 전적으로 제어할 수 있다.


Listing 9는 간단한 사각형, 투명한 원, 투명한 삼각형을 그리는 예제다.


Listing 9. 간단한 사각형, 투명한 원, 투명한 삼각형 그리기
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <polygon points="200,100 300,200 150,250" style="fill:#cccccc; stroke:#000000;stroke-width:1"/> <rect x="20" y="20" width="250" height="250" style="fill:blue;stroke:black;stroke-width:1; fill-opacity:0.1;stroke-opacity:0.9"/> <circle cx="100" cy="50" r="40" stroke="red" fill="red" style="fill-opacity:0.5"/> </svg>


 

그림 1은 Listing 9를 비트맵으로 표현한 이미지다.


그림 1. 비트맵으로 그린 버전


 

SVG 파일(Listing 1)은 이미지 묘사에 크기가 500바이트를 넘지 않지만, PNG 파일(그림 1)은 거의 9KB에 달한다.


SVG를 사용하면 일러스트레이션 크기가 작아지고, 사용이 편해지며, 광범위한 응용 프로그램과 호환이 가능해진다.





 

더블린 코어(Dublin Core)


더블린 코어는 대부분 도서관에서 많이 사용하는 정보를 분류하는 방법으로, 더블린 코어 표준과 연동하여 이러한 정보를 XML로 정의하는 XML 스키마가 존재한다. 더블린 코어 표준은 온갖 정보를 카탈로그로 만들어 효과적으로 조회하고 갱신하고 사용하려는 경우에 유용하다.


현재 정보 정의와 설명 분야에서 더블린 코어는 시맨틱 웹(Semantic Web)을 현실화하는 데 기여하고 있다. 정보를 기술하는 표준을 제공함으로써, 더욱 중요하게는 체계적으로 검증된 해결책을 제시함으로써, XML 문서로 정보를 상세히 기술하며 다양한 자원 사이에 정보를 효과적으로 교환하고 비교할 수 있다.


더블린 코어 명세는 자체 스키마가 존재한다. 하지만 더블린 코어 스키마는 다른 XML 문서에 포함될 목적으로 설계되었다. 더블린 코어 스키마를 다른 문서에서 사용할 때는 XML 이름 공간을 지정하여 DC 엘리먼트를 정의한다. 예를 들어, Listing 10은 RDF XML 스키마 내에서 RDF 엔티티 내용을 기술하는 DC 분류 시스템이다. Listing 10에서는 RDF 엔티티로 웹 사이트를 기술한다. 아래 예제는 앞서 RDF 스키마 에서 보았던 예제를 확장한다.



Listing 10. RDF XML 스키마 내에서 RDF 엔티티 내용을 기술하는 DC 분류 시스템
<?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rss:channel rdf:about="http://www.xml.com/xml/news.rss"> <rss:title>MCSLP</rss:title> <rss:link>http://mcslp.com/rss </rss:link> <dc:description> MCSLP features information, projects and articles from members of the MCSLP team. </dc:description> <dc:subject>MCSLP, Grids, XML, Databases, Programming </dc:subject> <dc:identifier>http://www.mcslp.com</dc:identifier> <dc:publisher>MCSLP</dc:publisher> <dc:rights>Copyright 2008, MCSLP</dc:rights> </rdf:RDF>


 

Listing 10 에서 DC 엘리먼트를 사용하여 설명(Description), 주제(Subject), 발행처(Publisher), 이용조건(Rights), 식별자(identifier) 정보를 추가했다. 이런 정보를 이용하면 RSS 피드 내용을 분류하기가 쉬워진다.


더블린 코어 메타데이터 엘리먼트 집합은 메타데이터 엘리먼트 15개로 이뤄진다(옮긴이 주: 메타데이터 엘리먼트 한글 용어는 한국 더블린 코어 메타데이터 를 참조했다).

  1. 제목(Title)
  2. 제작자(Creator)
  3. 주제(Subject)
  4. 설명(Description)
  5. 발행처(Publisher)
  6. 기타 제작자(Contributor)
  7. 날짜(Date)
  8. 자료 유형(Type)
  9. 형식(Format)
  10. 식별자(Identifier)
  11. 출처(Source)
  12. 언어(Language)
  13. 관련자료(Relation)
  14. 내용범위(Coverage)
  15. 이용조건(Rights)

이상 15개 엘리먼트를 사용하면 매우 다양한 정보를 기술할 수 있다.





 

XForms


XForms XML 표준을 사용하면 (필드, 라디오 버튼, 리스트 같은 입력 유형 등) 다양한 폼 구성요소를 정의할 수 있다. 또한 사용자가 폼에 입력한 정보를 검증할 수도 있다.

XForms XML 표준은 많은 개발자에게 이미 익숙한 HTML 폼이나 XHTML 폼과 매우 비슷하며, XHTML 2.0 표준에서는 XForms를 지원할 예정이다.


XForms XML은 간단한 MVC(Model, View, Controller) 형식에 기반을 둔다. 여기서 모델(Model)은 폼을 전반적으로 기술하며 여기에는 필드, 입력 조건, 자료 제출 모드 등이 포함된다. 뷰(View)는 폼에 표시되는 컨트롤, 컨트롤 그룹, 컨트롤이 제어하는 필드를 정의한다. 폼에서 개별 컨트롤 형식과 외양은 CSS에서 제어한다.


XForms 표준은 기존 HTML 폼 정의를 확장하여 폼에 입력되는 정보를 좀 더 상세하게 분류한다. 폼을 채우는 과정에서 (보통 자바스크립트나 Ajax를 사용할 때만 지원되는) 동적 요소를 사용할 수도 있다.

Listing 11에서 간단한 텍스트 입력 창과 팝업 선택 상자 예를 볼 수 있다.


Listing 11. 간단한 텍스트 입력 창과 팝업 선택 상자
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xforms="http://www.w3.org/2002/xforms"> <head> <title>XForms Sample</title> <xforms:model> <xforms:instance> <Name xmlns=""> <FName /> <LName /> <Title /> </Name> </xforms:instance> </xforms:model> </head> <body> <xforms:select1 ref="Title"> <xforms:label>Title:</xforms:label> <xforms:item> <xforms:label>Mr</xforms:label> <xforms:value>Mr</xforms:value> </xforms:item> <xforms:item> <xforms:label>Mrs</xforms:label> <xforms:value>Mrs</xforms:value> </xforms:item> </xforms:select1> <xforms:input ref="FName"> <xforms:label>First name: </xforms:label> </xforms:input> <xforms:input ref="LName"> <xforms:label>Last name: </xforms:label> </xforms:input> <hr /> <xforms:output value="concat('Hello ',Title,' ',FName,' ',LName)"> <xforms:label>Output: </xforms:label> </xforms:output> </body> </html>


 


파이어폭스 XForms 확장 기능을 사용하면 HTML에서 XForms 폼을 볼 수 있다. 예제는 그림 2를 참고한다.


그림 2. 파이어폭스 XForms 확장 기능을 사용하여 HTML에서 XForms 폼 보기


 




고객 송장(Customer Invoice)


많은 비즈니스 프로세스에서 고질적인 문제 중 하나가 기존에 종이로 관리하던 고객 송장을 컴퓨터로 옮기는 작업이다. 송장 구조를 생성할 때는 다양한 유형과 반복적인 요소를 주의 깊게 고려해야 사용하기 쉬운 구조가 나온다.



과거에는 아주 큰 구조를 정의하여 송장과 같은 비즈니스 정보를 교환했다. 송장 정보를 교환하는 국제 표준은 수백 가지에 달하는 필드를 정의한다. 따라서 정보를 교환하는 좀 더 효과적인 방법이 없다면 송장, 주문 같은 비즈니스 정보를 공유하기가 어려워진다.

전세계적으로 통일된 표준이 없는 탓에 많은 조직이 나름대로 핵심 송장 표준을 개발해 내놓았다. 이 중에서 가장 널리 알려진 표준은 OASIS 그룹이 개발한 표준으로, 많은 회사와 조직이 이 표준을 채택했다.


OASIS가 개발한 프레임워크 중 일부가 UBL(Universal Business Logic)이라는 구조다. 이 구조는 주문 처리에서 송장과 결제에 이르기까지 모든 스키마와 워크플로를 제공한다. 시스템 자체는 너무 복잡하여 이 기사 범위를 벗어나므로 여기서는 자세히 설명하지 않는다. 하지만 확장성과 상호운용성이 있는 시스템을 찾는다면 UBL을 살펴보라고 권한다.





 

요약


이 기사에서는 간단한 기술 프레임워크인 RDF, 그래픽 형식인 SGV, 비즈니스 워크플로를 지원하는 구조인 UBL에 이르기까지 다양한 XML 스키마를 살펴보았다. 각 XML 스키마를 소개하면서 XML 표준을 사용하면 구조와 내용의 유연성 때문에 해당 분야의 시스템 개발이 쉬워진다는 사실을 확인했다. 또한 XML이 제공하는 교차 플랫폼 호환성은 다양한 플랫폼과 환경에서 정보를 교환하기에 적합하다는 사실도 확인했다. 특히 WSDL과 SOAP에서는 이 교차 플랫폼 호환성이 가장 중요한 장점으로 꼽힌다.




필자소개

Martin Brown

Martin Brown은 8년 넘게 기술 필자로 활약해왔다. Brown은 다양한 주제를 다루는 수 많은 책을 집필했고 기사를 작성했다. Brown은 펄, 파이썬, 자바(Java™), 자바스크립트, 베이직, 파스칼, 모듈라-2, C, C++, 레볼, gawk, 셸 스크립트, 윈도우(Windows??), 솔라리스, 리눅스, BeOS, 맥 OS X을 비롯하여 웹 프로그래밍, 시스템 관리, 통합에 이르리까지 다양한 개발 언어와 플랫폼을 경험했다. Brown은 마이크로소프트(Microsoft??) SME(Subject Matter Expert)이며 ServerWatch.com, LinuxToday.com, IBM developerWorks에 주기적으로 기고한다. Brown은 또한 컴퓨터월드, 애플 블로그, 기타 사이트에 주기적으로 블로그 기사를 올린다. 연락 주소는 Brown이 운영하는 웹 사이트 를 참조하기 바란다


 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

에딘버러 여행 - 로얄마일
+   [Personal Profile/Travel]   |  2008.10.06 15:57  
로얄마일은 에딘버러성의 연결되는 에딘버러의 왕족과 귀족들이 다녔던 대로(?) 이다. 로얄마일은 그 옛날에 돌길의 형태가 그대로 보존되어 있다.

지금은 길 주변으로 식당과 기념품 판매하는 곳 그리고 작은 박물관들이 자리 잡고 있다.

사용자 삽입 이미지


사용자 삽입 이미지
길가의 기념품 가계에서 전시용으로 내다놓은 큰 대형 인디안 인형


사용자 삽입 이미지
길의 시작 부분에는 로얄마일 이라는 길 이름이 적힌 이정표를 볼 수 있다.
 
사용자 삽입 이미지

사용자 삽입 이미지

길 중간에 볼 수 있는 시계 탑 - 기억에는 지금도 시간을 정확하게 안내하고 있다.

사용자 삽입 이미지
기념품 가계의 대형 인형 - 스코드랜드는 전쟁이 잦았더 지역이였다. 그래서 이렇게 갑옷을 입거나 칼고 방패를 들고 있는 인형을 자주 볼 수 있다.

사용자 삽입 이미지



사용자 삽입 이미지
로얄마일은 귀족과 왕족이 다녔던 길이라 그렇지 않은 평민들은 높은신 분이 지나갈때 마다 자리에 멈춰서서 고개를 숙여야 했으니, 이를 피하기 위해 뒷길(?)이 많이 발달했다. 로얄마일 곳곳에 이런 뒷길과 연결되는 통로를 볼 수 있다.


사용자 삽입 이미지
점심 식사를 하고 잠시 기다라면서 한장 - 넓지 않는 식당이였는데 나름 스코틀랜드 느낌이 나는 음식을 먹어 볼 수 있었다.


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

한시간 정조 로얄마일을 거쳐 에딘버러 성에 올라 가면서 이렇게 기념품 가게에서 사진찍고 식사하고 즐거운 시간을...

'Personal Profile > Travel' 카테고리의 다른 글

파리 그리고 상제리제 거리 - 애펠탑 야경  (0) 2009.06.19
에딘버러 여행 - 로얄마일  (0) 2008.10.06

 
 
     
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

Resume - Software Programmer
+   [Personal Profile/Profile]   |  2008.10.06 15:10  

CV[Sangchual_CHA].pdf

CV (Sangchual CHA)



Letter

Since 1999, After I finsh MSc degree in Hongik Univ.,I have participated package projects and SI projects nearly 10 years. 

Mainly I have worked in R&D center to develop IR(Information Retrieval) system, Image processing library and EDMS (Electronic Document Management System) server with C++ Builder, Visual C++ and Java usually. I closed successfully network based projets and have excellent knowledge about HTTP, POP3, SMTP, IMAP implemenation. I've got strong programming experience to write high performace and effective C++ and java code. High performance and stability are one of major requirement for acceptance or Image processing library and EDMS server.

And I have been invloved SI projects in the area of financial in the main for years. These projecs are generally large scaled and make project members keep the standard and guide lines. It makes me get familiar with methodology likes OOD, CBD. VB, JSP and ASP have been adopted as a main programing languages so I am quite good at these tools. I get accustomed to program languages (Visual C++ and Borland C++ Builder, VB, Java, JSP and some scripts languages), DB (Oracle, MS SQL Server) and WAS (Apache, Tomcat, Jeus, Web Logic, Web Sphere).

I am really good at team working and face-to-face client communication. I have worked as one of project leaders in project.

In 2005 I took the English course in the UK for one year.After returning from the UK I involved overseas IT projects need communication skills in English and I amd working at Overseas Business Division for technical support in English.
English wouldn't be a obstacle in IT project any more for me.


---------------------------------------------------------------------------------------
1. Daesang Information & Technology Co., Ltd.
---------------------------------------------------------------------------------------

1.1 Daesang Trade Co., Ltd. ERP
(1) Jan. 1996 ~ Feb. 1997
(2) Platform & Environment
  - HP-UX
  - Informix
  - Visual Basi
  - SQL & ESQL-C
(3) Remarks
  - SI Project
  - Design large scale DB
  - BPR, ERP System
  - ERD Design support and develop application


---------------------------------------------------------------------------------------
2. Dream To Reality Co., Ltd. & K2G Corporation
---------------------------------------------------------------------------------------
2.1 Internet Information Extraction System
(1) Sep. 1999 ~ Jul. 2000
(2) Platform & Environment
  - MS Windows 2000 Server, IIS,
  - MS SQL Server
  - HTML, ASP
  - Borland C++ Builder
(3) Remarks
  - S/W Package Project
  - Click Price (http://www.clickprice.co.kr)
  - HTML Spider Implementation
  - Semi-formatted HTML document analyzer
  - Natural Language Process


2.2 WDS(TjiohjthiM) (Wireless Document System)
(1) Sep. 2000 ~ Oct. 2001
(2) Platform & Environment
  - Linux
  - Apache, Tomcat
  - Java, JSP, Servlet
  - mHTML, WML, HDML, HTML
(3) Remarks
  - S/W Package Project
  - IMAP based Mobile Mail Gateway
  - IMAP, POP3, SMTP Implementation
  - SK Net’s go (http://www.netsgo.co.kr)
  - Dreamwiz (http://www.dreamwiz.co.kr)

2.3 DPA(TM) (Document Processing Automation)
(1) Nov. 2001 ~ Nov. 2007
(2) Platform & Environment
  - Visual C++
  - Visual Basic, Borland C++ Builder
(3) Remarks
  - S/W Package Project
  - Scan (TWAIN)
  - IP (Image Processing) & Vision
  - Image Viewer
  - OCR / 1D, 2D BCR

2.4 EDM (Electronic Document Management) SI Projects
(1) Nov. 2001 ~ Nov. 2007
(2) Platform & Environment
  - Windows NT Server / HP-UX / Solaris
  - MS SQL Server, Oracle
  - IIS, Jeus, WebSphere
  - Visual C+
  - Visual Basic
  - ASP / JSP
(3) Remarks
  - SI Project
  - Paper Scanning and Document upload
  - Document Search and View
  - Work Flow / BPM / Legacy Integration
  - Chohung Bank, Shinhan Bank, SC First Bank, Korea Exchange Bank, Hana Bank
  - Meritz Insurance / Samsung Insurance
  - LG Electronics

2.5 Doxtore(TM)
(1) Sep. 2004 ~ Mar. 2005
(2) Platform & Environment
  - EDMS Server
  : Java / Borland J Builder
  : My SQL
  - EDMS Client
  : Java Beans / Borland J Builder
  : Visual C++
  - EDMS Administrator
  : Apache, Tomcat
  : JSP / HTML
(3) Remarks
  - EDMS S/W Package
  - Load balance with the multiple threads.
  - Supports multiple and hierarchical storage
  - Data Encryption
  - Access control
  - Versioning / Check-In /Check-Out
  - Backup and recovery
  - Supports Unicode
  - XML based protocol

2.6 Oversea Projects
(1) Jan. 2008 ~ May 2008
(2) Platform & Environment
  - DPATM and DoxtoreTM
  - DFS (DFS : Document Flow System)
(3) Remarks
  - S/W Package delivery and technical support
  - Labor Dept. In South Africa
  - Bank of AYUDHYA in Thai
  - Land And House Bank in Thai
  - Uzbekistan FS for the national e-document archiving system


---------------------------------------------------------------------------------------
3. KB Data System Co., Ltd.
---------------------------------------------------------------------------------------
3.1 Internet Banking System
(1) Jan. 2008 ~ May 2008
(2) Platform & Environment
  - Weblogic 9
  - Oracle 10g
  - Eclipse
  - IBM RSA
(3) Remarks
  - SI Project
  - KB Data System Co., Ltd
  - Design the architecture for the message exchange between internet banking system and legacy


---------------------------------------------------------------------------------------
4. TOBESOFT Co., Ltd.
---------------------------------------------------------------------------------------
4.1 Overseas Business Division
(1) Jun. 2008 ~
(2) Platform & Environment
  - MiPlatform(TM)
(3) Remarks
  - Technical support for RIA system
  - Pre-Sales and marketing support



* Technique

---------------------------------------------------------------------------------------
1. Languages
---------------------------------------------------------------------------------------
[Application] C, C++, Visual Basic, Java
[DB] SQL, T-SQL, ESQL-C
[Web] Java Script, ASP, JSP, HTML
[Mobile] mHTML, WML, HDML

---------------------------------------------------------------------------------------
2. Compilers / IDE
---------------------------------------------------------------------------------------
[C, C++] Visual C++, Borland C++ Builder, gcc
[VB] Visual Basic
[Java] J Builder, Eclipse
[Web/Mobile] MS InterDev, Micromedia Dreamweaver

---------------------------------------------------------------------------------------
3. O/S
---------------------------------------------------------------------------------------
[MS Windows] MS Windows 2000, MS Windows XP
[UNIX] HP UX, Solaris
[Linux] Linux

---------------------------------------------------------------------------------------
4. Database
---------------------------------------------------------------------------------------
MS SQL Server
Oracle (9i, 10g)
My SQL
Informix

---------------------------------------------------------------------------------------
5. Application Server
---------------------------------------------------------------------------------------
MS IIS
Apache, Tomcat
WebLogic

---------------------------------------------------------------------------------------
6. 3rd Party Lib.
---------------------------------------------------------------------------------------
Spread 6.0
Crystal Report 10
Leadtools 12 Raster Imaging Toolkit

---------------------------------------------------------------------------------------
7. Network
---------------------------------------------------------------------------------------
TCP/IP Client & Server Socket Programming
HTTP / POP / SMTP / IMAP / FTP
WAP

---------------------------------------------------------------------------------------
8. S/W Design
---------------------------------------------------------------------------------------
Object Oriented Design
3tier Client Server Architecture
Design Patterns, Refactoring

---------------------------------------------------------------------------------------
9. S/W Architecture
---------------------------------------------------------------------------------------
OOP / CBD / RUP
RSA (Rational Software Architecture)


* Education

---------------------------------------------------------------------------------------
1. Education
---------------------------------------------------------------------------------------
- MSc in Computer Science (Mar. 1997 ~ Feb. 1999)
Hongik University Graduate School
http://www.hongik.ac.kr/english_neo/Major: 1. Machine Learning, Expert System / 2. Information Retrieval

- BSc in Computer (Science Mar. 1990 ~ Feb.  1996)
King Sejong Univ.
http://www.sejong.ac.kr/eng/04res/04res_01.html

---------------------------------------------------------------------------------------
2. English Schools
---------------------------------------------------------------------------------------
- St. Giles in Brighton(Apr. 2005 ~ Sept. 2005)
General English / Advanced 1 Level

- Sussex Uni. Language Institute(Oct. 2005 ~ Dec. 2005)
Pre-Masters English

- Brighton Vandean College (Jan. 2006 ~ Mar. 2006)
Adult Community Course

- IELTS 6.0


---------------------------------------------------------------------------------------
3. Technique Education
---------------------------------------------------------------------------------------

- SQL(Mar. 1996)
Informix Korea Education Centre

- SPL & Trigger(Mar. 1996)
Informix Korea Education Centre

- TCP/IP Network Design(Jun. 1996)
HP Korea Education Centre

- Design Patterns(Jan. 2003)
DAU Education Centre

- Online MBA(Dec. 2006 ~ Apr. 2007)
EBS-MS MBA

- S/W Engineering(Mar. 2008)
SUN Learning Center


 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

Android #2 - Hello World
+   [Programming/안드로이드 (Android)]   |  2008.09.26 17:33  

 

1. HelloWorld

 

File -> New -> Project 를 선택하면 개발가능 한 프로젝트 목록에 Android가 포함되어 있음을 확인 할 수 있다.

 

사용자 삽입 이미지

 

Android Project 를 선택하고 Next 버튼을 클릭한다.

 

사용자 삽입 이미지
 


Project name / Package name / Active name / Application name
을 입력하고 Finish 버튼을 클릭하도록 합니다. 각각의 항목에 대해서는 아래를 참조하기 바랍니다.

 

Project Name

This is the name of the directory or folder on your computer that you want to contain the project.

Package Name

This is the package namespace (following the same rules as for packages in the Java programming language) that you want all your source code to reside under. This also sets the package name under which the stub Activity will be generated.

The package name you use in your application must be unique across all packages installed on the system; for this reason, it's very important to use a standard domain-style package for your applications. In the example above, we used the package domain "com.android"; you should use a different one appropriate to your organization.

Activity Name

This is the name for the class stub that will be generated by the plugin. This will be a subclass of Android's Activity class. An Activity is simply a class that can run and do work. It can create a UI if it chooses, but it doesn't need to.

Application Name

This is the human-readable title for your application.

 

 

Finish Button을 클릭하면 오류가 화면에 표시된다. 일단은 무시 합니다.

사용자 삽입 이미지
 

 

Package Explorer 창 탭에서 src -> EstherHelloWorld.java를 선택하면 기본으로 생성되어 있는 코드를 확인 할 수 있다.

 

package esther.android.helloworld;

 

import android.app.Activity;

import android.os.Bundle;

 

public class EstherHelloWorld extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

}

 

이제 이 이 코드를 조금 수정하여 Hello World를 표시해 보도록 하겠습니다.

 

package com.android.hello;

 

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

 

public class HelloAndroid extends Activity {

   /** Called when the activity is first created. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       TextView tv = new TextView(this);

       tv.setText("Hello, Android");

       setContentView(tv);

   }

}

 

화면에 문자를 표시하기 위해서는 TextView Widget을 사용하도록 합니다. 우선 TextView Widget import 합니다.

 

import android.widget.TextView;

 

그럼면 이제 TextView Widget를 생성하고 HelloWorld를 표시하도록 합니다.

 

Android에서 User Interface Views 클래스를 상속받은 컴포넌트들로 구성되어 있다. Views 클래스는 간단한 화면 표시를 위한 객체들이다. 예를 들면 라디오 버튼, 애니메이션 그리고 텍스트라벨 등이 여기에 해당된다

 

TextView WidgetAndroid Context 클래스 인스턴스를 인자로 하여 생성된다. Context 클래스는 사용가능 한 시스템 리소스를 확인하고, 데이터베이스를 접근을 관리하며, 시스템 환경 정보와 같이 시스템과 관련된 기본적인 관리를 수행한다. Activity 클래스는 Context 클래스를 상속받고 있으며 우리가 작성하고 있는 클래스는 Activity 클래스의 하위 클래스이고 동시에 Context 클래스의 하위클래스 이다.

 

TextView tv = new TextView(this) ;

 

TextView WidgetLabel 컴퍼넌트라고 할 수 있으며, 원하는 문자열을 화면에 표시하구 이해서는 setText 메소드를 호출한다.

 

tv.setText("Hello World ") ;

 

기존에 프로그래밍 경험이 있은 개발자는 이해하는데 그리 어렵지 않을 것 입니다.

 

Activity 클래스의 setContentView() 메소드는 UI와 연관되어 있는 View 클래스 (View 클래스를 상속 받은 하위 클래스)를 시스템에 알려주는 역할을 수행한다. 우리는 “Hello World !!” Text를 표시하는 것이므로 UI를 구성하는 컴퍼넌트가 TextView 임을 알려주도록 한다.

 

setContentView(tv);

 

다음 단계는 실해하는 것이다.

 

우선 Run -> Run Configurations를 선택합니다. 그러면 실행환경을 설정하기 위한 대화상자가 표시됩니다.

 

사용자 삽입 이미지


대화상자에서 Android Application 노드를 선택하고 New 아이콘을 선택하여 새로운 실행환경을 설정하도록 합니다.

 

사용자 삽입 이미지

 

Configuration Name HelloWorld로 설정합니다. Browser 버튼을 클릭하여 Project를 선택하고 Launch Action 클래스, 즉 메인 클래스를 선택합니다. Run 버튼을 클릭하여 프로그램을 실행 시키거나 이클립스 툴바에서 HelloWorld 실행환경을 선택하여 응용프로그램을 실행하도록 합니다.

 

이클립스 에서 실행환경에 추가된 것을 확인 할 수 있습니다.

사용자 삽입 이미지
 

 

실행을 하면 Android 에뮬레이터가 동작합니다. 핸드폰을 구동화면이 아래와 같이 표시됩니다.

 

사용자 삽입 이미지

 

 

 

사용자 삽입 이미지

 

HelloWorld가 표시된 것을 확인 하실 수 있습니다.


사용자 삽입 이미지
 


테스트 과정에서 대기화면에 표시되기도 하는데, 이때 에뮬레이터의 Menu 버튼을 클릭하면 다음화면으로 진행이 된다.

 

사용자 삽입 이미지

'Programming > 안드로이드 (Android)' 카테고리의 다른 글

Android #2 - Hello World  (0) 2008.09.26
Android #1 - Install  (0) 2008.09.26

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

Android #1 - Install
+   [Programming/안드로이드 (Android)]   |  2008.09.26 17:26  

사용자 삽입 이미지


STEP BY STEP

 

 

 1. Install

 

안드로이드 설치를 위해서는 Android SDK 1.0 이 기본적으로 필요하며, 통합개발환경 (Eclipse 혹은 NetBeans), SDK 가 필요하다.

 

1.1 Android SDK 1.0 다운로드

Android 홈페이지(http://code.google.com/android/index.html)에서 ‘Download The SDK’ 링크를 통하여 다운 받을 수 있다. 그리고 SDK 다운로드 페이지에서 직접 접속하여 다운받을 수 도 있다. (http://code.google.com/android/download.html)

 

제공되는 SDK Windows / Max OS X / Linux 환경을 지원하니 환경에 적합한 파일을 다운 받도록 합니다.  본 강좌에서는 Windows 버전을 기준으로 진행하도록 합니다.

 

SDK 파일(android-sdk-windows-1.0_r1.zip )을 다운로드 한 후에 현재 폴더에 압축을 해제하면 하위에 docs, samples, tools 폴더를 확인 할 수 있다. 내 컴퓨터->속성->환경변수-시스템변수 항목에 [Android SDK 설치폴더]/tools 경로를 추가하도록 합니다.

 

1.2 개발환경 다운로드

Android 응용프로그램 개발을 위한 환경 구축을 위해 필요한 플러그인 설치 및 환경 설정 방법에 대해서는 http://code.google.com/android/intro/installing.html#installingplugin 에 자세하게 설명되어 있다. Google에서 공식적으로 지원하는 개발환경은 이클립스이나 Sun에서 제공되는 Java 개발 통합환경인 NetBeans Android 개발환경을 지원한다. Netbeans환경에서의 Android개발에 대한 자세한 설명은 http://wiki.netbeans.org/IntroAndroidDevNetBeans 을 참조하기바랍니다. 본 강좌에서는 이클립스를 기준으로 진행하도록 합니다.

 

이클립스 홈페이지에 접속하여 “eclipse-SDK-3.4.1-win32.zip”를 다운받도록 한다 Download가능한 여러 버전이 나열되어 있는데, 이중에서 Eclipse Classic 3.4.1 (151 MB) 를 다운받도록 합니다. 그리고 적당한 폴더에 압축을 풀어주면 됩니다.

 

1.4 JDK 다운로드

Sun에서 제공되는 Java SDKhttp://java.sun.com/javase/downloads/index.jsp 에 접속하여 다운받도록 합니다. 나열되어 있는 목록에서 JDKSE6 Update 7 (jdk-6u7-windows-i586-p.exe)을 선택하여 다운로드 합니다. JDK5 / JDK6 가 이미 설치되어 있는 경우는 별도의 다운로드 없이 기존에 설치된 환경을 이용하도록 합니다.

 

1.5 Plugin 다운로드

개발을 위해서는 별도의 플러그인이 필요한데 첫번째는 JDT – Eclipse Java Development Tools (http://www.eclipse.org/jdt/)이며 두번째는 WST-Web Tools Platform (http://www.eclipse.org/webtools/) 입니다.

 

2. 환경 설정

 

설치된 Eclipse를 실행하고, 아래와 같이 Help->Software Update를 실행하도록 합니다.

 

사용자 삽입 이미지

 

그러면 Eclipse Plugin Update하기 위한 대화상자가 표시됩니다. Available Soft 탭의 Add Site 버튼을 클릭하면 Site URL을 입력하는 대화상자가 표시 됩니다.


사용자 삽입 이미지

 

표시된 대화상자에 https://dl-ssl.google.com/android/eclipse/ 입력하고 OK 버튼을 클릭합니다.

 

 

사용자 삽입 이미지

 

추가된 Update 가능 목록에서 Developer Tools를 클릭하여 선택하고 Install 버튼을 클릭하도록 합니다.

 

사용자 삽입 이미지
 


Android
개발도구 업데이트를 위해 필요한 파일들을 사이트에서 다운로드 한 후에 설치진행 대화상자가 표시됩니다.

 

사용자 삽입 이미지

 

Next 버튼을 클릭하고 License Agreement Accept 한 후에 Finish 버튼을 클릭하면 설치가 진행 됩니다.

 

사용자 삽입 이미지

 

변경내용을 시스템에 적용하는 진행상태를 나타내는 대화상자가 표시됩니다.

 

사용자 삽입 이미지

설치과정이 진행 완료되면 변경 내용을 반영하기 위해 이클립스를 재시작 할 것을 요청하는 대화상자가 표시됩니다. Yes 버튼 클릭하여 이클립스를 재 시작하도록 하겠습니다.

 

 

사용자 삽입 이미지

 

이클립스를 재 시작하면 Windows->Preference를 선택하면 대화상자에 Android 메뉴가 추가되어 있는 것을 볼 수 있다. Android 노트를 클릭하면 아래와 같은 대화상자가 표시되고 Proceed 버튼을 선택하면 환경 설정 과정을 진행 할 수 있다.

 

 

사용자 삽입 이미지


우선 SDK Location 을 설정하도록 합니다. 압축을 해제한 폴더를 선택하고 OK 버튼을 클릭하고 Apply / OK 버튼을 클릭하면 설정이 Android 응용프로그램 개발을 위한 환경 설정이 모두 마무리 되었습니다.

 

사용자 삽입 이미지

'Programming > 안드로이드 (Android)' 카테고리의 다른 글

Android #2 - Hello World  (0) 2008.09.26
Android #1 - Install  (0) 2008.09.26

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

IT투자결정과 성과관리를 위한 IT Portfolio와 IT ROI
+   [Strategy Planning & Marketing]   |  2008.09.16 11:30  
IT 기획을 하는데 있어 ROI 가 가장 중요한 지표가 되면서 또 가장 어려운 부분이 된다.

투입과 결과가 명확하게 시간과 금액으로 드러나는 경우에 대해서는 IT 투자 효과를 정량적으로 측정하는 것이 용이하다. IT 투자 이전과 이후를 대비하여 업무 처리 시간이 단축된 경우, 소요 인력이 줄어 든 경우는 이러한 측정이 어렵지 않으나 이러한 경우는 IT 인프라를 신규를 구축하는 경우에 한정되는 경우가 많으며 특히, 기 투자된 IT 환경을 개선하는 경우 이러한 정량적 데이터를 추출하기가 용이하지 않다.

이러한 경우 IT 기획자가 시스템 도입 필요성에 대해서는 체감하지만 예산, 기간, 현업의 참여 등을 적절하게 산정하기 어려움을 느끼게 되며, 시스템 도입이 결정되고 구축이 진행되더라도 결과적으로는 시스템 개발사가 피해를 입게 된다.

따라서 IT 개발가 신규 제품을 출시하고 기 출시된 제품을 업그레이드 하면서 동시에 적절한 ROI 평가도구와 방법을 제시하는 것이 제품의 완성도와 더불어 중요한 성공 요소가 될 것이다.
 
그러나 국내의 IT 개발사에서는 제품과 기술개발이 아닌 마케팅 및 전략 기획에 예산을 할당 할 만큼 여유가 없다. 사실 좀더 꼬집어 본다면, 만연된 기술우선주의를 가진 CEO가 이러한 부분에 비용을 쏟아 붓는 것을 아까워하기 때문이다. 개인적으로 한때 이러한 생각을 가진 중소 S/W 기업의 임원이였던 만큼 자신에 대한 비판이기도 하다.

사실, 이러한 부분에 대해 필요성을 느껴서 이를 현실화 시키고 구체화 시키려고 할 때 가슴한구석이 답답해 지고, 게다가 담당 직원을 앉혀 놓고 이에 대해 썰(~)을 풀어 보기도 하지만 막상 쓸만한 대안을 얻기도 쉽지 않다. 또 컨설팅 회사를 찾아 의뢰하고 싶은 생각도 있지만 그들이 제시하는 비용에 대해서도 투자대비 측면에서 눈탱이 맞을 것 같은 막연한 피해 의식(~)으로 실행에 이르지 못하는 경우가 허다 하다. 결국은 또 한번의 해프닝으로 - 필요하기는 하지만 지금은 적절한 시기가 아닌 것 같다. - 으로 막을 내리게 된다.

제품의 강점과 약점을 잘 아는 것은 제품을 만든 놈이며 또 시장과 경쟁사에 대해 정보를 가지고 있는 놈도 물건을 파는 놈이니 결국에는 스스로 해결하는 것이 최적의 해를 구하게 되지 않을까 싶다. 지속적으로 이러한 부분에 관심을 가지고 꾸준히 공부해 나간다면 전문 컨설턴트의 그것은 아니라고 하더라고 그래도 쓸만한 자료를 생산해 낼 수 있을 것이다.

아래는 ROI 도출을 위해 필요한 방법론과 도구입니다. 

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

Click Price 제안서
+   [Projects/Information Extraction]   |  2008.09.16 10:13  

ClickPrice에서 쇼핑몰의 광고 수주를 위해 작성되었던 제안서 입니다.

당시 ClickPrice의 서비스를 훝어 보는데 충분한 자료 입니다.

CSP 제안서(종합).ppt

클릭프라이스 제안서

'Projects > Information Extraction' 카테고리의 다른 글

Click Price 제안서  (0) 2008.09.16
What is Information Extraction ?  (0) 2008.09.16

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

 

What is Information Extraction ?
+   [Projects/Information Extraction]   |  2008.09.16 10:09  
정보 추출 ?

정보 추출은 검색 대상 문서에서 특정 정보를 필터링여 데이터베이스를 구축하거나 이를 서비스하는 것이다.

정보검색은 사용자의 질의어에 가장 적합한 문서를 찾아주는 것이라면 정보 추출의 한단계 더 깊은 분석을 통하여 문서의 특정 정보가 사용자 질의어에 매칭되는 문서 및 추출된 정보를 서비스하게 된다.

예를 들어 온라인 상품 가격 비교서비스의 경우, 정보추출 시스템을 기반으로 온라인 쇼핑몰에서 제공되는 상품정보 페이지에 표시된 상품명, 가격, 배송비 정보를 획득하고 이에 대한 DB를 구축하하게 된다.

이러한 시스템을 구축하기 위해서는 Web Spider, Semi-Formatted 문서 분석기가 필요하다. 문서 분석기의 경우 각 웹 페이지의 형태 별로 각각의 특징정보를 정의하여야 하기 때문에  통상 문서형태 그룹 개수 만큼의 형태정의가 필요하게 된다. 따라서 효과적으로 문서형태를 정의하는 환경이 필요하게 된다.

2000년도 자연어 기반의 온라인쇼핑몰 가격비교 사이트 ClickPrice (http://www.clickprice.co.kr)가 시대를 풍미한 적이 있었다. 애석하게도 회사내부 사정에 의해 현재를 서비스를 중지하고 있지만, 당시 쇼핑목 가격 비교 서비스 중에서는 가장 효과적으로 운영되고 있었다. 당시 가격비교 사이트는 DB 구축을 위하여 통상적인 검색엔진을 사용하고 있어, 웹페이지에 포함되어 있는  특정 정보는 수십명의 아르바이트가 투인된 노가다(?) 작업에 기반하여 추출되고 있었다. 그러나 ClickPrice는 정보추출 엔진을 적용하여 10여대의 PC와 관리자가 이를 대신하고 있었으니 얼마나 혁신적인가 ?

당시 클릭프라이스의 웹 스파이더, 비정형 문서 분석 및 정보 추출 엔진, 자연어 기반의 검색 엔진은 한명의 슈퍼 엔지니어에 의해 개발되었으니, 그 사람이 바로 나.. 차상철 이다. ㅋㅋㅋ

얼마전, 검색기술세미나에 참석했었는데 정보추출을 Topic로 한 세션이 있었다. 정보추출 기술이 적용하기에 따라서는 상당히 유용할 수 있으며, 정보검색과 결합되면 시너지를 발휘 할 수 있겠다는 생각이 들었다. 꽤 오랜시간이 지났지만 국내 최초의 상용화된 서비스를 제공했던 정보 추출 엔진 - 본인이 주장하는 것이라.. - 에 대한 실체와 기반기술을, 이제는 서비스를 중지하고 있어 홀가분한 마음으로 공유해 보고자 한다.

'Projects > Information Extraction' 카테고리의 다른 글

Click Price 제안서  (0) 2008.09.16
What is Information Extraction ?  (0) 2008.09.16

 
 
     0   

아이디 
비밀번호 
홈페이지 
비밀글   

 

<<이전 | 1 | ··· | 9 | 10 | 11 | 12 | 13 | 다음>>

꿈꾸는 봄's Blog is powered by Daum